@digital-alchemy/hass 24.9.3 → 24.9.4
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/README.md +4 -1
- package/dist/dynamic.d.ts +1 -1
- package/dist/dynamic.js +7 -2
- package/dist/dynamic.js.map +1 -1
- package/dist/extensions/area.extension.d.ts +2 -12
- package/dist/extensions/area.extension.js +20 -26
- package/dist/extensions/area.extension.js.map +1 -1
- package/dist/extensions/backup.extension.d.ts +2 -7
- package/dist/extensions/backup.extension.js +5 -8
- package/dist/extensions/backup.extension.js.map +1 -1
- package/dist/extensions/call-proxy.extension.d.ts +1 -1
- package/dist/extensions/call-proxy.extension.js +3 -22
- package/dist/extensions/call-proxy.extension.js.map +1 -1
- package/dist/extensions/config.extension.d.ts +2 -6
- package/dist/extensions/config.extension.js +21 -25
- package/dist/extensions/config.extension.js.map +1 -1
- package/dist/extensions/conversation.extension.d.ts +2 -6
- package/dist/extensions/conversation.extension.js +5 -8
- package/dist/extensions/conversation.extension.js.map +1 -1
- package/dist/extensions/device.extension.d.ts +2 -5
- package/dist/extensions/device.extension.js +16 -22
- package/dist/extensions/device.extension.js.map +1 -1
- package/dist/extensions/entity.extension.d.ts +2 -61
- package/dist/extensions/entity.extension.js +42 -83
- package/dist/extensions/entity.extension.js.map +1 -1
- package/dist/extensions/events.extension.d.ts +3 -11
- package/dist/extensions/events.extension.js +8 -11
- package/dist/extensions/events.extension.js.map +1 -1
- package/dist/extensions/fetch-api.extension.d.ts +12 -4
- package/dist/extensions/fetch-api.extension.js +23 -35
- package/dist/extensions/fetch-api.extension.js.map +1 -1
- package/dist/extensions/floor.extension.d.ts +2 -9
- package/dist/extensions/floor.extension.js +17 -23
- package/dist/extensions/floor.extension.js.map +1 -1
- package/dist/extensions/id-by.extension.js +15 -20
- package/dist/extensions/id-by.extension.js.map +1 -1
- package/dist/extensions/index.d.ts +1 -0
- package/dist/extensions/index.js +16 -18
- package/dist/extensions/index.js.map +1 -1
- package/dist/extensions/internal.extension.d.ts +18 -0
- package/dist/extensions/internal.extension.js +102 -0
- package/dist/extensions/internal.extension.js.map +1 -0
- package/dist/extensions/label.extension.d.ts +2 -9
- package/dist/extensions/label.extension.js +17 -23
- package/dist/extensions/label.extension.js.map +1 -1
- package/dist/extensions/reference.extension.d.ts +2 -12
- package/dist/extensions/reference.extension.js +19 -25
- package/dist/extensions/reference.extension.js.map +1 -1
- package/dist/extensions/registry.extension.d.ts +2 -7
- package/dist/extensions/registry.extension.js +1 -4
- package/dist/extensions/registry.extension.js.map +1 -1
- package/dist/extensions/websocket-api.extension.d.ts +3 -78
- package/dist/extensions/websocket-api.extension.js +82 -165
- package/dist/extensions/websocket-api.extension.js.map +1 -1
- package/dist/extensions/zone.extension.d.ts +2 -7
- package/dist/extensions/zone.extension.js +15 -21
- package/dist/extensions/zone.extension.js.map +1 -1
- package/dist/hass.module.d.ts +47 -36
- package/dist/hass.module.js +70 -70
- package/dist/hass.module.js.map +1 -1
- package/dist/helpers/backup.helper.js +1 -2
- package/dist/helpers/constants.helper.js +15 -18
- package/dist/helpers/constants.helper.js.map +1 -1
- package/dist/helpers/device.helper.js +2 -5
- package/dist/helpers/device.helper.js.map +1 -1
- package/dist/helpers/entity-state.helper.d.ts +3 -8
- package/dist/helpers/entity-state.helper.js +1 -8
- package/dist/helpers/entity-state.helper.js.map +1 -1
- package/dist/helpers/features.helper.js +79 -85
- package/dist/helpers/features.helper.js.map +1 -1
- package/dist/helpers/fetch/calendar.js +1 -2
- package/dist/helpers/fetch/configuration.js +2 -5
- package/dist/helpers/fetch/configuration.js.map +1 -1
- package/dist/helpers/fetch/index.js +5 -8
- package/dist/helpers/fetch/index.js.map +1 -1
- package/dist/helpers/fetch/server-log.js +1 -2
- package/dist/helpers/fetch/server-log.js.map +1 -1
- package/dist/helpers/fetch/service-list.js +1 -2
- package/dist/helpers/fetch/weather-forecasts.js +1 -2
- package/dist/helpers/fetch/weather-forecasts.js.map +1 -1
- package/dist/helpers/fetch.helper.d.ts +162 -0
- package/dist/helpers/fetch.helper.js +161 -0
- package/dist/helpers/fetch.helper.js.map +1 -0
- package/dist/helpers/id-by.helper.js +1 -2
- package/dist/helpers/index.d.ts +2 -1
- package/dist/helpers/index.js +13 -15
- package/dist/helpers/index.js.map +1 -1
- package/dist/helpers/interfaces.helper.d.ts +228 -0
- package/dist/helpers/interfaces.helper.js +10 -0
- package/dist/helpers/interfaces.helper.js.map +1 -0
- package/dist/helpers/manifest.helper.d.ts +0 -1
- package/dist/helpers/manifest.helper.js +0 -1
- package/dist/helpers/notify.helper.d.ts +11 -3
- package/dist/helpers/notify.helper.js +1 -2
- package/dist/helpers/registry.js +7 -10
- package/dist/helpers/registry.js.map +1 -1
- package/dist/helpers/utility.helper.d.ts +6 -1
- package/dist/helpers/utility.helper.js +9 -13
- package/dist/helpers/utility.helper.js.map +1 -1
- package/dist/helpers/websocket.helper.d.ts +1 -2
- package/dist/helpers/websocket.helper.js +1 -2
- package/dist/index.js +5 -8
- package/dist/index.js.map +1 -1
- package/dist/mock_assistant/extensions/area.extension.d.ts +8 -0
- package/dist/mock_assistant/extensions/area.extension.js +51 -0
- package/dist/mock_assistant/extensions/area.extension.js.map +1 -0
- package/dist/mock_assistant/extensions/config.extension.d.ts +14 -0
- package/dist/mock_assistant/extensions/config.extension.js +29 -0
- package/dist/mock_assistant/extensions/config.extension.js.map +1 -0
- package/dist/mock_assistant/extensions/device.extension.d.ts +8 -0
- package/dist/mock_assistant/extensions/device.extension.js +33 -0
- package/dist/mock_assistant/extensions/device.extension.js.map +1 -0
- package/dist/mock_assistant/extensions/entity-registry.extension.d.ts +13 -0
- package/dist/mock_assistant/extensions/entity-registry.extension.js +28 -0
- package/dist/mock_assistant/extensions/entity-registry.extension.js.map +1 -0
- package/dist/mock_assistant/extensions/entity.extension.d.ts +30 -0
- package/dist/mock_assistant/extensions/entity.extension.js +77 -0
- package/dist/mock_assistant/extensions/entity.extension.js.map +1 -0
- package/dist/mock_assistant/extensions/events.extension.d.ts +1 -1
- package/dist/mock_assistant/extensions/events.extension.js +3 -6
- package/dist/mock_assistant/extensions/events.extension.js.map +1 -1
- package/dist/mock_assistant/extensions/fetch.extension.d.ts +1 -0
- package/dist/mock_assistant/extensions/fetch.extension.js +4 -0
- package/dist/mock_assistant/extensions/fetch.extension.js.map +1 -0
- package/dist/mock_assistant/extensions/fixtures.extension.d.ts +1 -1
- package/dist/mock_assistant/extensions/fixtures.extension.js +29 -33
- package/dist/mock_assistant/extensions/fixtures.extension.js.map +1 -1
- package/dist/mock_assistant/extensions/floor.extension.d.ts +8 -0
- package/dist/mock_assistant/extensions/floor.extension.js +51 -0
- package/dist/mock_assistant/extensions/floor.extension.js.map +1 -0
- package/dist/mock_assistant/extensions/index.d.ts +10 -0
- package/dist/mock_assistant/extensions/index.js +12 -5
- package/dist/mock_assistant/extensions/index.js.map +1 -1
- package/dist/mock_assistant/extensions/label.extension.d.ts +8 -0
- package/dist/mock_assistant/extensions/label.extension.js +51 -0
- package/dist/mock_assistant/extensions/label.extension.js.map +1 -0
- package/dist/mock_assistant/extensions/services.extension.d.ts +12 -0
- package/dist/mock_assistant/extensions/services.extension.js +20 -0
- package/dist/mock_assistant/extensions/services.extension.js.map +1 -0
- package/dist/mock_assistant/extensions/websocket-api.extension.d.ts +15 -0
- package/dist/mock_assistant/extensions/websocket-api.extension.js +68 -0
- package/dist/mock_assistant/extensions/websocket-api.extension.js.map +1 -0
- package/dist/mock_assistant/extensions/zone.extension.d.ts +8 -0
- package/dist/mock_assistant/extensions/zone.extension.js +51 -0
- package/dist/mock_assistant/extensions/zone.extension.js.map +1 -0
- package/dist/mock_assistant/helpers/fixtures.js +1 -2
- package/dist/mock_assistant/helpers/index.d.ts +0 -1
- package/dist/mock_assistant/helpers/index.js +1 -5
- package/dist/mock_assistant/helpers/index.js.map +1 -1
- package/dist/mock_assistant/index.js +3 -6
- package/dist/mock_assistant/index.js.map +1 -1
- package/dist/mock_assistant/main.js +11 -15
- package/dist/mock_assistant/main.js.map +1 -1
- package/dist/mock_assistant/mock-assistant.module.d.ts +156 -3
- package/dist/mock_assistant/mock-assistant.module.js +56 -11
- package/dist/mock_assistant/mock-assistant.module.js.map +1 -1
- package/dist/quickboot.module.js +5 -8
- package/dist/quickboot.module.js.map +1 -1
- package/dist/testing/area.spec.js +106 -194
- package/dist/testing/area.spec.js.map +1 -1
- package/dist/testing/backup.spec.js +97 -139
- package/dist/testing/backup.spec.js.map +1 -1
- package/dist/testing/config.spec.js +79 -153
- package/dist/testing/config.spec.js.map +1 -1
- package/dist/testing/device.spec.js +35 -69
- package/dist/testing/device.spec.js.map +1 -1
- package/dist/testing/entity.spec.js +94 -149
- package/dist/testing/entity.spec.js.map +1 -1
- package/dist/testing/events.spec.js +33 -57
- package/dist/testing/events.spec.js.map +1 -1
- package/dist/testing/fetch-api.spec.js +242 -427
- package/dist/testing/fetch-api.spec.js.map +1 -1
- package/dist/testing/fixtures.spec.d.ts +1 -0
- package/dist/testing/fixtures.spec.js +150 -0
- package/dist/testing/fixtures.spec.js.map +1 -0
- package/dist/testing/floor.spec.js +106 -194
- package/dist/testing/floor.spec.js.map +1 -1
- package/dist/testing/id-by.spec.js +68 -107
- package/dist/testing/id-by.spec.js.map +1 -1
- package/dist/testing/label.spec.js +106 -194
- package/dist/testing/label.spec.js.map +1 -1
- package/dist/testing/ref-by.spec.js +155 -219
- package/dist/testing/ref-by.spec.js.map +1 -1
- package/dist/testing/websocket.spec.d.ts +1 -8
- package/dist/testing/websocket.spec.js +35 -50
- package/dist/testing/websocket.spec.js.map +1 -1
- package/dist/testing/workflow.spec.js +82 -81
- package/dist/testing/workflow.spec.js.map +1 -1
- package/dist/testing/zone.spec.js +61 -113
- package/dist/testing/zone.spec.js.map +1 -1
- package/package.json +56 -40
- package/dist/helpers/metrics.helper.d.ts +0 -29
- package/dist/helpers/metrics.helper.js +0 -62
- package/dist/helpers/metrics.helper.js.map +0 -1
- package/dist/mock_assistant/helpers/utils.d.ts +0 -4
- package/dist/mock_assistant/helpers/utils.js +0 -57
- package/dist/mock_assistant/helpers/utils.js.map +0 -1
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { TContext } from "@digital-alchemy/core";
|
|
2
|
+
import { MergeExclusive } from "type-fest";
|
|
3
|
+
/**
|
|
4
|
+
* Defines the types of parameters that can be used in fetch requests.
|
|
5
|
+
*/
|
|
6
|
+
export type FetchParameterTypes = string | boolean | Date | number | Array<string | Date | number>;
|
|
7
|
+
/**
|
|
8
|
+
* Enumerates HTTP methods used in fetch requests.
|
|
9
|
+
*/
|
|
10
|
+
export declare enum HTTP_METHODS {
|
|
11
|
+
get = "get",
|
|
12
|
+
delete = "delete",
|
|
13
|
+
put = "put",
|
|
14
|
+
patch = "patch",
|
|
15
|
+
post = "post"
|
|
16
|
+
}
|
|
17
|
+
type NoBodyMethods = "get" | "delete";
|
|
18
|
+
type BodyMethods = "put" | "patch" | "post";
|
|
19
|
+
/**
|
|
20
|
+
* Represents a fetch request with additional properties and body content.
|
|
21
|
+
*/
|
|
22
|
+
export type FetchWith<EXTRA extends Record<never, string> = Record<never, string>, BODY extends TFetchBody = undefined> = Partial<FetchArguments<BODY>> & EXTRA;
|
|
23
|
+
export type FetchProcessTypes = boolean | "text" | "json" | "raw" | undefined;
|
|
24
|
+
type BaseFetchArguments = {
|
|
25
|
+
/**
|
|
26
|
+
* Headers to append
|
|
27
|
+
*/
|
|
28
|
+
headers?: Record<string, string>;
|
|
29
|
+
/**
|
|
30
|
+
* Query params to send
|
|
31
|
+
*/
|
|
32
|
+
params?: Record<string, FetchParameterTypes>;
|
|
33
|
+
/**
|
|
34
|
+
* Built in post-processing
|
|
35
|
+
*
|
|
36
|
+
* - true / "json" = attempt to decode as json
|
|
37
|
+
* - false / "raw" = return the node-fetch response object without processing
|
|
38
|
+
* - "text" = return result as text, no additional processing
|
|
39
|
+
*
|
|
40
|
+
* ? boolean values are deprecated
|
|
41
|
+
*/
|
|
42
|
+
process?: FetchProcessTypes;
|
|
43
|
+
};
|
|
44
|
+
export type MaybeHttpError = {
|
|
45
|
+
error: string;
|
|
46
|
+
message: string;
|
|
47
|
+
statusCode: number;
|
|
48
|
+
};
|
|
49
|
+
type BaseFetchUrl = {
|
|
50
|
+
/**
|
|
51
|
+
* URL to send request to
|
|
52
|
+
*/
|
|
53
|
+
url: string;
|
|
54
|
+
} & MergeExclusive<{
|
|
55
|
+
/**
|
|
56
|
+
* Frequently filled in by wrapper services
|
|
57
|
+
*/
|
|
58
|
+
baseUrl?: string;
|
|
59
|
+
}, {
|
|
60
|
+
/**
|
|
61
|
+
* URL is the full path (includes http://...)
|
|
62
|
+
*
|
|
63
|
+
* Ignores baseUrl if set
|
|
64
|
+
*/
|
|
65
|
+
rawUrl?: boolean;
|
|
66
|
+
}>;
|
|
67
|
+
type BaseFetchBody<BODY extends TFetchBody = undefined> = MergeExclusive<{
|
|
68
|
+
/**
|
|
69
|
+
* POSTDATA
|
|
70
|
+
*/
|
|
71
|
+
body?: BODY;
|
|
72
|
+
/**
|
|
73
|
+
* HTTP method
|
|
74
|
+
*/
|
|
75
|
+
method: BodyMethods;
|
|
76
|
+
}, {
|
|
77
|
+
/**
|
|
78
|
+
* HTTP method
|
|
79
|
+
*/
|
|
80
|
+
method?: NoBodyMethods;
|
|
81
|
+
}>;
|
|
82
|
+
/**
|
|
83
|
+
* Defines the structure and types for arguments passed to fetch requests.
|
|
84
|
+
*/
|
|
85
|
+
export type FetchArguments<BODY extends TFetchBody = undefined> = BaseFetchUrl & BaseFetchArguments & BaseFetchBody<BODY>;
|
|
86
|
+
/**
|
|
87
|
+
* Represents a subset of FetchArguments for specific use cases.
|
|
88
|
+
*/
|
|
89
|
+
export type FilteredFetchArguments<BODY extends TFetchBody = undefined> = BaseFetchBody<BODY> & Pick<BaseFetchUrl, "url"> & Pick<BaseFetchArguments, "process" | "params">;
|
|
90
|
+
/**
|
|
91
|
+
* Same thing as FetchWith, but the function doesn't need any args
|
|
92
|
+
*
|
|
93
|
+
* This is a work around, for some reason the default value approach isn't work as I had hoped
|
|
94
|
+
*/
|
|
95
|
+
export type BaseFetch = Partial<FetchArguments>;
|
|
96
|
+
/**
|
|
97
|
+
* Defines the types of values that can be used in filter operations.
|
|
98
|
+
*/
|
|
99
|
+
export type FilterValueType = string | boolean | number | Date | RegExp | Record<string, string>;
|
|
100
|
+
/**
|
|
101
|
+
* Enumerates the types of operations available for data filtering.
|
|
102
|
+
*/
|
|
103
|
+
export declare enum FILTER_OPERATIONS {
|
|
104
|
+
elem = "elem",
|
|
105
|
+
regex = "regex",
|
|
106
|
+
in = "in",
|
|
107
|
+
nin = "nin",
|
|
108
|
+
lt = "lt",
|
|
109
|
+
lte = "lte",
|
|
110
|
+
gt = "gt",
|
|
111
|
+
gte = "gte",
|
|
112
|
+
exists = "exists",
|
|
113
|
+
empty = "empty",
|
|
114
|
+
ne = "ne",
|
|
115
|
+
eq = "eq"
|
|
116
|
+
}
|
|
117
|
+
export interface ComparisonDTO {
|
|
118
|
+
operation?: FILTER_OPERATIONS | `${FILTER_OPERATIONS}`;
|
|
119
|
+
value?: FilterValueType | FilterValueType[];
|
|
120
|
+
}
|
|
121
|
+
export interface Filter<FIELDS = string> extends ComparisonDTO {
|
|
122
|
+
empty?: boolean;
|
|
123
|
+
exists?: boolean;
|
|
124
|
+
field?: FIELDS;
|
|
125
|
+
}
|
|
126
|
+
export interface ResultControl {
|
|
127
|
+
filters?: Set<Filter>;
|
|
128
|
+
limit?: number;
|
|
129
|
+
select?: string[];
|
|
130
|
+
skip?: number;
|
|
131
|
+
sort?: string[];
|
|
132
|
+
}
|
|
133
|
+
export declare function controlToQuery(value: Readonly<ResultControl>): Record<string, string>;
|
|
134
|
+
export declare function buildFilter(key: string, value: FilterValueType | FilterValueType[]): Filter;
|
|
135
|
+
export declare function queryToControl(value: Readonly<Record<string, string>>): ResultControl;
|
|
136
|
+
/**
|
|
137
|
+
* Properties that alter the way that fetcher works.
|
|
138
|
+
*/
|
|
139
|
+
export type FetcherOptions = {
|
|
140
|
+
/**
|
|
141
|
+
* typically domain names with scheme, added to the front of urls if the individual request doesn't override
|
|
142
|
+
*/
|
|
143
|
+
baseUrl?: string;
|
|
144
|
+
/**
|
|
145
|
+
* merged into every request
|
|
146
|
+
*/
|
|
147
|
+
headers?: Record<string, string>;
|
|
148
|
+
/**
|
|
149
|
+
* Alter the context attached to the log statements emitted from the fetcher
|
|
150
|
+
*/
|
|
151
|
+
context?: TContext;
|
|
152
|
+
};
|
|
153
|
+
export type DownloadOptions<BODY extends TFetchBody = undefined> = Partial<FetchArguments<BODY>> & {
|
|
154
|
+
destination: string;
|
|
155
|
+
};
|
|
156
|
+
export declare function fetchCast(item: FetchParameterTypes): string;
|
|
157
|
+
export type TFetchBody = object | undefined;
|
|
158
|
+
export declare function buildFilterString(fetchWith: FetchWith<{
|
|
159
|
+
filters?: Readonly<ResultControl>;
|
|
160
|
+
params?: Record<string, FetchParameterTypes>;
|
|
161
|
+
}>): string;
|
|
162
|
+
export {};
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { is } from "@digital-alchemy/core";
|
|
2
|
+
/**
|
|
3
|
+
* Enumerates HTTP methods used in fetch requests.
|
|
4
|
+
*/
|
|
5
|
+
export var HTTP_METHODS;
|
|
6
|
+
(function (HTTP_METHODS) {
|
|
7
|
+
HTTP_METHODS["get"] = "get";
|
|
8
|
+
HTTP_METHODS["delete"] = "delete";
|
|
9
|
+
HTTP_METHODS["put"] = "put";
|
|
10
|
+
HTTP_METHODS["patch"] = "patch";
|
|
11
|
+
HTTP_METHODS["post"] = "post";
|
|
12
|
+
})(HTTP_METHODS || (HTTP_METHODS = {}));
|
|
13
|
+
/**
|
|
14
|
+
* Enumerates the types of operations available for data filtering.
|
|
15
|
+
*/
|
|
16
|
+
export var FILTER_OPERATIONS;
|
|
17
|
+
(function (FILTER_OPERATIONS) {
|
|
18
|
+
// "elemMatch" functionality in mongo
|
|
19
|
+
// eslint-disable-next-line unicorn/prevent-abbreviations
|
|
20
|
+
FILTER_OPERATIONS["elem"] = "elem";
|
|
21
|
+
FILTER_OPERATIONS["regex"] = "regex";
|
|
22
|
+
FILTER_OPERATIONS["in"] = "in";
|
|
23
|
+
FILTER_OPERATIONS["nin"] = "nin";
|
|
24
|
+
FILTER_OPERATIONS["lt"] = "lt";
|
|
25
|
+
FILTER_OPERATIONS["lte"] = "lte";
|
|
26
|
+
FILTER_OPERATIONS["gt"] = "gt";
|
|
27
|
+
FILTER_OPERATIONS["gte"] = "gte";
|
|
28
|
+
FILTER_OPERATIONS["exists"] = "exists";
|
|
29
|
+
FILTER_OPERATIONS["empty"] = "empty";
|
|
30
|
+
FILTER_OPERATIONS["ne"] = "ne";
|
|
31
|
+
FILTER_OPERATIONS["eq"] = "eq";
|
|
32
|
+
})(FILTER_OPERATIONS || (FILTER_OPERATIONS = {}));
|
|
33
|
+
export function controlToQuery(value) {
|
|
34
|
+
const out = new Map();
|
|
35
|
+
if (value?.limit) {
|
|
36
|
+
out.set("limit", value.limit.toString());
|
|
37
|
+
}
|
|
38
|
+
if (value?.skip) {
|
|
39
|
+
out.set("skip", value.skip.toString());
|
|
40
|
+
}
|
|
41
|
+
if (value?.sort) {
|
|
42
|
+
out.set("sort", value.sort.join(","));
|
|
43
|
+
}
|
|
44
|
+
if (value?.select) {
|
|
45
|
+
out.set("select", value.select.join(","));
|
|
46
|
+
}
|
|
47
|
+
value?.filters?.forEach(f => {
|
|
48
|
+
let field = f.field;
|
|
49
|
+
if (f.operation && f.operation !== FILTER_OPERATIONS.eq) {
|
|
50
|
+
field = `${field}__${f.operation}`;
|
|
51
|
+
}
|
|
52
|
+
let value = f.value;
|
|
53
|
+
if (is.array(value)) {
|
|
54
|
+
value = value.join(",");
|
|
55
|
+
}
|
|
56
|
+
if (value instanceof Date) {
|
|
57
|
+
value = value.toISOString();
|
|
58
|
+
}
|
|
59
|
+
if (value === null) {
|
|
60
|
+
value = "null";
|
|
61
|
+
}
|
|
62
|
+
if (field) {
|
|
63
|
+
out.set(field, String(value) ?? "");
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
return Object.fromEntries(out.entries());
|
|
67
|
+
}
|
|
68
|
+
export function buildFilter(key, value) {
|
|
69
|
+
const [name, operation] = key.split("__");
|
|
70
|
+
switch (operation) {
|
|
71
|
+
case "in":
|
|
72
|
+
case "nin":
|
|
73
|
+
if (!is.array(value)) {
|
|
74
|
+
value = is.string(value) ? value.split(",") : [value];
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
field: name,
|
|
78
|
+
operation,
|
|
79
|
+
value: value,
|
|
80
|
+
};
|
|
81
|
+
case "elem":
|
|
82
|
+
return {
|
|
83
|
+
field: name,
|
|
84
|
+
operation,
|
|
85
|
+
value: is.string(value) ? JSON.parse(value) : value,
|
|
86
|
+
};
|
|
87
|
+
default:
|
|
88
|
+
return {
|
|
89
|
+
field: name,
|
|
90
|
+
operation,
|
|
91
|
+
value,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
export function queryToControl(value) {
|
|
96
|
+
const filters = new Set();
|
|
97
|
+
const out = { filters };
|
|
98
|
+
const parameters = new Map(Object.entries(value));
|
|
99
|
+
parameters.forEach((value, key) => {
|
|
100
|
+
const [name, operation] = key.split("__");
|
|
101
|
+
switch (key) {
|
|
102
|
+
case "select":
|
|
103
|
+
out.select = value.split(",");
|
|
104
|
+
return;
|
|
105
|
+
case "sort":
|
|
106
|
+
out.sort = value.split(",");
|
|
107
|
+
return;
|
|
108
|
+
case "limit":
|
|
109
|
+
out.limit = Number(value);
|
|
110
|
+
return;
|
|
111
|
+
case "skip":
|
|
112
|
+
out.skip = Number(value);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
switch (operation) {
|
|
116
|
+
case "in":
|
|
117
|
+
case "nin":
|
|
118
|
+
filters.add({
|
|
119
|
+
field: name,
|
|
120
|
+
operation,
|
|
121
|
+
value: value.split(","),
|
|
122
|
+
});
|
|
123
|
+
return;
|
|
124
|
+
case "elem":
|
|
125
|
+
filters.add({
|
|
126
|
+
field: name,
|
|
127
|
+
operation,
|
|
128
|
+
value: JSON.parse(value),
|
|
129
|
+
});
|
|
130
|
+
return;
|
|
131
|
+
default:
|
|
132
|
+
filters.add({
|
|
133
|
+
field: name,
|
|
134
|
+
operation,
|
|
135
|
+
value,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
return out;
|
|
140
|
+
}
|
|
141
|
+
export function fetchCast(item) {
|
|
142
|
+
if (is.array(item)) {
|
|
143
|
+
return item.map(i => fetchCast(i)).join(",");
|
|
144
|
+
}
|
|
145
|
+
if (item instanceof Date) {
|
|
146
|
+
return item.toISOString();
|
|
147
|
+
}
|
|
148
|
+
if (is.number(item)) {
|
|
149
|
+
return item.toString();
|
|
150
|
+
}
|
|
151
|
+
if (is.boolean(item)) {
|
|
152
|
+
return item ? "true" : "false";
|
|
153
|
+
}
|
|
154
|
+
return item;
|
|
155
|
+
}
|
|
156
|
+
export function buildFilterString(fetchWith) {
|
|
157
|
+
return new URLSearchParams({
|
|
158
|
+
...Object.fromEntries(Object.entries(fetchWith.params ?? {}).map(([label, value]) => [label, fetchCast(value)])),
|
|
159
|
+
}).toString();
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=fetch.helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.helper.js","sourceRoot":"","sources":["../../src/helpers/fetch.helper.ts"],"names":[],"mappings":"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"}
|
package/dist/helpers/index.d.ts
CHANGED
|
@@ -4,8 +4,9 @@ export * from "./device.helper";
|
|
|
4
4
|
export * from "./entity-state.helper";
|
|
5
5
|
export * from "./features.helper";
|
|
6
6
|
export * from "./fetch";
|
|
7
|
+
export * from "./fetch.helper";
|
|
7
8
|
export * from "./id-by.helper";
|
|
8
|
-
export * from "./
|
|
9
|
+
export * from "./interfaces.helper";
|
|
9
10
|
export * from "./notify.helper";
|
|
10
11
|
export * from "./registry";
|
|
11
12
|
export * from "./utility.helper";
|
package/dist/helpers/index.js
CHANGED
|
@@ -1,16 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
tslib_1.__exportStar(require("./utility.helper"), exports);
|
|
15
|
-
tslib_1.__exportStar(require("./websocket.helper"), exports);
|
|
1
|
+
export * from "./backup.helper";
|
|
2
|
+
export * from "./constants.helper";
|
|
3
|
+
export * from "./device.helper";
|
|
4
|
+
export * from "./entity-state.helper";
|
|
5
|
+
export * from "./features.helper";
|
|
6
|
+
export * from "./fetch";
|
|
7
|
+
export * from "./fetch.helper";
|
|
8
|
+
export * from "./id-by.helper";
|
|
9
|
+
export * from "./interfaces.helper";
|
|
10
|
+
export * from "./notify.helper";
|
|
11
|
+
export * from "./registry";
|
|
12
|
+
export * from "./utility.helper";
|
|
13
|
+
export * from "./websocket.helper";
|
|
16
14
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { TBlackHole } from "@digital-alchemy/core";
|
|
2
|
+
import EventEmitter from "events";
|
|
3
|
+
import WS from "ws";
|
|
4
|
+
import { iCallService, TAreaId, TDeviceId, TFloorId, TLabelId, TPlatformId, TRawDomains, TRawEntityIds, TUniqueId, TUniqueIDMapping } from "../dynamic";
|
|
5
|
+
import { BackupResponse, HomeAssistantBackup } from "./backup.helper";
|
|
6
|
+
import { DeviceDetails } from "./device.helper";
|
|
7
|
+
import { ByIdProxy } from "./entity-state.helper";
|
|
8
|
+
import { AreaCreate, AreaDetails, ConfigEntry, HassConfig, HassServiceDTO } from "./fetch";
|
|
9
|
+
import { EditAliasOptions, EditLabelOptions, EntityRegistryItem, FloorCreate, FloorDetails, LabelDefinition, LabelOptions, ManifestItem, ToggleExpose, UpdateCoreOptions, ZoneDetails, ZoneOptions } from "./registry";
|
|
10
|
+
import { ALL_DOMAINS, ALL_SERVICE_DOMAINS, ANY_ENTITY, ENTITY_STATE, PICK_ENTITY, PICK_FROM_AREA, PICK_FROM_DEVICE, PICK_FROM_FLOOR, PICK_FROM_LABEL, PICK_FROM_PLATFORM } from "./utility.helper";
|
|
11
|
+
import { EntityHistoryDTO, EntityHistoryResult, OnHassEventOptions, SocketMessageDTO, SocketSubscribeOptions } from "./websocket.helper";
|
|
12
|
+
export type HassAreaService = {
|
|
13
|
+
apply: (area: TAreaId, entities: ANY_ENTITY[]) => Promise<{
|
|
14
|
+
updated: ANY_ENTITY[];
|
|
15
|
+
}>;
|
|
16
|
+
create: (details: AreaCreate) => Promise<void>;
|
|
17
|
+
current: AreaDetails[];
|
|
18
|
+
delete: (area_id: TAreaId) => Promise<void>;
|
|
19
|
+
list: () => Promise<AreaDetails[]>;
|
|
20
|
+
update: (details: AreaDetails) => Promise<void>;
|
|
21
|
+
};
|
|
22
|
+
export type HassZoneService = {
|
|
23
|
+
create: (options: ZoneOptions) => Promise<void>;
|
|
24
|
+
current: ZoneDetails[];
|
|
25
|
+
list: () => Promise<ZoneDetails[]>;
|
|
26
|
+
update: (zone_id: string, options: ZoneOptions) => Promise<void>;
|
|
27
|
+
};
|
|
28
|
+
export type HassLabelService = {
|
|
29
|
+
create: (details: LabelOptions) => Promise<void>;
|
|
30
|
+
current: LabelDefinition[];
|
|
31
|
+
delete: (label_id: TLabelId) => Promise<void>;
|
|
32
|
+
list: () => Promise<LabelDefinition[]>;
|
|
33
|
+
update: (details: LabelDefinition) => Promise<void>;
|
|
34
|
+
};
|
|
35
|
+
export type HassBackupService = {
|
|
36
|
+
download: (slug: string, destination: string) => Promise<void>;
|
|
37
|
+
generate: () => Promise<HomeAssistantBackup>;
|
|
38
|
+
list: () => Promise<BackupResponse>;
|
|
39
|
+
remove: (slug: string) => Promise<void>;
|
|
40
|
+
};
|
|
41
|
+
export type HassConfigService = {
|
|
42
|
+
getServices: () => HassServiceDTO[];
|
|
43
|
+
isService: <DOMAIN extends ALL_SERVICE_DOMAINS>(domain: DOMAIN, service: string) => service is Extract<keyof iCallService[DOMAIN], string>;
|
|
44
|
+
loadServiceList: (recursion?: number) => Promise<void>;
|
|
45
|
+
};
|
|
46
|
+
export type HassWebsocketAPI = {
|
|
47
|
+
/**
|
|
48
|
+
* @internal
|
|
49
|
+
*/
|
|
50
|
+
attachScheduledFunctions: () => void;
|
|
51
|
+
connection: WS;
|
|
52
|
+
/**
|
|
53
|
+
* the current state of the websocket
|
|
54
|
+
*/
|
|
55
|
+
connectionState: ConnectionState;
|
|
56
|
+
/**
|
|
57
|
+
* can override as part of unit tests
|
|
58
|
+
*/
|
|
59
|
+
createConnection: (url: string) => WS;
|
|
60
|
+
/**
|
|
61
|
+
* Convenient wrapper for sendMessage
|
|
62
|
+
*/
|
|
63
|
+
fireEvent: (event_type: string, event_data?: object) => Promise<unknown>;
|
|
64
|
+
/**
|
|
65
|
+
* Set up a new websocket connection to home assistant
|
|
66
|
+
*
|
|
67
|
+
* This doesn't normally need to be called by applications, the extension self manages
|
|
68
|
+
*/
|
|
69
|
+
init: () => Promise<void>;
|
|
70
|
+
/**
|
|
71
|
+
* run a callback when the socket finishes (re)connecting
|
|
72
|
+
*/
|
|
73
|
+
onConnect: (callback: () => TBlackHole) => void;
|
|
74
|
+
/**
|
|
75
|
+
* Attach to the incoming stream of socket events. Do your own filtering and processing from there
|
|
76
|
+
*
|
|
77
|
+
* Returns removal function
|
|
78
|
+
*/
|
|
79
|
+
onEvent: <DATA extends object>({ context, event, once, exec, }: OnHassEventOptions<DATA>) => () => void;
|
|
80
|
+
/**
|
|
81
|
+
* @internal
|
|
82
|
+
*
|
|
83
|
+
* for unit testing
|
|
84
|
+
*/
|
|
85
|
+
onMessage: (message: SocketMessageDTO) => Promise<void>;
|
|
86
|
+
/**
|
|
87
|
+
* when true:
|
|
88
|
+
* - outgoing socket messages are blocked
|
|
89
|
+
* - entities don't emit updates
|
|
90
|
+
*/
|
|
91
|
+
pauseMessages: boolean;
|
|
92
|
+
/**
|
|
93
|
+
* Send a message to home assistant via the socket connection
|
|
94
|
+
*
|
|
95
|
+
* Applications probably want a higher level function than this
|
|
96
|
+
*/
|
|
97
|
+
sendMessage: <RESPONSE_VALUE extends unknown = unknown>(data: {
|
|
98
|
+
type: string;
|
|
99
|
+
id?: number;
|
|
100
|
+
[key: string]: unknown;
|
|
101
|
+
}, waitForResponse?: boolean, subscription?: () => void) => Promise<RESPONSE_VALUE>;
|
|
102
|
+
/**
|
|
103
|
+
* internal
|
|
104
|
+
*/
|
|
105
|
+
setConnectionState: (state: ConnectionState) => void;
|
|
106
|
+
/**
|
|
107
|
+
* internal
|
|
108
|
+
*/
|
|
109
|
+
socketEvents: EventEmitter;
|
|
110
|
+
/**
|
|
111
|
+
* Subscribe to hass core registry updates.
|
|
112
|
+
*
|
|
113
|
+
* Not the same as `onEvent` (you probably want that)
|
|
114
|
+
*/
|
|
115
|
+
subscribe: <EVENT extends string>({ event_type, context, exec, }: SocketSubscribeOptions<EVENT>) => Promise<void>;
|
|
116
|
+
/**
|
|
117
|
+
* remove the current socket connection to home assistant
|
|
118
|
+
*
|
|
119
|
+
* will need to call init() again to start up
|
|
120
|
+
*/
|
|
121
|
+
teardown: () => Promise<void>;
|
|
122
|
+
waitForReply: (id: number, data: object, sentAt: Date) => Promise<void>;
|
|
123
|
+
};
|
|
124
|
+
export declare enum WebsocketConnectionState {
|
|
125
|
+
offline = 1,
|
|
126
|
+
connecting = 2,
|
|
127
|
+
connected = 3,
|
|
128
|
+
unknown = 4,
|
|
129
|
+
invalid = 5
|
|
130
|
+
}
|
|
131
|
+
export type ConnectionState = `${keyof typeof WebsocketConnectionState}`;
|
|
132
|
+
export type HassConversationService = {
|
|
133
|
+
addAlias: (options: EditAliasOptions) => Promise<void>;
|
|
134
|
+
removeAlias: (options: EditAliasOptions) => Promise<void>;
|
|
135
|
+
setConversational: (options: ToggleExpose) => Promise<void>;
|
|
136
|
+
};
|
|
137
|
+
export type HassDeviceService = {
|
|
138
|
+
current: DeviceDetails[];
|
|
139
|
+
list: () => Promise<DeviceDetails[]>;
|
|
140
|
+
};
|
|
141
|
+
export type HassEntityManagerRegistry = {
|
|
142
|
+
addLabel: ({ entity, label }: EditLabelOptions) => Promise<void>;
|
|
143
|
+
current: EntityRegistryItem<TRawEntityIds>[];
|
|
144
|
+
get: <ENTITY extends ANY_ENTITY>(entity_id: ENTITY) => Promise<EntityRegistryItem<ENTITY>>;
|
|
145
|
+
list: () => Promise<EntityRegistryItem<TRawEntityIds>[]>;
|
|
146
|
+
registryList: () => Promise<EntityRegistryItem<TRawEntityIds>[]>;
|
|
147
|
+
removeEntity: (entity_id: ANY_ENTITY | ANY_ENTITY[]) => Promise<void>;
|
|
148
|
+
removeLabel: ({ entity, label }: EditLabelOptions) => Promise<void>;
|
|
149
|
+
source: () => Promise<Record<TRawEntityIds, {
|
|
150
|
+
domain: string;
|
|
151
|
+
}>>;
|
|
152
|
+
};
|
|
153
|
+
export type TMasterState = {
|
|
154
|
+
[DOMAIN in ALL_DOMAINS]: Record<string, ENTITY_STATE<PICK_ENTITY<DOMAIN>>>;
|
|
155
|
+
};
|
|
156
|
+
export type HassEntityManager = {
|
|
157
|
+
/**
|
|
158
|
+
* Internal library use only
|
|
159
|
+
*/
|
|
160
|
+
_entityUpdateReceiver: <ENTITY extends ANY_ENTITY = TRawEntityIds>(entity_id: ENTITY, new_state: ENTITY_STATE<ENTITY>, old_state: ENTITY_STATE<ENTITY>) => void;
|
|
161
|
+
_masterState: () => Partial<TMasterState>;
|
|
162
|
+
/**
|
|
163
|
+
* Retrieves the current state of a given entity. This method returns
|
|
164
|
+
* raw data, offering a direct view of the entity's state at a given moment.
|
|
165
|
+
*/
|
|
166
|
+
getCurrentState: <ENTITY_ID extends ANY_ENTITY>(entity_id: ENTITY_ID) => ENTITY_STATE<ENTITY_ID>;
|
|
167
|
+
/**
|
|
168
|
+
* Retrieves the historical state data of entities over a specified time
|
|
169
|
+
* period. Useful for analysis or tracking changes over time.
|
|
170
|
+
*/
|
|
171
|
+
history: <ENTITES extends ANY_ENTITY[]>(payload: Omit<EntityHistoryDTO<ENTITES>, "type">) => Promise<{
|
|
172
|
+
[k: string]: EntityHistoryResult[];
|
|
173
|
+
}>;
|
|
174
|
+
/**
|
|
175
|
+
* Provides a simple listing of all entity IDs. Useful for enumeration
|
|
176
|
+
* and quick reference to all available entities.
|
|
177
|
+
*/
|
|
178
|
+
listEntities: <DOMAIN extends ALL_DOMAINS = TRawDomains>(domain?: DOMAIN) => PICK_ENTITY<DOMAIN>[];
|
|
179
|
+
/**
|
|
180
|
+
* Returns the previous entity state (not a proxy)
|
|
181
|
+
*/
|
|
182
|
+
previousState: (entity_id: ANY_ENTITY) => ENTITY_STATE<TRawEntityIds>;
|
|
183
|
+
/**
|
|
184
|
+
* Initiates a refresh of the current entity states. Useful for ensuring
|
|
185
|
+
* synchronization with the latest state data from Home Assistant.
|
|
186
|
+
*/
|
|
187
|
+
refresh: (recursion?: number) => Promise<void>;
|
|
188
|
+
/**
|
|
189
|
+
* Interact with the entity registry
|
|
190
|
+
*/
|
|
191
|
+
registry: HassEntityManagerRegistry;
|
|
192
|
+
/**
|
|
193
|
+
* @internal
|
|
194
|
+
*/
|
|
195
|
+
warnEarly: (method: string) => void;
|
|
196
|
+
};
|
|
197
|
+
export type SimpleCallback = () => TBlackHole;
|
|
198
|
+
export type HassEventsService = {
|
|
199
|
+
onAreaRegistryUpdate: (callback: SimpleCallback) => void;
|
|
200
|
+
onDeviceRegistryUpdate: (callback: SimpleCallback) => void;
|
|
201
|
+
onEntityRegistryUpdate: (callback: SimpleCallback) => void;
|
|
202
|
+
onFloorRegistryUpdate: (callback: SimpleCallback) => void;
|
|
203
|
+
onLabelRegistryUpdate: (callback: SimpleCallback) => void;
|
|
204
|
+
onZoneRegistryUpdate: (callback: SimpleCallback) => void;
|
|
205
|
+
};
|
|
206
|
+
export type HassFloorService = {
|
|
207
|
+
create(details: FloorCreate): Promise<void>;
|
|
208
|
+
current: FloorDetails[];
|
|
209
|
+
delete(floor_id: TFloorId): Promise<void>;
|
|
210
|
+
list(): Promise<FloorDetails[]>;
|
|
211
|
+
update(details: FloorDetails): Promise<void>;
|
|
212
|
+
};
|
|
213
|
+
export type HassReferenceService = {
|
|
214
|
+
area: <AREA extends TAreaId, DOMAINS extends TRawDomains = TRawDomains>(area: AREA, ...domains: DOMAINS[]) => ByIdProxy<PICK_FROM_AREA<AREA, DOMAINS>>[];
|
|
215
|
+
device: <DEVICE extends TDeviceId, DOMAINS extends TRawDomains = TRawDomains>(device: DEVICE, ...domains: DOMAINS[]) => ByIdProxy<PICK_FROM_DEVICE<DEVICE, DOMAINS>>[];
|
|
216
|
+
domain: <DOMAIN extends TRawDomains = TRawDomains>(domain: DOMAIN) => ByIdProxy<PICK_ENTITY<DOMAIN>>[];
|
|
217
|
+
floor: <FLOOR extends TFloorId, DOMAINS extends TRawDomains = TRawDomains>(floor: FLOOR, ...domains: DOMAINS[]) => ByIdProxy<PICK_FROM_FLOOR<FLOOR, DOMAINS>>[];
|
|
218
|
+
id: <ENTITY_ID extends ANY_ENTITY>(entity_id: ENTITY_ID) => ByIdProxy<ENTITY_ID>;
|
|
219
|
+
label: <LABEL extends TLabelId, DOMAINS extends TRawDomains = TRawDomains>(label: LABEL, ...domains: DOMAINS[]) => ByIdProxy<PICK_FROM_LABEL<LABEL, DOMAINS>>[];
|
|
220
|
+
platform: <PLATFORM extends TPlatformId, DOMAINS extends TRawDomains = TRawDomains>(platform: PLATFORM, ...domains: DOMAINS[]) => ByIdProxy<PICK_FROM_PLATFORM<PLATFORM, DOMAINS>>[];
|
|
221
|
+
unique_id: <UNIQUE_ID extends TUniqueId, ENTITY_ID extends Extract<TUniqueIDMapping[UNIQUE_ID], ANY_ENTITY> = Extract<TUniqueIDMapping[UNIQUE_ID], ANY_ENTITY>>(unique_id: UNIQUE_ID) => ByIdProxy<ENTITY_ID>;
|
|
222
|
+
};
|
|
223
|
+
export type HassRegistryService = {
|
|
224
|
+
getConfig: () => Promise<HassConfig>;
|
|
225
|
+
getConfigEntries: () => Promise<ConfigEntry[]>;
|
|
226
|
+
manifestList: () => Promise<ManifestItem[]>;
|
|
227
|
+
updateCore: (options: UpdateCoreOptions) => Promise<void>;
|
|
228
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-magic-numbers */
|
|
2
|
+
export var WebsocketConnectionState;
|
|
3
|
+
(function (WebsocketConnectionState) {
|
|
4
|
+
WebsocketConnectionState[WebsocketConnectionState["offline"] = 1] = "offline";
|
|
5
|
+
WebsocketConnectionState[WebsocketConnectionState["connecting"] = 2] = "connecting";
|
|
6
|
+
WebsocketConnectionState[WebsocketConnectionState["connected"] = 3] = "connected";
|
|
7
|
+
WebsocketConnectionState[WebsocketConnectionState["unknown"] = 4] = "unknown";
|
|
8
|
+
WebsocketConnectionState[WebsocketConnectionState["invalid"] = 5] = "invalid";
|
|
9
|
+
})(WebsocketConnectionState || (WebsocketConnectionState = {}));
|
|
10
|
+
//# sourceMappingURL=interfaces.helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.helper.js","sourceRoot":"","sources":["../../src/helpers/interfaces.helper.ts"],"names":[],"mappings":"AA+LA,wDAAwD;AACxD,MAAM,CAAN,IAAY,wBAMX;AAND,WAAY,wBAAwB;IAClC,6EAAW,CAAA;IACX,mFAAc,CAAA;IACd,iFAAa,CAAA;IACb,6EAAW,CAAA;IACX,6EAAW,CAAA;AACb,CAAC,EANW,wBAAwB,KAAxB,wBAAwB,QAMnC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -4,8 +4,10 @@ export type AppleNotificationPush = {
|
|
|
4
4
|
*
|
|
5
5
|
* The sound to play for the notification.
|
|
6
6
|
* [More info](https://companion.home-assistant.io/docs/notifications/notifications-basic#sounds)
|
|
7
|
+
*
|
|
8
|
+
* > default: "none"
|
|
7
9
|
*/
|
|
8
|
-
sound?:
|
|
10
|
+
sound?: string;
|
|
9
11
|
/**
|
|
10
12
|
* **iOS | MacOS**
|
|
11
13
|
*
|
|
@@ -31,9 +33,15 @@ export type AppleNotificationPush = {
|
|
|
31
33
|
export type NotificationAction = {
|
|
32
34
|
/**
|
|
33
35
|
* Key passed back in events.
|
|
36
|
+
*
|
|
37
|
+
* ## REPLY
|
|
38
|
+
*
|
|
34
39
|
* When set to `REPLY`, you will be prompted for text to send with the event.
|
|
40
|
+
*
|
|
41
|
+
* ## URI
|
|
42
|
+
*
|
|
35
43
|
*/
|
|
36
|
-
action:
|
|
44
|
+
action: string;
|
|
37
45
|
/**
|
|
38
46
|
* Shown on the action button to the user.
|
|
39
47
|
*/
|
|
@@ -44,7 +52,7 @@ export type NotificationAction = {
|
|
|
44
52
|
*/
|
|
45
53
|
uri?: string;
|
|
46
54
|
};
|
|
47
|
-
export type AndroidNotificationActionOptions =
|
|
55
|
+
export type AndroidNotificationActionOptions = Record<string, unknown>;
|
|
48
56
|
export type AppleNotificationActionOptions = {
|
|
49
57
|
/**
|
|
50
58
|
* **iOS | MacOS**
|