@k8slens/public-utilities 1.0.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/README.md ADDED
@@ -0,0 +1,33 @@
1
+ # @k8slens/public-utilities
2
+
3
+ The few general-purpose types and helpers that **public contracts packages**
4
+ need in their own signatures.
5
+
6
+ A contracts package promised to everyone (`"visibility": "public-for-all"`) may
7
+ only depend on other `public-for-all` packages, or `npm install` fails outside
8
+ this monorepo. `@lensapp/utilities` is the natural home for a helper like
9
+ `MaybePromise`, but it is a large internal kitchen sink and publishing it whole
10
+ would make every one of its corners a forever public API.
11
+
12
+ So the minimum moves here, and `@lensapp/utilities` re-exports it. There is one
13
+ definition of each symbol, in this package; internal code keeps importing it
14
+ from `@lensapp/utilities` exactly as before.
15
+
16
+ ## What belongs here
17
+
18
+ Only a symbol that appears in the **public surface of a public contracts
19
+ package** — a token's type, a factory's parameters, an exported interface. That
20
+ is the whole admission rule.
21
+
22
+ Nothing else: this package is a forever public API, so every symbol added is a
23
+ promise that cannot be quietly withdrawn. When a public contract needs a
24
+ general-purpose helper, move that one helper here and re-export it from
25
+ `@lensapp/utilities`; do not move its neighbours along for symmetry.
26
+
27
+ ## What is here
28
+
29
+ | Symbol | Why it is public |
30
+ |---|---|
31
+ | `MaybePromise<T>` | Contracts model factories that may resolve later |
32
+ | `AsyncVoidFunction`, `MaybeAsyncVoidFunction` | Menu and action contracts take handlers that may be async |
33
+ | `expectDefined` | Contracts that read a React context assert it is present |
@@ -0,0 +1,15 @@
1
+ export type { MaybePromise } from "./src/maybe-promise";
2
+ export type { AnyFunction, Disposer } from "./src/functions";
3
+ export type { AsyncVoidFunction, MaybeAsyncVoidFunction } from "./src/void-functions";
4
+ export type { SingleOrMany } from "./src/single-or-many";
5
+ export type { Tuple } from "./src/tuple";
6
+ export { expectDefined } from "./src/expect-defined";
7
+ export { shellQuote, windowsShellQuote } from "./src/shell-quote";
8
+ export { assertDefined } from "./src/assert-defined";
9
+ export { isDefined, isObject } from "./src/type-narrowing";
10
+ export { noop } from "./src/noop";
11
+ export { cssNames, type IClassName, type IgnoredClassNames } from "./src/css-names";
12
+ export { onMiddleClick, onTrigger, stopPropagation } from "./src/event-handlers";
13
+ export { sanitizeScssModules } from "./src/sanitize-scss-modules";
14
+ export { type ShellType, type ShellFamily, detectShellType, shellFamilyOf } from "./src/shell-type/shell-type";
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC7D,YAAY,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACtF,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,YAAY,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,KAAK,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAIlE,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ assertDefined: () => assertDefined,
24
+ cssNames: () => cssNames,
25
+ detectShellType: () => detectShellType,
26
+ expectDefined: () => expectDefined,
27
+ isDefined: () => isDefined,
28
+ isObject: () => isObject,
29
+ noop: () => noop,
30
+ onMiddleClick: () => onMiddleClick,
31
+ onTrigger: () => onTrigger,
32
+ sanitizeScssModules: () => sanitizeScssModules,
33
+ shellFamilyOf: () => shellFamilyOf,
34
+ shellQuote: () => shellQuote,
35
+ stopPropagation: () => stopPropagation,
36
+ windowsShellQuote: () => windowsShellQuote
37
+ });
38
+ module.exports = __toCommonJS(index_exports);
39
+
40
+ // src/expect-defined.ts
41
+ function expectDefined(value, message = "Expected value to be defined") {
42
+ if (value === void 0 || value === null) {
43
+ throw new Error(message);
44
+ }
45
+ return value;
46
+ }
47
+
48
+ // src/shell-quote.ts
49
+ var shellQuote = (value) => `'${value.replace(/'/g, `'\\''`)}'`;
50
+ var windowsShellQuote = (value) => `"${value.replace(/"/g, `""`)}"`;
51
+
52
+ // src/assert-defined.ts
53
+ function assertDefined(value, message = "Expected value to be defined") {
54
+ if (value === void 0 || value === null) {
55
+ throw new Error(message);
56
+ }
57
+ }
58
+
59
+ // src/type-narrowing.ts
60
+ function isObject(val) {
61
+ return typeof val === "object" && val !== null;
62
+ }
63
+ function isDefined(val) {
64
+ return val !== void 0 && val !== null;
65
+ }
66
+
67
+ // src/noop.ts
68
+ function noop() {
69
+ return;
70
+ }
71
+
72
+ // src/css-names.ts
73
+ function cssNames(...classNames) {
74
+ const convertToArrayOfNames = (names) => {
75
+ if (Array.isArray(names)) {
76
+ return names.flatMap(convertToArrayOfNames);
77
+ }
78
+ if (!names) {
79
+ return [];
80
+ }
81
+ if (typeof names === "string") {
82
+ return [names];
83
+ }
84
+ if (typeof names === "number" || typeof names === "symbol" || typeof names === "function") {
85
+ return [];
86
+ }
87
+ return Object.entries(names).filter(([, value]) => value).map(([name]) => name);
88
+ };
89
+ const nonDeduplicated = classNames.flatMap(convertToArrayOfNames).map((className) => className.trim()).filter(Boolean).join(" ").split(" ");
90
+ return [...new Set(nonDeduplicated)].join(" ");
91
+ }
92
+
93
+ // src/event-handlers.ts
94
+ function stopPropagation(event) {
95
+ event.stopPropagation();
96
+ }
97
+ function onTrigger(...args) {
98
+ if (args.length === 1) {
99
+ const [callback2] = args;
100
+ return (event2) => {
101
+ if (event2.shiftKey || event2.metaKey || event2.altKey || event2.ctrlKey || event2.repeat) {
102
+ return;
103
+ }
104
+ if (event2.code === "Enter") {
105
+ event2.preventDefault();
106
+ callback2(event2);
107
+ return;
108
+ }
109
+ if (event2.code === "Space" && event2.target === event2.currentTarget) {
110
+ event2.preventDefault();
111
+ callback2(event2);
112
+ }
113
+ };
114
+ }
115
+ const [event, callback] = args;
116
+ onTrigger(callback)(event);
117
+ return void 0;
118
+ }
119
+ function onMiddleClick(...args) {
120
+ if (args.length === 1) {
121
+ const [callback2] = args;
122
+ return (event2) => {
123
+ if (event2.shiftKey || event2.metaKey || event2.altKey || event2.ctrlKey) {
124
+ return;
125
+ }
126
+ if (event2.button === 1) {
127
+ callback2(event2);
128
+ }
129
+ };
130
+ }
131
+ const [event, callback] = args;
132
+ onMiddleClick(callback)(event);
133
+ return void 0;
134
+ }
135
+
136
+ // src/sanitize-scss-modules.ts
137
+ var sanitizeScssModules = (variables) => {
138
+ const unitTestsAreRunning = process.env.JEST_WORKER_ID && !process.env.LENS_ACTIVATION_CODE_FOR_INTEGRATION_TESTS;
139
+ if (unitTestsAreRunning) {
140
+ return new Proxy(variables, {
141
+ get: (_target, prop) => prop
142
+ });
143
+ }
144
+ return variables;
145
+ };
146
+
147
+ // src/shell-type/shell-type.ts
148
+ var detectShellType = (shellPath, isWindows) => {
149
+ const normalizedPath = shellPath.toLowerCase();
150
+ if (normalizedPath.includes("powershell") || normalizedPath.includes("pwsh")) {
151
+ return "powershell";
152
+ }
153
+ if (normalizedPath.includes("cmd.exe") || normalizedPath.endsWith("cmd")) {
154
+ return "cmd";
155
+ }
156
+ if (normalizedPath.includes("bash")) {
157
+ return "bash";
158
+ }
159
+ if (normalizedPath.includes("zsh")) {
160
+ return "zsh";
161
+ }
162
+ if (normalizedPath.includes("fish")) {
163
+ return "fish";
164
+ }
165
+ if (normalizedPath.endsWith("/sh") || normalizedPath.endsWith("\\sh")) {
166
+ return "sh";
167
+ }
168
+ if (isWindows) {
169
+ return "powershell";
170
+ }
171
+ return "unknown";
172
+ };
173
+ var shellFamilyOf = (shell) => {
174
+ switch (shell) {
175
+ case "fish":
176
+ return "fish";
177
+ case "cmd":
178
+ return "cmd";
179
+ case "powershell":
180
+ return "powershell";
181
+ default:
182
+ return "posix";
183
+ }
184
+ };
185
+ // Annotate the CommonJS export names for ESM import in node:
186
+ 0 && (module.exports = {
187
+ assertDefined,
188
+ cssNames,
189
+ detectShellType,
190
+ expectDefined,
191
+ isDefined,
192
+ isObject,
193
+ noop,
194
+ onMiddleClick,
195
+ onTrigger,
196
+ sanitizeScssModules,
197
+ shellFamilyOf,
198
+ shellQuote,
199
+ stopPropagation,
200
+ windowsShellQuote
201
+ });
202
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vaW5kZXgudHMiLCAiLi4vc3JjL2V4cGVjdC1kZWZpbmVkLnRzIiwgIi4uL3NyYy9zaGVsbC1xdW90ZS50cyIsICIuLi9zcmMvYXNzZXJ0LWRlZmluZWQudHMiLCAiLi4vc3JjL3R5cGUtbmFycm93aW5nLnRzIiwgIi4uL3NyYy9ub29wLnRzIiwgIi4uL3NyYy9jc3MtbmFtZXMudHMiLCAiLi4vc3JjL2V2ZW50LWhhbmRsZXJzLnRzIiwgIi4uL3NyYy9zYW5pdGl6ZS1zY3NzLW1vZHVsZXMudHMiLCAiLi4vc3JjL3NoZWxsLXR5cGUvc2hlbGwtdHlwZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IHR5cGUgeyBNYXliZVByb21pc2UgfSBmcm9tIFwiLi9zcmMvbWF5YmUtcHJvbWlzZVwiO1xuZXhwb3J0IHR5cGUgeyBBbnlGdW5jdGlvbiwgRGlzcG9zZXIgfSBmcm9tIFwiLi9zcmMvZnVuY3Rpb25zXCI7XG5leHBvcnQgdHlwZSB7IEFzeW5jVm9pZEZ1bmN0aW9uLCBNYXliZUFzeW5jVm9pZEZ1bmN0aW9uIH0gZnJvbSBcIi4vc3JjL3ZvaWQtZnVuY3Rpb25zXCI7XG5leHBvcnQgdHlwZSB7IFNpbmdsZU9yTWFueSB9IGZyb20gXCIuL3NyYy9zaW5nbGUtb3ItbWFueVwiO1xuZXhwb3J0IHR5cGUgeyBUdXBsZSB9IGZyb20gXCIuL3NyYy90dXBsZVwiO1xuZXhwb3J0IHsgZXhwZWN0RGVmaW5lZCB9IGZyb20gXCIuL3NyYy9leHBlY3QtZGVmaW5lZFwiO1xuZXhwb3J0IHsgc2hlbGxRdW90ZSwgd2luZG93c1NoZWxsUXVvdGUgfSBmcm9tIFwiLi9zcmMvc2hlbGwtcXVvdGVcIjtcbmV4cG9ydCB7IGFzc2VydERlZmluZWQgfSBmcm9tIFwiLi9zcmMvYXNzZXJ0LWRlZmluZWRcIjtcbmV4cG9ydCB7IGlzRGVmaW5lZCwgaXNPYmplY3QgfSBmcm9tIFwiLi9zcmMvdHlwZS1uYXJyb3dpbmdcIjtcbmV4cG9ydCB7IG5vb3AgfSBmcm9tIFwiLi9zcmMvbm9vcFwiO1xuZXhwb3J0IHsgY3NzTmFtZXMsIHR5cGUgSUNsYXNzTmFtZSwgdHlwZSBJZ25vcmVkQ2xhc3NOYW1lcyB9IGZyb20gXCIuL3NyYy9jc3MtbmFtZXNcIjtcbmV4cG9ydCB7IG9uTWlkZGxlQ2xpY2ssIG9uVHJpZ2dlciwgc3RvcFByb3BhZ2F0aW9uIH0gZnJvbSBcIi4vc3JjL2V2ZW50LWhhbmRsZXJzXCI7XG5leHBvcnQgeyBzYW5pdGl6ZVNjc3NNb2R1bGVzIH0gZnJvbSBcIi4vc3JjL3Nhbml0aXplLXNjc3MtbW9kdWxlc1wiO1xuXG4vLyBUaGUgcHVyZSBzaGVsbCB0eXBlcy4gVGhlIHJlZ2lzdHJhdGlvbiBoZWxwZXJzIHRoYXQgdXNlIHRoZW0gcHJvZHVjZVxuLy8gaW5qZWN0YWJsZXMsIHNvIHRoZXkgbGl2ZSBpbiBAazhzbGVucy9wbGF0Zm9ybS1zcGVjaWZpYy1pbmplY3RhYmxlcyBpbnN0ZWFkLlxuZXhwb3J0IHsgdHlwZSBTaGVsbFR5cGUsIHR5cGUgU2hlbGxGYW1pbHksIGRldGVjdFNoZWxsVHlwZSwgc2hlbGxGYW1pbHlPZiB9IGZyb20gXCIuL3NyYy9zaGVsbC10eXBlL3NoZWxsLXR5cGVcIjtcbiIsICJleHBvcnQgZnVuY3Rpb24gZXhwZWN0RGVmaW5lZDxUPih2YWx1ZTogVCwgbWVzc2FnZSA9IFwiRXhwZWN0ZWQgdmFsdWUgdG8gYmUgZGVmaW5lZFwiKTogTm9uTnVsbGFibGU8VD4ge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cbiIsICIvKiogV3JhcCBhIHZhbHVlIGluIHNpbmdsZSBxdW90ZXMsIGVzY2FwaW5nIGVtYmVkZGVkIHNpbmdsZSBxdW90ZXMsIGZvciBzYWZlIFBPU0lYIHNoZWxsIHVzZS4gKi9cbmV4cG9ydCBjb25zdCBzaGVsbFF1b3RlID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT4gYCcke3ZhbHVlLnJlcGxhY2UoLycvZywgYCdcXFxcJydgKX0nYDtcblxuLyoqXG4gKiBXcmFwIGEgdmFsdWUgaW4gZG91YmxlIHF1b3RlcyBmb3Igc2FmZSBgY21kLmV4ZWAgdXNlLCBlc2NhcGluZyBlbWJlZGRlZCBkb3VibGVcbiAqIHF1b3RlcyBieSBkb3VibGluZyB0aGVtIChjbWQncyBvd24gY29udmVudGlvbikuIFRoZSBXaW5kb3dzIGNvdW50ZXJwYXJ0IHRvXG4gKiB7QGxpbmsgc2hlbGxRdW90ZX0gXHUyMDE0IFBPU0lYIHNpbmdsZS1xdW90aW5nIGlzIG5vdCBob25vdXJlZCBieSBgY21kLmV4ZWAuXG4gKi9cbmV4cG9ydCBjb25zdCB3aW5kb3dzU2hlbGxRdW90ZSA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+IGBcIiR7dmFsdWUucmVwbGFjZSgvXCIvZywgYFwiXCJgKX1cImA7XG4iLCAiLyoqIE5hcnJvd3MgdG8gYSBkZWZpbmVkIHZhbHVlLCB0aHJvd2luZyB3aGVuIGl0IGlzIG51bGwgb3IgdW5kZWZpbmVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydERlZmluZWQ8VD4odmFsdWU6IFQsIG1lc3NhZ2UgPSBcIkV4cGVjdGVkIHZhbHVlIHRvIGJlIGRlZmluZWRcIik6IGFzc2VydHMgdmFsdWUgaXMgTm9uTnVsbGFibGU8VD4ge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfVxufVxuIiwgIi8qKiBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBhbiBvYmplY3QsIG5hcnJvd2luZyBpdCB0byBhbiBpbmRleGFibGUgb25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KHZhbDogdW5rbm93bik6IHZhbCBpcyBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sIHwgbnVtYmVyLCB1bmtub3duPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiICYmIHZhbCAhPT0gbnVsbDtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIHZhbHVlIGlzIG5laXRoZXIgbnVsbCBub3IgdW5kZWZpbmVkLiBVc2VmdWwgYXMgYW4gYXJyYXkgZmlsdGVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGVmaW5lZDxUPih2YWw6IFQgfCB1bmRlZmluZWQgfCBudWxsKTogdmFsIGlzIFQge1xuICByZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgJiYgdmFsICE9PSBudWxsO1xufVxuIiwgIi8qKiBBIGZ1bmN0aW9uIHRoYXQgZG9lcyBub3RoaW5nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vb3AoKTogdm9pZCB7XG4gIHJldHVybjtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNpbmdsZU9yTWFueSB9IGZyb20gXCIuL3NpbmdsZS1vci1tYW55XCI7XG5cbmV4cG9ydCB0eXBlIElnbm9yZWRDbGFzc05hbWVzID0gbnVtYmVyIHwgc3ltYm9sIHwgRnVuY3Rpb247XG5cbi8qKiBBbnl0aGluZyBhY2NlcHRlZCBhcyBhIGNsYXNzIG5hbWU6IHN0cmluZ3MsIGFycmF5cywgb3IgYSBmbGFnLXBlci1uYW1lIHJlY29yZC4gKi9cbmV4cG9ydCB0eXBlIElDbGFzc05hbWUgPSBTaW5nbGVPck1hbnk8c3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB8IG51bGwgfCBmYWxzZT4gfCBJZ25vcmVkQ2xhc3NOYW1lcztcblxuLyoqIEpvaW5zIGNsYXNzIG5hbWVzLCBkcm9wcGluZyB0aGUgZmFsc3kgb25lcyBhbmQgZGUtZHVwbGljYXRpbmcgdGhlIHJlc3QuICovXG5leHBvcnQgZnVuY3Rpb24gY3NzTmFtZXMoLi4uY2xhc3NOYW1lczogSUNsYXNzTmFtZVtdKTogc3RyaW5nIHtcbiAgY29uc3QgY29udmVydFRvQXJyYXlPZk5hbWVzID0gKG5hbWVzOiBJQ2xhc3NOYW1lKTogc3RyaW5nW10gPT4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG5hbWVzKSkge1xuICAgICAgcmV0dXJuIG5hbWVzLmZsYXRNYXAoY29udmVydFRvQXJyYXlPZk5hbWVzKTtcbiAgICB9XG5cbiAgICBpZiAoIW5hbWVzKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuYW1lcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIFtuYW1lc107XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuYW1lcyA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgbmFtZXMgPT09IFwic3ltYm9sXCIgfHwgdHlwZW9mIG5hbWVzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMobmFtZXMpXG4gICAgICAuZmlsdGVyKChbLCB2YWx1ZV0pID0+IHZhbHVlKVxuICAgICAgLm1hcCgoW25hbWVdKSA9PiBuYW1lKTtcbiAgfTtcblxuICBjb25zdCBub25EZWR1cGxpY2F0ZWQgPSBjbGFzc05hbWVzXG4gICAgLmZsYXRNYXAoY29udmVydFRvQXJyYXlPZk5hbWVzKVxuICAgIC5tYXAoKGNsYXNzTmFtZSkgPT4gY2xhc3NOYW1lLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgLmpvaW4oXCIgXCIpXG4gICAgLnNwbGl0KFwiIFwiKTtcblxuICByZXR1cm4gWy4uLm5ldyBTZXQobm9uRGVkdXBsaWNhdGVkKV0uam9pbihcIiBcIik7XG59XG4iLCAiaW1wb3J0IHR5cGUgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5cbi8qKiBTdG9wcyBhbiBldmVudCBmcm9tIGJ1YmJsaW5nIGZ1cnRoZXIuICovXG5leHBvcnQgZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uKGV2ZW50OiBFdmVudCB8IFJlYWN0LlN5bnRoZXRpY0V2ZW50KSB7XG4gIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb25UcmlnZ2VyPFQ+KGV2ZW50OiBSZWFjdC5LZXlib2FyZEV2ZW50PFQ+LCBjYWxsYmFjazogUmVhY3QuS2V5Ym9hcmRFdmVudEhhbmRsZXI8VD4pOiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIG9uVHJpZ2dlcjxUPihjYWxsYmFjazogUmVhY3QuS2V5Ym9hcmRFdmVudEhhbmRsZXI8VD4pOiBSZWFjdC5LZXlib2FyZEV2ZW50SGFuZGxlcjxUPjtcblxuLyoqXG4gKiBBY3RpdmF0ZXMgb24gdGhlIGtleXMgdGhhdCBjb3VudCBhcyBcInRyaWdnZXIgdGhpc1wiIFx1MjAxNCBFbnRlciBhbnl3aGVyZSBpbiB0aGVcbiAqIGVsZW1lbnQsIFNwYWNlIG9ubHkgb24gdGhlIGVsZW1lbnQgaXRzZWxmLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb25UcmlnZ2VyKFxuICAuLi5hcmdzOiBbUmVhY3QuS2V5Ym9hcmRFdmVudCwgUmVhY3QuS2V5Ym9hcmRFdmVudEhhbmRsZXJdIHwgW1JlYWN0LktleWJvYXJkRXZlbnRIYW5kbGVyXVxuKTogUmVhY3QuS2V5Ym9hcmRFdmVudEhhbmRsZXIgfCB1bmRlZmluZWQge1xuICBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICBjb25zdCBbY2FsbGJhY2tdID0gYXJncztcblxuICAgIHJldHVybiAoZXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudC5zaGlmdEtleSB8fCBldmVudC5tZXRhS2V5IHx8IGV2ZW50LmFsdEtleSB8fCBldmVudC5jdHJsS2V5IHx8IGV2ZW50LnJlcGVhdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5jb2RlID09PSBcIkVudGVyXCIpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY2FsbGJhY2soZXZlbnQpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQSBzcGFjZSBwcmVzc2VkIGluIHNvbWV0aGluZyBmb2N1c2FibGUgKmluc2lkZSogdGhlIGVsZW1lbnQgKGEgZmllbGQgb2YgYSBtZW51XG4gICAgICAvLyByb3cncyBjb25maWd1cmF0aW9uIHBhbmVsLCBzYXkpIG1lcmVseSBidWJibGVzIHRocm91Z2ggaXQ6IGl0IGlzIGEgY2hhcmFjdGVyIG9mXG4gICAgICAvLyB3aGF0IGlzIGJlaW5nIHdyaXR0ZW4sIG5vdCBhIGNsaWNrIG9uIGV2ZXJ5dGhpbmcgYXJvdW5kIGl0LiBFbnRlciBhYm92ZSBpcyB0aGVcbiAgICAgIC8vIG9wcG9zaXRlIFx1MjAxNCBpdCBpcyB0aGF0IGZpZWxkJ3MgXCJkb25lXCIsIHNvIGl0IHN0aWxsIGFjdGl2YXRlcyB3aGF0IGVuY2xvc2VzIGl0LlxuICAgICAgaWYgKGV2ZW50LmNvZGUgPT09IFwiU3BhY2VcIiAmJiBldmVudC50YXJnZXQgPT09IGV2ZW50LmN1cnJlbnRUYXJnZXQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY2FsbGJhY2soZXZlbnQpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBjb25zdCBbZXZlbnQsIGNhbGxiYWNrXSA9IGFyZ3M7XG5cbiAgb25UcmlnZ2VyKGNhbGxiYWNrKShldmVudCk7XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9uTWlkZGxlQ2xpY2s8VD4oZXZlbnQ6IFJlYWN0Lk1vdXNlRXZlbnQ8VD4sIGNhbGxiYWNrOiBSZWFjdC5Nb3VzZUV2ZW50SGFuZGxlcjxUPik6IHZvaWQ7XG5leHBvcnQgZnVuY3Rpb24gb25NaWRkbGVDbGljazxUPihjYWxsYmFjazogUmVhY3QuTW91c2VFdmVudEhhbmRsZXI8VD4pOiBSZWFjdC5Nb3VzZUV2ZW50SGFuZGxlcjtcblxuLyoqIEFjdGl2YXRlcyBvbiB0aGUgbWlkZGxlIG1vdXNlIGJ1dHRvbiwgYW5kIG9ubHkgb24gYW4gdW5tb2RpZmllZCBwcmVzcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbk1pZGRsZUNsaWNrKFxuICAuLi5hcmdzOiBbUmVhY3QuTW91c2VFdmVudCwgUmVhY3QuTW91c2VFdmVudEhhbmRsZXJdIHwgW1JlYWN0Lk1vdXNlRXZlbnRIYW5kbGVyXVxuKTogUmVhY3QuTW91c2VFdmVudEhhbmRsZXIgfCB1bmRlZmluZWQge1xuICBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICBjb25zdCBbY2FsbGJhY2tdID0gYXJncztcblxuICAgIHJldHVybiAoZXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudC5zaGlmdEtleSB8fCBldmVudC5tZXRhS2V5IHx8IGV2ZW50LmFsdEtleSB8fCBldmVudC5jdHJsS2V5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gMSkge1xuICAgICAgICBjYWxsYmFjayhldmVudCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IFtldmVudCwgY2FsbGJhY2tdID0gYXJncztcblxuICBvbk1pZGRsZUNsaWNrKGNhbGxiYWNrKShldmVudCk7XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsICIvKipcbiAqIE1ha2VzIGEgQ1NTLW1vZHVsZSBsb29rdXAgcmV0dXJuIHRoZSBwcm9wZXJ0eSBuYW1lIHdoaWxlIHVuaXQgdGVzdHMgcnVuLCBzbyBhXG4gKiBwYWNrYWdlIHRoYXQgZXhwb3J0cyBhIGNsYXNzIG5hbWUgZm9yIGEgY29uc3VtZXIgdG8gYXNzZXJ0IG9uIGFuZCB0aGVcbiAqIGNvbnN1bWVyIGFzc2VydGluZyBvbiBpdCBhZ3JlZSBhYm91dCB3aGF0IHRoZSBuYW1lIGlzLiBPdXRzaWRlIGEgdGVzdCB3b3JrZXJcbiAqIGl0IGhhbmRzIHRoZSByZWFsLCBoYXNoZWQgbWFwcGluZyBzdHJhaWdodCBiYWNrLlxuICpcbiAqIEEgaG9sZGluZyBwb3NpdGlvbiwgbm90IGEgZGVzaWduOiBpdCBleGlzdHMgYmVjYXVzZSBleHBvcnRpbmcgQ1NTLW1vZHVsZVxuICogY2xhc3MgbmFtZXMgYWNyb3NzIGEgcGFja2FnZSBib3VuZGFyeSBuZWVkcyB0aGUgdHdvIHNpZGVzIHRvIGFncmVlLCBhbmQgaXRcbiAqIGdvZXMgYXdheSB3aXRoIHRob3NlIGV4cG9ydHMuXG4gKi9cbmV4cG9ydCBjb25zdCBzYW5pdGl6ZVNjc3NNb2R1bGVzID0gPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pih2YXJpYWJsZXM6IFQpOiBUID0+IHtcbiAgY29uc3QgdW5pdFRlc3RzQXJlUnVubmluZyA9IHByb2Nlc3MuZW52LkpFU1RfV09SS0VSX0lEICYmICFwcm9jZXNzLmVudi5MRU5TX0FDVElWQVRJT05fQ09ERV9GT1JfSU5URUdSQVRJT05fVEVTVFM7XG5cbiAgaWYgKHVuaXRUZXN0c0FyZVJ1bm5pbmcpIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KHZhcmlhYmxlcywge1xuICAgICAgZ2V0OiAoX3RhcmdldCwgcHJvcCkgPT4gcHJvcCxcbiAgICB9KSBhcyBUO1xuICB9XG5cbiAgcmV0dXJuIHZhcmlhYmxlcztcbn07XG4iLCAiLyoqXG4gKiBBIHNwZWNpZmljIGludGVyYWN0aXZlIHNoZWxsLCBjbGFzc2lmaWVkIGZyb20gYSBzaGVsbCBwYXRoLiBgdW5rbm93bmAgY292ZXJzXG4gKiBhbnkgUE9TSVgtaXNoIHNoZWxsIHdlIGRvIG5vdCByZWNvZ25pemUgYnkgbmFtZS5cbiAqL1xuZXhwb3J0IHR5cGUgU2hlbGxUeXBlID0gXCJwb3dlcnNoZWxsXCIgfCBcImNtZFwiIHwgXCJiYXNoXCIgfCBcInpzaFwiIHwgXCJmaXNoXCIgfCBcInNoXCIgfCBcInVua25vd25cIjtcblxuLyoqXG4gKiBUaGUgYmVoYXZpb3VyYWwgZmFtaWx5IGEgc2hlbGwgYmVsb25ncyB0byBcdTIwMTQgdGhlIGdyYW51bGFyaXR5IGF0IHdoaWNoIHNoZWxsXG4gKiBoYW5kbGluZyAoZS5nLiBob3cgYSBjb21tYW5kIGlzIHJ1biBzbyB0aGUgdGVybWluYWwgc3RheXMgaW50ZXJhY3RpdmUpIGRpZmZlcnMuXG4gKiBgYmFzaGAvYHpzaGAvYHNoYC9gdW5rbm93bmAgY29sbGFwc2UgaW50byBgcG9zaXhgIHNpbmNlIHRoZXkgc2hhcmUgdGhhdCBzeW50YXguXG4gKi9cbmV4cG9ydCB0eXBlIFNoZWxsRmFtaWx5ID0gXCJwb3NpeFwiIHwgXCJmaXNoXCIgfCBcImNtZFwiIHwgXCJwb3dlcnNoZWxsXCI7XG5cbi8qKlxuICogQ2xhc3NpZnkgYSBzaGVsbCBmcm9tIGl0cyBwYXRoLiBgaXNXaW5kb3dzYCBvbmx5IGRyaXZlcyB0aGUgZmFsbGJhY2sgd2hlbiB0aGVcbiAqIHBhdGggaXMgdW5yZWNvZ25pemVkIChvbiBXaW5kb3dzIGFuIHVua25vd24gc2hlbGwgaXMgYXNzdW1lZCB0byBiZSBQb3dlclNoZWxsKS5cbiAqIEtlcHQgZnJlZSBvZiBhbnkgcGxhdGZvcm0gdHlwZSBzbyBpdCBjYW4gbGl2ZSBpbiB0aGlzIGxvdy1sZXZlbCBwYWNrYWdlLlxuICovXG5leHBvcnQgY29uc3QgZGV0ZWN0U2hlbGxUeXBlID0gKHNoZWxsUGF0aDogc3RyaW5nLCBpc1dpbmRvd3M6IGJvb2xlYW4pOiBTaGVsbFR5cGUgPT4ge1xuICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHNoZWxsUGF0aC50b0xvd2VyQ2FzZSgpO1xuXG4gIGlmIChub3JtYWxpemVkUGF0aC5pbmNsdWRlcyhcInBvd2Vyc2hlbGxcIikgfHwgbm9ybWFsaXplZFBhdGguaW5jbHVkZXMoXCJwd3NoXCIpKSB7XG4gICAgcmV0dXJuIFwicG93ZXJzaGVsbFwiO1xuICB9XG4gIGlmIChub3JtYWxpemVkUGF0aC5pbmNsdWRlcyhcImNtZC5leGVcIikgfHwgbm9ybWFsaXplZFBhdGguZW5kc1dpdGgoXCJjbWRcIikpIHtcbiAgICByZXR1cm4gXCJjbWRcIjtcbiAgfVxuICBpZiAobm9ybWFsaXplZFBhdGguaW5jbHVkZXMoXCJiYXNoXCIpKSB7XG4gICAgcmV0dXJuIFwiYmFzaFwiO1xuICB9XG4gIGlmIChub3JtYWxpemVkUGF0aC5pbmNsdWRlcyhcInpzaFwiKSkge1xuICAgIHJldHVybiBcInpzaFwiO1xuICB9XG4gIGlmIChub3JtYWxpemVkUGF0aC5pbmNsdWRlcyhcImZpc2hcIikpIHtcbiAgICByZXR1cm4gXCJmaXNoXCI7XG4gIH1cbiAgaWYgKG5vcm1hbGl6ZWRQYXRoLmVuZHNXaXRoKFwiL3NoXCIpIHx8IG5vcm1hbGl6ZWRQYXRoLmVuZHNXaXRoKFwiXFxcXHNoXCIpKSB7XG4gICAgcmV0dXJuIFwic2hcIjtcbiAgfVxuXG4gIGlmIChpc1dpbmRvd3MpIHtcbiAgICByZXR1cm4gXCJwb3dlcnNoZWxsXCI7XG4gIH1cblxuICByZXR1cm4gXCJ1bmtub3duXCI7XG59O1xuXG4vKiogQ29sbGFwc2UgYSB7QGxpbmsgU2hlbGxUeXBlfSBpbnRvIHRoZSBiZWhhdmlvdXJhbCB7QGxpbmsgU2hlbGxGYW1pbHl9LiAqL1xuZXhwb3J0IGNvbnN0IHNoZWxsRmFtaWx5T2YgPSAoc2hlbGw6IFNoZWxsVHlwZSk6IFNoZWxsRmFtaWx5ID0+IHtcbiAgc3dpdGNoIChzaGVsbCkge1xuICAgIGNhc2UgXCJmaXNoXCI6XG4gICAgICByZXR1cm4gXCJmaXNoXCI7XG4gICAgY2FzZSBcImNtZFwiOlxuICAgICAgcmV0dXJuIFwiY21kXCI7XG4gICAgY2FzZSBcInBvd2Vyc2hlbGxcIjpcbiAgICAgIHJldHVybiBcInBvd2Vyc2hlbGxcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gYmFzaCAvIHpzaCAvIHNoIC8gdW5rbm93biBhbGwgc2hhcmUgUE9TSVggc3ludGF4LlxuICAgICAgcmV0dXJuIFwicG9zaXhcIjtcbiAgfVxufTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUNBTyxTQUFTLGNBQWlCLE9BQVUsVUFBVSxnQ0FBZ0Q7QUFDbkcsTUFBSSxVQUFVLFVBQWEsVUFBVSxNQUFNO0FBQ3pDLFVBQU0sSUFBSSxNQUFNLE9BQU87QUFBQSxFQUN6QjtBQUVBLFNBQU87QUFDVDs7O0FDTE8sSUFBTSxhQUFhLENBQUMs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
@@ -0,0 +1,3 @@
1
+ /** Narrows to a defined value, throwing when it is null or undefined. */
2
+ export declare function assertDefined<T>(value: T, message?: string): asserts value is NonNullable<T>;
3
+ //# sourceMappingURL=assert-defined.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assert-defined.d.ts","sourceRoot":"","sources":["../../src/assert-defined.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,SAAiC,GAAG,OAAO,CAAC,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAIpH"}
@@ -0,0 +1,7 @@
1
+ import type { SingleOrMany } from "./single-or-many";
2
+ export type IgnoredClassNames = number | symbol | Function;
3
+ /** Anything accepted as a class name: strings, arrays, or a flag-per-name record. */
4
+ export type IClassName = SingleOrMany<string | Record<string, any> | undefined | null | false> | IgnoredClassNames;
5
+ /** Joins class names, dropping the falsy ones and de-duplicating the rest. */
6
+ export declare function cssNames(...classNames: IClassName[]): string;
7
+ //# sourceMappingURL=css-names.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css-names.d.ts","sourceRoot":"","sources":["../../src/css-names.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE3D,qFAAqF;AACrF,MAAM,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,GAAG,IAAI,GAAG,KAAK,CAAC,GAAG,iBAAiB,CAAC;AAEnH,8EAA8E;AAC9E,wBAAgB,QAAQ,CAAC,GAAG,UAAU,EAAE,UAAU,EAAE,GAAG,MAAM,CA+B5D"}
@@ -0,0 +1,8 @@
1
+ import type React from "react";
2
+ /** Stops an event from bubbling further. */
3
+ export declare function stopPropagation(event: Event | React.SyntheticEvent): void;
4
+ export declare function onTrigger<T>(event: React.KeyboardEvent<T>, callback: React.KeyboardEventHandler<T>): void;
5
+ export declare function onTrigger<T>(callback: React.KeyboardEventHandler<T>): React.KeyboardEventHandler<T>;
6
+ export declare function onMiddleClick<T>(event: React.MouseEvent<T>, callback: React.MouseEventHandler<T>): void;
7
+ export declare function onMiddleClick<T>(callback: React.MouseEventHandler<T>): React.MouseEventHandler;
8
+ //# sourceMappingURL=event-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-handlers.d.ts","sourceRoot":"","sources":["../../src/event-handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,4CAA4C;AAC5C,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,cAAc,QAElE;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AAC3G,wBAAgB,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;AA0CrG,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AACzG,wBAAgB,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,iBAAiB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function expectDefined<T>(value: T, message?: string): NonNullable<T>;
2
+ //# sourceMappingURL=expect-defined.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expect-defined.d.ts","sourceRoot":"","sources":["../../src/expect-defined.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,SAAiC,GAAG,WAAW,CAAC,CAAC,CAAC,CAMnG"}
@@ -0,0 +1,5 @@
1
+ /** Undoes whatever the call that returned it set up. */
2
+ export type Disposer = () => void;
3
+ /** Any callable at all — the constraint to use when a signature is the caller's business. */
4
+ export type AnyFunction = (...args: any[]) => any;
5
+ //# sourceMappingURL=functions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functions.d.ts","sourceRoot":"","sources":["../../src/functions.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,MAAM,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC;AAElC,6FAA6F;AAC7F,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** A value, or that value later. */
2
+ export type MaybePromise<T> = Promise<T> | T;
3
+ //# sourceMappingURL=maybe-promise.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maybe-promise.d.ts","sourceRoot":"","sources":["../../src/maybe-promise.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** A function that does nothing. */
2
+ export declare function noop(): void;
3
+ //# sourceMappingURL=noop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noop.d.ts","sourceRoot":"","sources":["../../src/noop.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,wBAAgB,IAAI,IAAI,IAAI,CAE3B"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Makes a CSS-module lookup return the property name while unit tests run, so a
3
+ * package that exports a class name for a consumer to assert on and the
4
+ * consumer asserting on it agree about what the name is. Outside a test worker
5
+ * it hands the real, hashed mapping straight back.
6
+ *
7
+ * A holding position, not a design: it exists because exporting CSS-module
8
+ * class names across a package boundary needs the two sides to agree, and it
9
+ * goes away with those exports.
10
+ */
11
+ export declare const sanitizeScssModules: <T extends Record<string, string>>(variables: T) => T;
12
+ //# sourceMappingURL=sanitize-scss-modules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize-scss-modules.d.ts","sourceRoot":"","sources":["../../src/sanitize-scss-modules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC,KAAG,CAUpF,CAAC"}
@@ -0,0 +1,9 @@
1
+ /** Wrap a value in single quotes, escaping embedded single quotes, for safe POSIX shell use. */
2
+ export declare const shellQuote: (value: string) => string;
3
+ /**
4
+ * Wrap a value in double quotes for safe `cmd.exe` use, escaping embedded double
5
+ * quotes by doubling them (cmd's own convention). The Windows counterpart to
6
+ * {@link shellQuote} — POSIX single-quoting is not honoured by `cmd.exe`.
7
+ */
8
+ export declare const windowsShellQuote: (value: string) => string;
9
+ //# sourceMappingURL=shell-quote.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-quote.d.ts","sourceRoot":"","sources":["../../src/shell-quote.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,eAAO,MAAM,UAAU,UAAW,MAAM,KAAG,MAA6C,CAAC;AAEzF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,UAAW,MAAM,KAAG,MAA0C,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * A specific interactive shell, classified from a shell path. `unknown` covers
3
+ * any POSIX-ish shell we do not recognize by name.
4
+ */
5
+ export type ShellType = "powershell" | "cmd" | "bash" | "zsh" | "fish" | "sh" | "unknown";
6
+ /**
7
+ * The behavioural family a shell belongs to — the granularity at which shell
8
+ * handling (e.g. how a command is run so the terminal stays interactive) differs.
9
+ * `bash`/`zsh`/`sh`/`unknown` collapse into `posix` since they share that syntax.
10
+ */
11
+ export type ShellFamily = "posix" | "fish" | "cmd" | "powershell";
12
+ /**
13
+ * Classify a shell from its path. `isWindows` only drives the fallback when the
14
+ * path is unrecognized (on Windows an unknown shell is assumed to be PowerShell).
15
+ * Kept free of any platform type so it can live in this low-level package.
16
+ */
17
+ export declare const detectShellType: (shellPath: string, isWindows: boolean) => ShellType;
18
+ /** Collapse a {@link ShellType} into the behavioural {@link ShellFamily}. */
19
+ export declare const shellFamilyOf: (shell: ShellType) => ShellFamily;
20
+ //# sourceMappingURL=shell-type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-type.d.ts","sourceRoot":"","sources":["../../../src/shell-type/shell-type.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;AAE1F;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,YAAY,CAAC;AAElE;;;;GAIG;AACH,eAAO,MAAM,eAAe,cAAe,MAAM,aAAa,OAAO,KAAG,SA2BvE,CAAC;AAEF,6EAA6E;AAC7E,eAAO,MAAM,aAAa,UAAW,SAAS,KAAG,WAYhD,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** One of something, or several of it. */
2
+ export type SingleOrMany<T> = T | T[];
3
+ //# sourceMappingURL=single-or-many.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"single-or-many.d.ts","sourceRoot":"","sources":["../../src/single-or-many.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** A strict N-tuple of type T. */
2
+ export type Tuple<T, N extends number> = N extends N ? (number extends N ? T[] : TupleOfImpl<T, N, []>) : never;
3
+ type TupleOfImpl<T, N extends number, R extends unknown[]> = R["length"] extends N ? R : TupleOfImpl<T, N, [T, ...R]>;
4
+ export {};
5
+ //# sourceMappingURL=tuple.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tuple.d.ts","sourceRoot":"","sources":["../../src/tuple.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,MAAM,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;AAEhH,KAAK,WAAW,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,OAAO,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** Whether the value is an object, narrowing it to an indexable one. */
2
+ export declare function isObject(val: unknown): val is Record<string | symbol | number, unknown>;
3
+ /** Whether the value is neither null nor undefined. Useful as an array filter. */
4
+ export declare function isDefined<T>(val: T | undefined | null): val is T;
5
+ //# sourceMappingURL=type-narrowing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-narrowing.d.ts","sourceRoot":"","sources":["../../src/type-narrowing.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,CAEvF;AAED,kFAAkF;AAClF,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,SAAS,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC,CAEhE"}
@@ -0,0 +1,5 @@
1
+ /** A handler that returns nothing, later. */
2
+ export type AsyncVoidFunction = () => Promise<void>;
3
+ /** A handler that may or may not be async — the caller does not care which. */
4
+ export type MaybeAsyncVoidFunction = AsyncVoidFunction | VoidFunction;
5
+ //# sourceMappingURL=void-functions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"void-functions.d.ts","sourceRoot":"","sources":["../../src/void-functions.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAEpD,+EAA+E;AAC/E,MAAM,MAAM,sBAAsB,GAAG,iBAAiB,GAAG,YAAY,CAAC"}