bruh 1.13.1 → 2.0.0-beta.1

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.
Files changed (84) hide show
  1. package/dist/browser/jsx-runtime.mjs +2 -0
  2. package/dist/browser/jsx-runtime.mjs.map +1 -0
  3. package/dist/browser.mjs +174 -0
  4. package/dist/browser.mjs.map +1 -0
  5. package/dist/cli/node.mjs +16 -0
  6. package/dist/cli/node.mjs.map +1 -0
  7. package/dist/components/aside-toc.mjs +162 -0
  8. package/dist/components/aside-toc.mjs.map +1 -0
  9. package/dist/components/custom-elements.mjs +52 -0
  10. package/dist/components/custom-elements.mjs.map +1 -0
  11. package/dist/components/intl/date-time.mjs +219 -0
  12. package/dist/components/intl/date-time.mjs.map +1 -0
  13. package/dist/components/intl/display-name.mjs +71 -0
  14. package/dist/components/intl/display-name.mjs.map +1 -0
  15. package/dist/components/intl/language-picker.mjs +102 -0
  16. package/dist/components/intl/language-picker.mjs.map +1 -0
  17. package/dist/components/intl/list.mjs +80 -0
  18. package/dist/components/intl/list.mjs.map +1 -0
  19. package/dist/components/intl/number.mjs +118 -0
  20. package/dist/components/intl/number.mjs.map +1 -0
  21. package/dist/components/intl/plural.mjs +82 -0
  22. package/dist/components/intl/plural.mjs.map +1 -0
  23. package/dist/components/intl/utils.mjs +197 -0
  24. package/dist/components/intl/utils.mjs.map +1 -0
  25. package/dist/components/optimized-picture/hydrate.mjs +10 -0
  26. package/dist/components/optimized-picture/hydrate.mjs.map +1 -0
  27. package/dist/components/optimized-picture/server.mjs +28 -0
  28. package/dist/components/optimized-picture/server.mjs.map +1 -0
  29. package/dist/components/utils.mjs +4 -0
  30. package/dist/components/utils.mjs.map +1 -0
  31. package/dist/media/images/node.mjs +41 -0
  32. package/dist/media/images/node.mjs.map +1 -0
  33. package/dist/polyfills/weakref.mjs +16 -0
  34. package/dist/polyfills/weakref.mjs.map +1 -0
  35. package/dist/reactive/sync/transport/websocket/browser.mjs +52 -0
  36. package/dist/reactive/sync/transport/websocket/browser.mjs.map +1 -0
  37. package/dist/reactive.mjs +160 -0
  38. package/dist/reactive.mjs.map +1 -0
  39. package/dist/server/jsx-runtime.mjs +2 -0
  40. package/dist/server/jsx-runtime.mjs.map +1 -0
  41. package/dist/server.mjs +346 -0
  42. package/dist/server.mjs.map +1 -0
  43. package/dist/types/cli/index.d.mts +2 -0
  44. package/dist/types/components/aside-toc/index.d.ts +45 -0
  45. package/dist/types/components/custom-elements.d.mts +83 -0
  46. package/dist/types/components/intl/date-time.d.ts +138 -0
  47. package/dist/types/components/intl/display-name.d.ts +45 -0
  48. package/dist/types/components/intl/language-picker.d.ts +35 -0
  49. package/dist/types/components/intl/list.d.ts +41 -0
  50. package/dist/types/components/intl/number.d.ts +81 -0
  51. package/dist/types/components/intl/plural.d.ts +60 -0
  52. package/dist/types/components/intl/utils.d.mts +30 -0
  53. package/dist/types/components/optimized-picture/hydrate.d.mts +2 -0
  54. package/dist/types/components/optimized-picture/server.d.ts +8 -0
  55. package/dist/types/components/utils.d.mts +5 -0
  56. package/dist/types/dom/browser/jsx-runtime.d.mts +3 -0
  57. package/dist/types/dom/index.browser.d.mts +127 -0
  58. package/dist/types/dom/index.server.d.mts +174 -0
  59. package/dist/types/dom/server/jsx-runtime.d.mts +3 -0
  60. package/dist/types/dom/types.d.mts +9 -0
  61. package/dist/types/media/images.node.d.mts +1 -0
  62. package/dist/types/polyfills/weakref.d.mts +4 -0
  63. package/dist/types/reactive/index.d.mts +91 -0
  64. package/dist/types/reactive/sync/transport/websocket/browser.d.mts +11 -0
  65. package/dist/types/utils/browser.d.mts +2 -0
  66. package/dist/types/utils/index.d.mts +122 -0
  67. package/dist/utils/browser.mjs +27 -0
  68. package/dist/utils/browser.mjs.map +1 -0
  69. package/dist/utils.mjs +287 -0
  70. package/dist/utils.mjs.map +1 -0
  71. package/package.json +122 -19
  72. package/dist/bruh.es.js +0 -226
  73. package/dist/bruh.es.js.map +0 -1
  74. package/dist/bruh.umd.js +0 -2
  75. package/dist/bruh.umd.js.map +0 -1
  76. package/src/cli/index.mjs +0 -19
  77. package/src/components/optimized-picture/hydrate.mjs +0 -10
  78. package/src/components/optimized-picture/render.mjs +0 -26
  79. package/src/dom/index.browser.mjs +0 -270
  80. package/src/dom/index.server.mjs +0 -280
  81. package/src/index.browser.mjs +0 -3
  82. package/src/media/images.node.mjs +0 -70
  83. package/src/reactive/index.mjs +0 -160
  84. package/src/util/index.mjs +0 -42
package/dist/utils.mjs ADDED
@@ -0,0 +1,287 @@
1
+ const dispatch = (target, type, detail, options) => target.dispatchEvent(
2
+ // Default to behave like most DOM events
3
+ new CustomEvent(type, {
4
+ detail,
5
+ bubbles: true,
6
+ cancelable: true,
7
+ composed: true,
8
+ ...options
9
+ })
10
+ );
11
+ const createDestructable = (object, iterable) => {
12
+ const destructable = {
13
+ ...object,
14
+ [Symbol.iterator]: () => iterable[Symbol.iterator]()
15
+ };
16
+ Object.defineProperty(destructable, Symbol.iterator, {
17
+ enumerable: false
18
+ });
19
+ return destructable;
20
+ };
21
+ const functionAsObject = (f) => new Proxy({}, {
22
+ get: (_, property) => f(property)
23
+ });
24
+ const pick = (t, ...keys) => {
25
+ const picked = {};
26
+ for (const key of keys)
27
+ picked[key] = t[key];
28
+ return picked;
29
+ };
30
+ const omit = (t, ...keys) => {
31
+ const unomitted = { ...t };
32
+ for (const key of keys)
33
+ delete unomitted[key];
34
+ return unomitted;
35
+ };
36
+ const mapObject = (o, f) => Object.fromEntries(
37
+ Object.entries(o).map(f)
38
+ );
39
+ const invertObject = (o) => mapObject(o, ([key, value]) => [value, key]);
40
+ invertObject({ a: 1, b: 2, c: 3 });
41
+ mapObject({ a: 1, b: 2, c: 3 }, ([key, value]) => [value, key]);
42
+ const camelToDashCase = (s) => s.replace(/[A-Z]/g, (c) => "-" + c.toLowerCase());
43
+ const dashToCamelCase = (s) => s.replace(/-[a-z]/g, (dc) => dc[1].toUpperCase());
44
+ const unique = (values, getKey) => {
45
+ if (!getKey)
46
+ return [...new Set(values)];
47
+ const seen = /* @__PURE__ */ new Map();
48
+ for (const value of values) {
49
+ const key = getKey(value);
50
+ if (!seen.has(key))
51
+ seen.set(key, value);
52
+ }
53
+ return [...seen.values()];
54
+ };
55
+ const report = (e) => {
56
+ console.error(e);
57
+ };
58
+ const attempt = (f, recover = report) => {
59
+ try {
60
+ const result = f();
61
+ if (result instanceof Promise)
62
+ return result.catch(recover);
63
+ return result;
64
+ } catch (e) {
65
+ return recover(e);
66
+ }
67
+ };
68
+ const makePromiseQueue = () => {
69
+ const queue = /* @__PURE__ */ new Set();
70
+ const enqueue = (promise) => {
71
+ const recursivePromise = promise.then((resolved) => ({
72
+ promise: recursivePromise,
73
+ settled: {
74
+ status: "fulfilled",
75
+ value: resolved
76
+ }
77
+ })).catch((rejected) => ({
78
+ promise: recursivePromise,
79
+ settled: {
80
+ status: "rejected",
81
+ reason: rejected
82
+ }
83
+ }));
84
+ queue.add(recursivePromise);
85
+ };
86
+ const dequeue = async () => {
87
+ const { promise, settled } = await Promise.race(queue);
88
+ queue.delete(promise);
89
+ return settled;
90
+ };
91
+ return {
92
+ enqueue,
93
+ async *[Symbol.asyncIterator]() {
94
+ while (queue.size)
95
+ yield await dequeue();
96
+ }
97
+ };
98
+ };
99
+ const concatenateStreams = async (streams) => {
100
+ const { readable, writable } = new TransformStream();
101
+ for (let i = 0; i < streams.length; i++)
102
+ await streams[i].pipeTo(writable, { preventClose: i + 1 !== streams.length });
103
+ return readable;
104
+ };
105
+ const originLock = async (name, options = {}) => {
106
+ const { promise: lockAquiredPromise, resolve: lockAquired } = Promise.withResolvers();
107
+ const { promise: lockReleasedPromise, resolve: releaseLock } = Promise.withResolvers();
108
+ try {
109
+ navigator.locks.request(name, options, () => {
110
+ lockAquired();
111
+ return lockReleasedPromise;
112
+ });
113
+ } catch {
114
+ }
115
+ await lockAquiredPromise;
116
+ return () => {
117
+ releaseLock();
118
+ };
119
+ };
120
+ const range = (from, to, stepSize = 1) => {
121
+ const sign = Math.sign(to - from);
122
+ if (sign === 0)
123
+ return [];
124
+ const result = [];
125
+ for (let n = from; n < to; n += sign * stepSize)
126
+ result.push(n);
127
+ return result;
128
+ };
129
+ const randomId = () => Math.random().toString(36).slice(2);
130
+ const basicLatin = String.fromCharCode(...range(32, 127));
131
+ const makeRandomPassword = ({
132
+ length = 32,
133
+ characters = basicLatin
134
+ } = {}) => {
135
+ const entropyPerCharacter = 8;
136
+ const statesPerCharacter = 2 ** entropyPerCharacter;
137
+ if (characters.length > statesPerCharacter)
138
+ throw new Error(`Character count (${characters.length}) must not exceed 2^8 (256)`);
139
+ const limit = statesPerCharacter - statesPerCharacter % characters.length;
140
+ const randomValuesUnderLimit = [];
141
+ while (randomValuesUnderLimit.length < length) {
142
+ const randomValues = crypto.getRandomValues(
143
+ new Uint8Array(length - randomValuesUnderLimit.length)
144
+ );
145
+ for (const randomValue of randomValues)
146
+ if (randomValue < limit)
147
+ randomValuesUnderLimit.push(randomValue);
148
+ }
149
+ let result = "";
150
+ for (const n of randomValuesUnderLimit)
151
+ result += characters[n % characters.length];
152
+ return result;
153
+ };
154
+ const hash = async (data, algorithm = "SHA-256") => {
155
+ if (typeof data === "string")
156
+ data = new TextEncoder().encode(data);
157
+ const bytes = new Uint8Array(
158
+ await crypto.subtle.digest(algorithm, data)
159
+ );
160
+ let result = "";
161
+ for (const byte of bytes)
162
+ result += byte.toString(16).padStart(2, "0");
163
+ return result;
164
+ };
165
+ const regexEscape = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
166
+ const regexTag = (strings, ...substitutions) => {
167
+ let result = "";
168
+ for (let i = 0; i < strings.length; i++)
169
+ result += strings.raw[i] + regexEscape((substitutions[i] ?? "") + "");
170
+ return (flags) => new RegExp(result, flags);
171
+ };
172
+ const urlTag = (strings, ...substitutions) => {
173
+ let result = "";
174
+ for (let i = 0; i < strings.length; i++)
175
+ result += strings[i] + encodeURIComponent((substitutions[i] ?? "") + "");
176
+ return result;
177
+ };
178
+ const modifyUrl = (url, f) => {
179
+ try {
180
+ const result = new URL(url);
181
+ Object.assign(result, f(result));
182
+ return result.href;
183
+ } catch {
184
+ }
185
+ const match = url.match(/(.*?)(\?[^#\n]*)?(#.*)?$/m);
186
+ if (!match)
187
+ return url;
188
+ const [, pathname = "", search = "", hash2 = ""] = match;
189
+ const inputParts = { pathname, search, hash: hash2 };
190
+ const parts = { ...inputParts, ...f(inputParts) };
191
+ return parts.pathname + (parts.search ? "?" + parts.search.replace(/^\?/m, "") : "") + (parts.hash ? "#" + encodeURIComponent(parts.hash.replace(/^#/m, "")) : "");
192
+ };
193
+ const urlWithParams = (url, searchParameters) => modifyUrl(url, ({ search }) => {
194
+ const searchParams = new URLSearchParams(search);
195
+ for (const key in searchParameters) {
196
+ searchParams.delete(key);
197
+ const valueOrValues = searchParameters[key];
198
+ if (valueOrValues === void 0) continue;
199
+ if (Array.isArray(valueOrValues))
200
+ for (const value of valueOrValues)
201
+ searchParams.append(key, value + "");
202
+ else
203
+ searchParams.append(key, valueOrValues + "");
204
+ }
205
+ searchParams.sort();
206
+ return { search: searchParams.toString() };
207
+ });
208
+ class NodeTreeIterator {
209
+ #root;
210
+ #current;
211
+ #filter;
212
+ constructor(root, filter) {
213
+ this.#current = this.#root = root;
214
+ this.#filter = filter;
215
+ }
216
+ #isSkipping = false;
217
+ /** Skip descendents of the current node */
218
+ skip() {
219
+ this.#isSkipping = true;
220
+ }
221
+ #next() {
222
+ let current = this.#current;
223
+ while (true) {
224
+ const isSkipping = this.#isSkipping;
225
+ this.#isSkipping = false;
226
+ if (!isSkipping && current.firstChild) {
227
+ current = current.firstChild;
228
+ } else if (current.nextSibling) {
229
+ if (current === this.#root)
230
+ return;
231
+ current = current.nextSibling;
232
+ } else {
233
+ while (true) {
234
+ if (!current.parentNode || current === this.#root)
235
+ return;
236
+ const parent = current.parentNode;
237
+ if (parent === this.#root)
238
+ return;
239
+ if (parent.nextSibling) {
240
+ current = parent.nextSibling;
241
+ break;
242
+ } else {
243
+ current = parent;
244
+ }
245
+ }
246
+ }
247
+ if (!this.#filter || this.#filter(current))
248
+ return this.#current = current;
249
+ }
250
+ }
251
+ next() {
252
+ const value = this.#next();
253
+ return { done: !value, value };
254
+ }
255
+ [Symbol.iterator]() {
256
+ return this;
257
+ }
258
+ }
259
+ const makeFlatRange = (firstNode, isLastNode) => {
260
+ const range2 = firstNode.ownerDocument.createRange();
261
+ range2.setStartBefore(firstNode);
262
+ let lastNode;
263
+ for (let currentNode = firstNode; currentNode = currentNode.nextSibling; currentNode) {
264
+ if (isLastNode(currentNode)) {
265
+ lastNode = currentNode;
266
+ break;
267
+ }
268
+ }
269
+ lastNode ??= firstNode.parentNode.lastChild;
270
+ range2.setEndAfter(lastNode);
271
+ return range2;
272
+ };
273
+ const recursivelySearchFor = (x3, f, path = []) => {
274
+ if (f(x3)) return [{ path, value: x3 }];
275
+ if (Array.isArray(x3))
276
+ return x3.flatMap(
277
+ (y, i) => recursivelySearchFor(y, f, [...path, { parent: x3, key: i, value: y }])
278
+ );
279
+ if (x3 !== null && typeof x3 === "object")
280
+ return Object.entries(x3).flatMap(
281
+ ([k, v]) => recursivelySearchFor(v, f, [...path, { parent: x3, key: k, value: v }])
282
+ );
283
+ return [];
284
+ };
285
+
286
+ export { NodeTreeIterator, attempt, basicLatin, camelToDashCase, concatenateStreams, createDestructable, dashToCamelCase, dispatch, functionAsObject, hash, invertObject, makeFlatRange, makePromiseQueue, makeRandomPassword, mapObject, modifyUrl, omit, originLock, pick, randomId, range, recursivelySearchFor, regexEscape, regexTag, unique, urlTag, urlWithParams };
287
+ //# sourceMappingURL=utils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.mjs","sources":["../src/utils/index.mts"],"sourcesContent":["import type { LikelyAsString } from \"../dom/types.mts\"\n\n/**\n * Dispatch a custom event to (capturing) and from (bubbling) a target (usually a DOM node).\n * Returns false if the event was cancelled (preventDefault()) and true otherwise.\n *\n * Note that this is synchronous\n */\nexport const dispatch = (\n target: EventTarget,\n type: string,\n detail: unknown,\n options: CustomEventInit\n) =>\n target.dispatchEvent(\n // Default to behave like most DOM events\n new CustomEvent(type, {\n detail,\n bubbles: true,\n cancelable: true,\n composed: true,\n ...options\n })\n )\n\n/**\n * Inspired by https://antfu.me/posts/destructuring-with-object-or-array#take-away\n *\n * Creates an object that is both destructable with {...} and [...]\n *\n * Useful for writing library functions à la react-use & vueuse\n *\n * @example\n * ```typescript\n * const useExample = () => {\n * const a = \"a\"\n * const b = \"b\"\n * return createDestructable(\n * { a, b },\n * [ a, b ]\n * )\n * }\n *\n * const { a, b } = useExample()\n * // or\n * const [ a, b ] = useExample()\n * ```\n */\nexport const createDestructable = <\n const T extends {},\n const U extends Iterable<unknown>\n>(\n object: T,\n iterable: U\n) => {\n const destructable = {\n ...object,\n [Symbol.iterator]: () => iterable[Symbol.iterator]()\n }\n\n Object.defineProperty(destructable, Symbol.iterator, {\n enumerable: false\n })\n\n return destructable as T & U\n}\n\n/**\n * Creates an object (as a Proxy) that acts as a function\n *\n * So functionAsObject(f).property is equivalent to f(\"property\")\n *\n * This is can be useful when combined with destructuring syntax\n *\n * @example\n * ```typescript\n * const { html, head, title, body, main, h1, p } = functionAsObject(e)\n * ```\n */\nexport const functionAsObject = <T extends { [input: PropertyKey]: any }>(\n f: <K extends keyof T>(property: K) => T[K]\n) =>\n new Proxy({}, {\n get: (_, property) => f(property)\n }) as T\n\nexport const pick = <T, K extends keyof T>(t: T, ...keys: ReadonlyArray<K>) => {\n const picked = {} as Pick<T, K>\n\n for (const key of keys)\n picked[key] = t[key]\n\n return picked\n}\n\nexport const omit = <T, K extends keyof T>(t: T, ...keys: ReadonlyArray<K>) => {\n const unomitted: Partial<T> = { ...t }\n\n for (const key of keys)\n delete unomitted[key]\n\n return unomitted as Omit<T, K>\n}\n\nexport const mapObject = <\n const O extends {},\n const K extends keyof O,\n const V extends O[K],\n const RK extends PropertyKey,\n const RV\n>(\n o: O,\n f: ([k, v]: [K, V]) => [RK, RV]\n): {\n [\n Entry in\n { [Key in keyof O]: [RK, RV] }[keyof O]\n as Entry[0]\n ]: Entry[1]\n} =>\n Object.fromEntries(\n Object.entries(o).map(f as any) as any\n ) as any\n\nexport type InvertObject<O extends Record<PropertyKey, PropertyKey>> = {\n [\n Entry in\n { [Key in keyof O]: [O[Key], Key] }[keyof O]\n as Entry[0]\n ]: Entry[1]\n}\n\nexport const invertObject = <const O extends Record<PropertyKey, PropertyKey>>(o: O): InvertObject<O> =>\n mapObject(o, ([key, value]) => [value, key] as const)\n\nconst x = invertObject({ a: 1, b: 2, c: 3 })\ntype X = typeof x\n\nconst x2 = mapObject({ a: 1, b: 2, c: 3 }, ([key, value]) => [value, key] as const)\ntype X2 = typeof x2\n\nexport const camelToDashCase = (s: string) =>\n s.replace(/[A-Z]/g, c => \"-\" + c.toLowerCase())\n\nexport const dashToCamelCase = (s: string) =>\n s.replace(/-[a-z]/g, dc => dc[1].toUpperCase())\n\nexport const unique = <T, K>(\n values: Iterable<T>,\n getKey?: (value: T) => K\n) => {\n if (!getKey)\n return [...new Set(values)]\n\n const seen = new Map<K, T>()\n for (const value of values) {\n const key = getKey(value)\n if (!seen.has(key))\n seen.set(key, value)\n }\n return [...seen.values()]\n}\n\nconst report = (e: unknown) => {\n console.error(e)\n}\nexport const attempt: {\n <T, R = undefined>(f: () => T, recover?: (e: unknown) => R): T | R,\n <T, R = undefined>(f: () => Promise<T>, recover?: (e: unknown) => R): Promise<T | R>\n} = <T extends unknown>(f: () => T | Promise<T>, recover = report) => {\n try {\n const result = f()\n\n if (result instanceof Promise)\n return result.catch(recover)\n\n return result\n }\n catch (e) {\n return recover(e)\n }\n}\n\ntype FulfilledSelfReferencingPromise<T extends unknown> =\n Promise<\n {\n promise: FulfilledSelfReferencingPromise<T>,\n settled: {\n status: \"fulfilled\",\n value: T\n }\n }\n >\n\ntype RejectedSelfReferencingPromise<E extends unknown> =\n Promise<\n {\n promise: RejectedSelfReferencingPromise<E>,\n settled: {\n status: \"rejected\",\n reason: E\n }\n }\n >\n\ntype SelfReferencingPromise<T extends unknown, E extends unknown> =\n | FulfilledSelfReferencingPromise<T>\n | RejectedSelfReferencingPromise<E>\n\nexport const makePromiseQueue = <T extends unknown, E extends unknown>() => {\n const queue = new Set<SelfReferencingPromise<T, E>>()\n\n const enqueue = (promise: Promise<T>) => {\n const recursivePromise = promise\n .then(resolved => ({\n promise: recursivePromise,\n settled: {\n status: \"fulfilled\",\n value: resolved\n }\n }))\n .catch(rejected => ({\n promise: recursivePromise,\n settled: {\n status: \"rejected\",\n reason: rejected as E\n }\n })) as SelfReferencingPromise<T, E>\n\n queue.add(recursivePromise)\n }\n\n const dequeue = async () => {\n const { promise, settled } = await Promise.race<SelfReferencingPromise<T, E>>(queue)\n queue.delete(promise)\n return settled\n }\n\n return {\n enqueue,\n\n async * [Symbol.asyncIterator]() {\n while (queue.size)\n yield await dequeue()\n }\n }\n}\n\nexport const concatenateStreams = async <T extends any>(streams: ReadonlyArray<ReadableStream<T>>) => {\n const { readable, writable } = new TransformStream<T, T>()\n\n for (let i = 0; i < streams.length; i++)\n await streams[i].pipeTo(writable, { preventClose: i + 1 !== streams.length })\n\n return readable\n}\n\nexport const originLock = async (name: string, options: LockOptions = {}) => {\n const { promise: lockAquiredPromise, resolve: lockAquired } = Promise.withResolvers<void>()\n const { promise: lockReleasedPromise, resolve: releaseLock } = Promise.withResolvers<void>()\n\n try {\n navigator.locks.request(name, options, () => {\n lockAquired()\n return lockReleasedPromise\n })\n } catch {}\n\n await lockAquiredPromise\n\n return () => {\n releaseLock()\n }\n}\n\nexport const range = (from: number, to: number, stepSize = 1) => {\n const sign = Math.sign(to - from)\n if (sign === 0)\n return []\n\n const result: number[] = []\n for (let n = from; n < to; n += sign * stepSize)\n result.push(n)\n return result\n}\n\nexport const randomId = () =>\n Math.random().toString(36).slice(2)\n\nexport const basicLatin = String.fromCharCode(...range(32, 127))\n\nexport const makeRandomPassword = ({\n length = 32,\n characters = basicLatin\n}: {\n /** Max 256 */\n length?: number,\n characters?: string | ReadonlyArray<string>\n} = {}) => {\n const entropyPerCharacter = 8\n const statesPerCharacter = 2 ** entropyPerCharacter\n\n if (characters.length > statesPerCharacter)\n throw new Error(`Character count (${characters.length}) must not exceed 2^8 (256)`)\n\n const limit = statesPerCharacter - (statesPerCharacter % characters.length)\n\n const randomValuesUnderLimit: number[] = []\n while (randomValuesUnderLimit.length < length) {\n const randomValues = crypto.getRandomValues(\n new Uint8Array(length - randomValuesUnderLimit.length)\n )\n for (const randomValue of randomValues)\n if (randomValue < limit)\n randomValuesUnderLimit.push(randomValue)\n }\n\n let result = \"\"\n for (const n of randomValuesUnderLimit)\n result += characters[n % characters.length]\n return result\n}\n\nexport const hash = async (\n data: string | BufferSource,\n algorithm: AlgorithmIdentifier = \"SHA-256\"\n) => {\n if (typeof data === \"string\")\n data = new TextEncoder().encode(data)\n\n const bytes = new Uint8Array(\n await crypto.subtle.digest(algorithm, data)\n )\n\n let result = \"\"\n for (const byte of bytes)\n result += byte.toString(16).padStart(2, \"0\")\n return result\n}\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions#escaping\n */\nexport const regexEscape = (s: string) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n\nexport const regexTag = (\n\tstrings: TemplateStringsArray,\n\t...substitutions: ReadonlyArray<unknown>\n) => {\n\tlet result = \"\"\n\tfor (let i = 0; i < strings.length; i++)\n\t\tresult += strings.raw[i] + regexEscape((substitutions[i] ?? \"\") + \"\")\n\treturn (flags?: string) => new RegExp(result, flags)\n}\n\nexport const urlTag = (strings: TemplateStringsArray, ...substitutions: ReadonlyArray<unknown>) => {\n\tlet result = \"\"\n\tfor (let i = 0; i < strings.length; i++)\n\t\tresult += strings[i] + encodeURIComponent((substitutions[i] ?? \"\") + \"\")\n\treturn result\n}\n\ntype UrlParts = {\n\tpathname: string\n\tsearch: string\n\thash: string\n}\nexport const modifyUrl = (url: URL | string, f: (parts: UrlParts) => Partial<UrlParts>) => {\n\ttry {\n\t\tconst result = new URL(url)\n\t\tObject.assign(result, f(result))\n\t\treturn result.href\n\t} catch {}\n\n\tconst match = (url as string).match(/(.*?)(\\?[^#\\n]*)?(#.*)?$/m)\n\tif (!match)\n return url as string\n\n\tconst [, pathname = \"\", search = \"\", hash = \"\"] = match\n\n\tconst inputParts = { pathname, search, hash }\n\tconst parts = { ...inputParts, ...f(inputParts) }\n\treturn (\n\t\tparts.pathname +\n\t\t(parts.search ? \"?\" + parts.search.replace(/^\\?/m, \"\") : \"\") +\n\t\t(parts.hash ? \"#\" + encodeURIComponent(parts.hash.replace(/^#/m, \"\")) : \"\")\n\t)\n}\n\nexport const urlWithParams = (\n\turl: URL | string,\n\tsearchParameters?: Record<string, LikelyAsString | ReadonlyArray<LikelyAsString> | undefined>\n) =>\n\tmodifyUrl(url, ({ search }) => {\n\t\tconst searchParams = new URLSearchParams(search)\n\n\t\tfor (const key in searchParameters) {\n\t\t\tsearchParams.delete(key)\n\t\t\tconst valueOrValues = searchParameters[key]\n\t\t\tif (valueOrValues === undefined) continue\n\n\t\t\tif (Array.isArray(valueOrValues))\n\t\t\t\tfor (const value of valueOrValues as ReadonlyArray<LikelyAsString>)\n\t\t\t\t\tsearchParams.append(key, value + \"\")\n\t\t\telse\n searchParams.append(key, (valueOrValues as LikelyAsString) + \"\")\n\t\t}\n\t\tsearchParams.sort()\n\n\t\treturn { search: searchParams.toString() }\n\t})\n\nexport class NodeTreeIterator implements IterableIterator<Node> {\n #root: ParentNode\n #current: Node\n #filter?: (node: Node) => boolean\n\n constructor(root: ParentNode, filter?: (node: Node) => boolean) {\n this.#current = this.#root = root\n this.#filter = filter\n }\n\n #isSkipping = false\n /** Skip descendents of the current node */\n skip() {\n this.#isSkipping = true\n }\n\n #next() {\n let current = this.#current\n while (true) {\n const isSkipping = this.#isSkipping\n this.#isSkipping = false\n\n if (!isSkipping && current.firstChild) {\n current = current.firstChild\n }\n else if (current.nextSibling) {\n if (current === this.#root)\n return\n\n current = current.nextSibling\n }\n else {\n while (true) {\n if (!current.parentNode || current === this.#root)\n return\n\n const parent = current.parentNode\n if (parent === this.#root)\n return\n\n if (parent.nextSibling) {\n current = parent.nextSibling\n break\n }\n else {\n current = parent\n }\n }\n }\n\n if (!this.#filter || this.#filter(current))\n return this.#current = current\n }\n }\n\n next() {\n const value = this.#next()\n return { done: !value, value } as\n | { done: false, value: Node }\n | { done: true, value: undefined }\n }\n\n [Symbol.iterator]() {\n return this\n }\n}\n\nexport const makeFlatRange = (firstNode: ChildNode, isLastNode: (node: ChildNode) => boolean) => {\n\tconst range = firstNode.ownerDocument!.createRange()\n\n\trange.setStartBefore(firstNode)\n\n\tlet lastNode: ChildNode\n\tfor (\n\t\tlet currentNode: ChildNode | null = firstNode;\n\t\t(currentNode = currentNode.nextSibling);\n\t\tcurrentNode\n\t) {\n\t\tif (isLastNode(currentNode)) {\n\t\t\tlastNode = currentNode\n\t\t\tbreak\n\t\t}\n\t}\n\tlastNode ??= firstNode.parentNode!.lastChild!\n\n\trange.setEndAfter(lastNode)\n\n\treturn range\n}\n\ntype SearchPath = ReadonlyArray<{\n parent: {},\n key: PropertyKey,\n value: unknown\n}>\n\nexport const recursivelySearchFor = <T extends unknown>(\n\tx: unknown,\n\tf: (value: unknown) => value is T,\n\tpath: SearchPath = []\n): ReadonlyArray<{ path: SearchPath, value: T }> => {\n\tif (f(x)) return [{ path, value: x }]\n\n\tif (Array.isArray(x))\n\t\treturn x.flatMap((y, i) =>\n\t\t\trecursivelySearchFor(y, f, [...path, { parent: x, key: i, value: y }])\n\t\t)\n\n\tif (x !== null && typeof x === \"object\")\n\t\treturn Object.entries(x).flatMap(([k, v]) =>\n\t\t\trecursivelySearchFor(v, f, [...path, { parent: x, key: k, value: v }])\n\t\t)\n\n\treturn []\n}\n"],"names":["hash","range","x"],"mappings":"AAQO,MAAM,WAAW,CACtB,MAAA,EACA,IACA,EAAA,MAAA,EACA,YAEA,MAAO,CAAA,aAAA;AAAA;AAAA,EAEL,IAAI,YAAY,IAAM,EAAA;AAAA,IACpB,MAAA;AAAA,IACA,OAAS,EAAA,IAAA;AAAA,IACT,UAAY,EAAA,IAAA;AAAA,IACZ,QAAU,EAAA,IAAA;AAAA,IACV,GAAG;AAAA,GACJ;AACH;AAyBW,MAAA,kBAAA,GAAqB,CAIhC,MAAA,EACA,QACG,KAAA;AACH,EAAA,MAAM,YAAe,GAAA;AAAA,IACnB,GAAG,MAAA;AAAA,IACH,CAAC,OAAO,QAAQ,GAAG,MAAM,QAAS,CAAA,MAAA,CAAO,QAAQ,CAAE;AAAA,GACrD;AAEA,EAAO,MAAA,CAAA,cAAA,CAAe,YAAc,EAAA,MAAA,CAAO,QAAU,EAAA;AAAA,IACnD,UAAY,EAAA;AAAA,GACb,CAAA;AAED,EAAO,OAAA,YAAA;AACT;AAcO,MAAM,mBAAmB,CAC9B,CAAA,KAEA,IAAI,KAAA,CAAM,EAAI,EAAA;AAAA,EACZ,GAAK,EAAA,CAAC,CAAG,EAAA,QAAA,KAAa,EAAE,QAAQ;AAClC,CAAC;AAEU,MAAA,IAAA,GAAO,CAAuB,CAAA,EAAA,GAAS,IAA2B,KAAA;AAC7E,EAAA,MAAM,SAAS,EAAC;AAEhB,EAAA,KAAA,MAAW,GAAO,IAAA,IAAA;AAChB,IAAO,MAAA,CAAA,GAAG,CAAI,GAAA,CAAA,CAAE,GAAG,CAAA;AAErB,EAAO,OAAA,MAAA;AACT;AAEa,MAAA,IAAA,GAAO,CAAuB,CAAA,EAAA,GAAS,IAA2B,KAAA;AAC7E,EAAM,MAAA,SAAA,GAAwB,EAAE,GAAG,CAAE,EAAA;AAErC,EAAA,KAAA,MAAW,GAAO,IAAA,IAAA;AAChB,IAAA,OAAO,UAAU,GAAG,CAAA;AAEtB,EAAO,OAAA,SAAA;AACT;AAEO,MAAM,SAAY,GAAA,CAOvB,CACA,EAAA,CAAA,KAQA,MAAO,CAAA,WAAA;AAAA,EACL,MAAO,CAAA,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAI,CAAQ;AAChC;AAUK,MAAM,YAAe,GAAA,CAAmD,CAC7E,KAAA,SAAA,CAAU,CAAG,EAAA,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM,CAAC,KAAA,EAAO,GAAG,CAAU;AAE5C,aAAa,EAAE,CAAA,EAAG,GAAG,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG;AAGhC,SAAU,CAAA,EAAE,GAAG,CAAG,EAAA,CAAA,EAAG,GAAG,CAAG,EAAA,CAAA,EAAK,EAAA,CAAC,CAAC,GAAK,EAAA,KAAK,MAAM,CAAC,KAAA,EAAO,GAAG,CAAU;AAGrE,MAAA,eAAA,GAAkB,CAAC,CAAA,KAC9B,CAAE,CAAA,OAAA,CAAQ,UAAU,CAAK,CAAA,KAAA,GAAA,GAAM,CAAE,CAAA,WAAA,EAAa;AAEnC,MAAA,eAAA,GAAkB,CAAC,CAAA,KAC9B,CAAE,CAAA,OAAA,CAAQ,SAAW,EAAA,CAAA,EAAA,KAAM,EAAG,CAAA,CAAC,CAAE,CAAA,WAAA,EAAa;AAEnC,MAAA,MAAA,GAAS,CACpB,MAAA,EACA,MACG,KAAA;AACH,EAAA,IAAI,CAAC,MAAA;AACH,IAAA,OAAO,CAAC,GAAG,IAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AAE5B,EAAM,MAAA,IAAA,uBAAW,GAAU,EAAA;AAC3B,EAAA,KAAA,MAAW,SAAS,MAAQ,EAAA;AAC1B,IAAM,MAAA,GAAA,GAAM,OAAO,KAAK,CAAA;AACxB,IAAI,IAAA,CAAC,IAAK,CAAA,GAAA,CAAI,GAAG,CAAA;AACf,MAAK,IAAA,CAAA,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA;AAEvB,EAAA,OAAO,CAAC,GAAG,IAAK,CAAA,MAAA,EAAQ,CAAA;AAC1B;AAEA,MAAM,MAAA,GAAS,CAAC,CAAe,KAAA;AAC7B,EAAA,OAAA,CAAQ,MAAM,CAAC,CAAA;AACjB,CAAA;AACO,MAAM,OAGT,GAAA,CAAoB,CAAyB,EAAA,OAAA,GAAU,MAAW,KAAA;AACpE,EAAI,IAAA;AACF,IAAA,MAAM,SAAS,CAAE,EAAA;AAEjB,IAAA,IAAI,MAAkB,YAAA,OAAA;AACpB,MAAO,OAAA,MAAA,CAAO,MAAM,OAAO,CAAA;AAE7B,IAAO,OAAA,MAAA;AAAA,WAEF,CAAG,EAAA;AACR,IAAA,OAAO,QAAQ,CAAC,CAAA;AAAA;AAEpB;AA4BO,MAAM,mBAAmB,MAA4C;AAC1E,EAAM,MAAA,KAAA,uBAAY,GAAkC,EAAA;AAEpD,EAAM,MAAA,OAAA,GAAU,CAAC,OAAwB,KAAA;AACvC,IAAM,MAAA,gBAAA,GAAmB,OACtB,CAAA,IAAA,CAAK,CAAa,QAAA,MAAA;AAAA,MACjB,OAAS,EAAA,gBAAA;AAAA,MACT,OAAS,EAAA;AAAA,QACP,MAAQ,EAAA,WAAA;AAAA,QACR,KAAO,EAAA;AAAA;AACT,KACF,CAAE,CACD,CAAA,KAAA,CAAM,CAAa,QAAA,MAAA;AAAA,MAClB,OAAS,EAAA,gBAAA;AAAA,MACT,OAAS,EAAA;AAAA,QACP,MAAQ,EAAA,UAAA;AAAA,QACR,MAAQ,EAAA;AAAA;AACV,KACA,CAAA,CAAA;AAEJ,IAAA,KAAA,CAAM,IAAI,gBAAgB,CAAA;AAAA,GAC5B;AAEA,EAAA,MAAM,UAAU,YAAY;AAC1B,IAAA,MAAM,EAAE,OAAS,EAAA,OAAA,KAAY,MAAM,OAAA,CAAQ,KAAmC,KAAK,CAAA;AACnF,IAAA,KAAA,CAAM,OAAO,OAAO,CAAA;AACpB,IAAO,OAAA,OAAA;AAAA,GACT;AAEA,EAAO,OAAA;AAAA,IACL,OAAA;AAAA,IAEA,QAAS,MAAO,CAAA,aAAa,CAAI,GAAA;AAC/B,MAAA,OAAO,KAAM,CAAA,IAAA;AACX,QAAA,MAAM,MAAM,OAAQ,EAAA;AAAA;AACxB,GACF;AACF;AAEa,MAAA,kBAAA,GAAqB,OAAsB,OAA8C,KAAA;AACpG,EAAA,MAAM,EAAE,QAAA,EAAU,QAAS,EAAA,GAAI,IAAI,eAAsB,EAAA;AAEzD,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,OAAA,CAAQ,MAAQ,EAAA,CAAA,EAAA;AAClC,IAAM,MAAA,OAAA,CAAQ,CAAC,CAAA,CAAE,MAAO,CAAA,QAAA,EAAU,EAAE,YAAA,EAAc,CAAI,GAAA,CAAA,KAAM,OAAQ,CAAA,MAAA,EAAQ,CAAA;AAE9E,EAAO,OAAA,QAAA;AACT;AAEO,MAAM,UAAa,GAAA,OAAO,IAAc,EAAA,OAAA,GAAuB,EAAO,KAAA;AAC3E,EAAA,MAAM,EAAE,OAAS,EAAA,kBAAA,EAAqB,SAAS,WAAY,EAAA,GAAI,QAAQ,aAAoB,EAAA;AAC3F,EAAA,MAAM,EAAE,OAAS,EAAA,mBAAA,EAAqB,SAAS,WAAY,EAAA,GAAI,QAAQ,aAAoB,EAAA;AAE3F,EAAI,IAAA;AACF,IAAA,SAAA,CAAU,KAAM,CAAA,OAAA,CAAQ,IAAM,EAAA,OAAA,EAAS,MAAM;AAC3C,MAAY,WAAA,EAAA;AACZ,MAAO,OAAA,mBAAA;AAAA,KACR,CAAA;AAAA,GACK,CAAA,MAAA;AAAA;AAER,EAAM,MAAA,kBAAA;AAEN,EAAA,OAAO,MAAM;AACX,IAAY,WAAA,EAAA;AAAA,GACd;AACF;AAEO,MAAM,KAAQ,GAAA,CAAC,IAAc,EAAA,EAAA,EAAY,WAAW,CAAM,KAAA;AAC/D,EAAA,MAAM,IAAO,GAAA,IAAA,CAAK,IAAK,CAAA,EAAA,GAAK,IAAI,CAAA;AAChC,EAAA,IAAI,IAAS,KAAA,CAAA;AACX,IAAA,OAAO,EAAC;AAEV,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,IAAS,CAAI,GAAA,IAAA,EAAM,CAAI,GAAA,EAAA,EAAI,KAAK,IAAO,GAAA,QAAA;AACrC,IAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AACf,EAAO,OAAA,MAAA;AACT;AAEa,MAAA,QAAA,GAAW,MACtB,IAAK,CAAA,MAAA,GAAS,QAAS,CAAA,EAAE,CAAE,CAAA,KAAA,CAAM,CAAC;AAE7B,MAAM,aAAa,MAAO,CAAA,YAAA,CAAa,GAAG,KAAM,CAAA,EAAA,EAAI,GAAG,CAAC;AAExD,MAAM,qBAAqB,CAAC;AAAA,EACjC,MAAS,GAAA,EAAA;AAAA,EACT,UAAa,GAAA;AACf,CAAA,GAII,EAAO,KAAA;AACT,EAAA,MAAM,mBAAsB,GAAA,CAAA;AAC5B,EAAA,MAAM,qBAAqB,CAAK,IAAA,mBAAA;AAEhC,EAAA,IAAI,WAAW,MAAS,GAAA,kBAAA;AACtB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAoB,iBAAA,EAAA,UAAA,CAAW,MAAM,CAA6B,2BAAA,CAAA,CAAA;AAEpF,EAAM,MAAA,KAAA,GAAQ,kBAAsB,GAAA,kBAAA,GAAqB,UAAW,CAAA,MAAA;AAEpE,EAAA,MAAM,yBAAmC,EAAC;AAC1C,EAAO,OAAA,sBAAA,CAAuB,SAAS,MAAQ,EAAA;AAC7C,IAAA,MAAM,eAAe,MAAO,CAAA,eAAA;AAAA,MAC1B,IAAI,UAAA,CAAW,MAAS,GAAA,sBAAA,CAAuB,MAAM;AAAA,KACvD;AACA,IAAA,KAAA,MAAW,WAAe,IAAA,YAAA;AACxB,MAAA,IAAI,WAAc,GAAA,KAAA;AAChB,QAAA,sBAAA,CAAuB,KAAK,WAAW,CAAA;AAAA;AAG7C,EAAA,IAAI,MAAS,GAAA,EAAA;AACb,EAAA,KAAA,MAAW,CAAK,IAAA,sBAAA;AACd,IAAU,MAAA,IAAA,UAAA,CAAW,CAAI,GAAA,UAAA,CAAW,MAAM,CAAA;AAC5C,EAAO,OAAA,MAAA;AACT;AAEO,MAAM,IAAO,GAAA,OAClB,IACA,EAAA,SAAA,GAAiC,SAC9B,KAAA;AACH,EAAA,IAAI,OAAO,IAAS,KAAA,QAAA;AAClB,IAAA,IAAA,GAAO,IAAI,WAAA,EAAc,CAAA,MAAA,CAAO,IAAI,CAAA;AAEtC,EAAA,MAAM,QAAQ,IAAI,UAAA;AAAA,IAChB,MAAM,MAAA,CAAO,MAAO,CAAA,MAAA,CAAO,WAAW,IAAI;AAAA,GAC5C;AAEA,EAAA,IAAI,MAAS,GAAA,EAAA;AACb,EAAA,KAAA,MAAW,IAAQ,IAAA,KAAA;AACjB,IAAA,MAAA,IAAU,KAAK,QAAS,CAAA,EAAE,CAAE,CAAA,QAAA,CAAS,GAAG,GAAG,CAAA;AAC7C,EAAO,OAAA,MAAA;AACT;AAKO,MAAM,cAAc,CAAC,CAAA,KAAc,CAAE,CAAA,OAAA,CAAQ,uBAAuB,MAAM;AAEpE,MAAA,QAAA,GAAW,CACvB,OAAA,EAAA,GACG,aACC,KAAA;AACJ,EAAA,IAAI,MAAS,GAAA,EAAA;AACb,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,OAAA,CAAQ,MAAQ,EAAA,CAAA,EAAA;AACnC,IAAU,MAAA,IAAA,OAAA,CAAQ,IAAI,CAAC,CAAA,GAAI,aAAa,aAAc,CAAA,CAAC,CAAK,IAAA,EAAA,IAAM,EAAE,CAAA;AACrE,EAAA,OAAO,CAAC,KAAA,KAAmB,IAAI,MAAA,CAAO,QAAQ,KAAK,CAAA;AACpD;AAEa,MAAA,MAAA,GAAS,CAAC,OAAA,EAAA,GAAkC,aAA0C,KAAA;AAClG,EAAA,IAAI,MAAS,GAAA,EAAA;AACb,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,OAAA,CAAQ,MAAQ,EAAA,CAAA,EAAA;AACnC,IAAU,MAAA,IAAA,OAAA,CAAQ,CAAC,CAAI,GAAA,kBAAA,CAAA,CAAoB,cAAc,CAAC,CAAA,IAAK,MAAM,EAAE,CAAA;AACxE,EAAO,OAAA,MAAA;AACR;AAOa,MAAA,SAAA,GAAY,CAAC,GAAA,EAAmB,CAA8C,KAAA;AAC1F,EAAI,IAAA;AACH,IAAM,MAAA,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,MAAA,CAAO,MAAO,CAAA,MAAA,EAAQ,CAAE,CAAA,MAAM,CAAC,CAAA;AAC/B,IAAA,OAAO,MAAO,CAAA,IAAA;AAAA,GACP,CAAA,MAAA;AAAA;AAER,EAAM,MAAA,KAAA,GAAS,GAAe,CAAA,KAAA,CAAM,2BAA2B,CAAA;AAC/D,EAAA,IAAI,CAAC,KAAA;AACF,IAAO,OAAA,GAAA;AAEV,EAAM,MAAA,GAAG,QAAW,GAAA,EAAA,EAAI,SAAS,EAAIA,EAAAA,KAAAA,GAAO,EAAE,CAAI,GAAA,KAAA;AAElD,EAAA,MAAM,UAAa,GAAA,EAAE,QAAU,EAAA,MAAA,EAAQ,MAAAA,KAAK,EAAA;AAC5C,EAAA,MAAM,QAAQ,EAAE,GAAG,YAAY,GAAG,CAAA,CAAE,UAAU,CAAE,EAAA;AAChD,EACC,OAAA,KAAA,CAAM,YACL,KAAM,CAAA,MAAA,GAAS,MAAM,KAAM,CAAA,MAAA,CAAO,OAAQ,CAAA,MAAA,EAAQ,EAAE,CAAA,GAAI,OACxD,KAAM,CAAA,IAAA,GAAO,MAAM,kBAAmB,CAAA,KAAA,CAAM,KAAK,OAAQ,CAAA,KAAA,EAAO,EAAE,CAAC,CAAI,GAAA,EAAA,CAAA;AAE1E;AAEa,MAAA,aAAA,GAAgB,CAC5B,GACA,EAAA,gBAAA,KAEA,UAAU,GAAK,EAAA,CAAC,EAAE,MAAA,EAAa,KAAA;AAC9B,EAAM,MAAA,YAAA,GAAe,IAAI,eAAA,CAAgB,MAAM,CAAA;AAE/C,EAAA,KAAA,MAAW,OAAO,gBAAkB,EAAA;AACnC,IAAA,YAAA,CAAa,OAAO,GAAG,CAAA;AACvB,IAAM,MAAA,aAAA,GAAgB,iBAAiB,GAAG,CAAA;AAC1C,IAAA,IAAI,kBAAkB,MAAW,EAAA;AAEjC,IAAI,IAAA,KAAA,CAAM,QAAQ,aAAa,CAAA;AAC9B,MAAA,KAAA,MAAW,KAAS,IAAA,aAAA;AACnB,QAAa,YAAA,CAAA,MAAA,CAAO,GAAK,EAAA,KAAA,GAAQ,EAAE,CAAA;AAAA;AAEhC,MAAa,YAAA,CAAA,MAAA,CAAO,GAAM,EAAA,aAAA,GAAmC,EAAE,CAAA;AAAA;AAErE,EAAA,YAAA,CAAa,IAAK,EAAA;AAElB,EAAA,OAAO,EAAE,MAAA,EAAQ,YAAa,CAAA,QAAA,EAAW,EAAA;AAC1C,CAAC;AAEK,MAAM,gBAAmD,CAAA;AAAA,EAC9D,KAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EAEA,WAAA,CAAY,MAAkB,MAAkC,EAAA;AAC9D,IAAK,IAAA,CAAA,QAAA,GAAW,KAAK,KAAQ,GAAA,IAAA;AAC7B,IAAA,IAAA,CAAK,OAAU,GAAA,MAAA;AAAA;AACjB,EAEA,WAAc,GAAA,KAAA;AAAA;AAAA,EAEd,IAAO,GAAA;AACL,IAAA,IAAA,CAAK,WAAc,GAAA,IAAA;AAAA;AACrB,EAEA,KAAQ,GAAA;AACN,IAAA,IAAI,UAAU,IAAK,CAAA,QAAA;AACnB,IAAA,OAAO,IAAM,EAAA;AACX,MAAA,MAAM,aAAa,IAAK,CAAA,WAAA;AACxB,MAAA,IAAA,CAAK,WAAc,GAAA,KAAA;AAEnB,MAAI,IAAA,CAAC,UAAc,IAAA,OAAA,CAAQ,UAAY,EAAA;AACrC,QAAA,OAAA,GAAU,OAAQ,CAAA,UAAA;AAAA,OACpB,MAAA,IACS,QAAQ,WAAa,EAAA;AAC5B,QAAA,IAAI,YAAY,IAAK,CAAA,KAAA;AACnB,UAAA;AAEF,QAAA,OAAA,GAAU,OAAQ,CAAA,WAAA;AAAA,OAEf,MAAA;AACH,QAAA,OAAO,IAAM,EAAA;AACX,UAAA,IAAI,CAAC,OAAA,CAAQ,UAAc,IAAA,OAAA,KAAY,IAAK,CAAA,KAAA;AAC1C,YAAA;AAEF,UAAA,MAAM,SAAS,OAAQ,CAAA,UAAA;AACvB,UAAA,IAAI,WAAW,IAAK,CAAA,KAAA;AAClB,YAAA;AAEF,UAAA,IAAI,OAAO,WAAa,EAAA;AACtB,YAAA,OAAA,GAAU,MAAO,CAAA,WAAA;AACjB,YAAA;AAAA,WAEG,MAAA;AACH,YAAU,OAAA,GAAA,MAAA;AAAA;AACZ;AACF;AAGF,MAAA,IAAI,CAAC,IAAA,CAAK,OAAW,IAAA,IAAA,CAAK,QAAQ,OAAO,CAAA;AACvC,QAAA,OAAO,KAAK,QAAW,GAAA,OAAA;AAAA;AAC3B;AACF,EAEA,IAAO,GAAA;AACL,IAAM,MAAA,KAAA,GAAQ,KAAK,KAAM,EAAA;AACzB,IAAA,OAAO,EAAE,IAAA,EAAM,CAAC,KAAA,EAAO,KAAM,EAAA;AAAA;AAG/B,EAEA,CAAC,MAAO,CAAA,QAAQ,CAAI,GAAA;AAClB,IAAO,OAAA,IAAA;AAAA;AAEX;AAEa,MAAA,aAAA,GAAgB,CAAC,SAAA,EAAsB,UAA6C,KAAA;AAChG,EAAMC,MAAAA,MAAAA,GAAQ,SAAU,CAAA,aAAA,CAAe,WAAY,EAAA;AAEnD,EAAAA,MAAAA,CAAM,eAAe,SAAS,CAAA;AAE9B,EAAI,IAAA,QAAA;AACJ,EAAA,KAAA,IACK,WAAgC,GAAA,SAAA,EACnC,WAAc,GAAA,WAAA,CAAY,aAC3B,WACC,EAAA;AACD,IAAI,IAAA,UAAA,CAAW,WAAW,CAAG,EAAA;AAC5B,MAAW,QAAA,GAAA,WAAA;AACX,MAAA;AAAA;AACD;AAED,EAAA,QAAA,KAAa,UAAU,UAAY,CAAA,SAAA;AAEnC,EAAAA,MAAAA,CAAM,YAAY,QAAQ,CAAA;AAE1B,EAAOA,OAAAA,MAAAA;AACR;AAQO,MAAM,uBAAuB,CACnCC,EAAAA,EACA,CACA,EAAA,IAAA,GAAmB,EACgC,KAAA;AACnD,EAAI,IAAA,CAAA,CAAEA,EAAC,CAAG,EAAA,OAAO,CAAC,EAAE,IAAA,EAAM,KAAOA,EAAAA,EAAAA,EAAG,CAAA;AAEpC,EAAI,IAAA,KAAA,CAAM,QAAQA,EAAC,CAAA;AAClB,IAAA,OAAOA,EAAE,CAAA,OAAA;AAAA,MAAQ,CAAC,CAAG,EAAA,CAAA,KACpB,oBAAqB,CAAA,CAAA,EAAG,GAAG,CAAC,GAAG,IAAM,EAAA,EAAE,QAAQA,EAAG,EAAA,GAAA,EAAK,GAAG,KAAO,EAAA,CAAA,EAAG,CAAC;AAAA,KACtE;AAED,EAAIA,IAAAA,EAAAA,KAAM,IAAQ,IAAA,OAAOA,EAAM,KAAA,QAAA;AAC9B,IAAO,OAAA,MAAA,CAAO,OAAQA,CAAAA,EAAC,CAAE,CAAA,OAAA;AAAA,MAAQ,CAAC,CAAC,CAAA,EAAG,CAAC,CACtC,KAAA,oBAAA,CAAqB,GAAG,CAAG,EAAA,CAAC,GAAG,IAAM,EAAA,EAAE,QAAQA,EAAG,EAAA,GAAA,EAAK,GAAG,KAAO,EAAA,CAAA,EAAG,CAAC;AAAA,KACtE;AAED,EAAA,OAAO,EAAC;AACT;;;;"}
package/package.json CHANGED
@@ -10,7 +10,7 @@
10
10
  "library",
11
11
  "modern"
12
12
  ],
13
- "version": "1.13.1",
13
+ "version": "2.0.0-beta.1",
14
14
  "license": "MIT",
15
15
  "author": {
16
16
  "name": "Daniel Ethridge",
@@ -24,40 +24,143 @@
24
24
  "directory": "packages/bruh"
25
25
  },
26
26
  "type": "module",
27
- "main": "./dist/bruh.umd.js",
28
27
  "sideEffects": false,
29
28
  "exports": {
30
- ".": {
31
- "browser": "./dist/bruh.es.js",
32
- "default": "./dist/bruh.umd.js"
29
+ "./browser": {
30
+ "types": "./dist/types/dom/index.browser.d.mts",
31
+ "default": "./dist/browser.mjs"
33
32
  },
34
- "./dom": {
35
- "node": "./src/dom/index.server.mjs",
36
- "browser": "./src/dom/index.browser.mjs"
33
+ "./browser/jsx-runtime": {
34
+ "types": "./dist/types/dom/browser/jsx-runtime.d.mts",
35
+ "default": "./dist/browser/jsx-runtime.mjs"
36
+ },
37
+ "./browser/jsx-dev-runtime": {
38
+ "types": "./dist/types/dom/browser/jsx-runtime.d.mts",
39
+ "default": "./dist/browser/jsx-runtime.mjs"
40
+ },
41
+ "./server": {
42
+ "types": "./dist/types/dom/index.server.d.mts",
43
+ "default": "./dist/server.mjs"
44
+ },
45
+ "./server/jsx-runtime": {
46
+ "types": "./dist/types/dom/server/jsx-runtime.d.mts",
47
+ "default": "./dist/server/jsx-runtime.mjs"
48
+ },
49
+ "./server/jsx-dev-runtime": {
50
+ "types": "./dist/types/dom/server/jsx-runtime.d.mts",
51
+ "default": "./dist/server/jsx-runtime.mjs"
52
+ },
53
+ "./reactive": {
54
+ "types": "./dist/types/reactive/index.d.mts",
55
+ "default": "./dist/reactive.mjs"
56
+ },
57
+ "./reactive/sync/transport/websocket/browser": {
58
+ "types": "./dist/types/reactive/sync/transport/websocket/browser.d.mts",
59
+ "default": "./dist/reactive/sync/transport/websocket/browser.mjs"
60
+ },
61
+ "./utils": {
62
+ "types": "./dist/types/utils/index.d.mts",
63
+ "default": "./dist/utils.mjs"
64
+ },
65
+ "./utils/browser": {
66
+ "types": "./dist/types/utils/browser.d.mts",
67
+ "default": "./dist/utils/browser.mjs"
68
+ },
69
+ "./cli": {
70
+ "node": {
71
+ "types": "./dist/types/cli/index.d.mts",
72
+ "default": "./dist/cli/node.mjs"
73
+ }
37
74
  },
38
- "./reactive": "./src/reactive/index.mjs",
39
- "./util": "./src/util/index.mjs",
40
- "./components/*": "./src/components/*.mjs",
41
75
  "./media/images": {
42
- "node": "./src/media/images.node.mjs"
76
+ "node": {
77
+ "types": "./dist/types/media/images.node.d.mts",
78
+ "default": "./dist/media/images/node.mjs"
79
+ }
80
+ },
81
+ "./components/optimized-picture/server": {
82
+ "types": "./dist/types/components/optimized-picture/server.d.ts",
83
+ "default": "./dist/components/optimized-picture/server.mjs"
84
+ },
85
+ "./components/optimized-picture/hydrate": {
86
+ "types": "./dist/types/components/optimized-picture/hydrate.d.mts",
87
+ "default": "./dist/components/optimized-picture/hydrate.mjs"
88
+ },
89
+ "./components/utils": {
90
+ "types": "./dist/types/components/utils.d.mts",
91
+ "default": "./dist/components/utils.mjs"
92
+ },
93
+ "./components/custom-elements": {
94
+ "types": "./dist/types/components/custom-elements.d.mts",
95
+ "default": "./dist/components/custom-elements.mjs"
96
+ },
97
+ "./components/intl/utils": {
98
+ "types": "./dist/types/components/intl/utils.d.mts",
99
+ "default": "./dist/components/intl/utils.mjs"
100
+ },
101
+ "./components/intl/display-name": {
102
+ "types": "./dist/types/components/intl/display-name.d.mts",
103
+ "default": "./dist/components/intl/display-name.mjs"
104
+ },
105
+ "./components/intl/number": {
106
+ "types": "./dist/types/components/intl/number.d.mts",
107
+ "default": "./dist/components/intl/number.mjs"
108
+ },
109
+ "./components/intl/plural": {
110
+ "types": "./dist/types/components/intl/plural.d.mts",
111
+ "default": "./dist/components/intl/plural.mjs"
112
+ },
113
+ "./components/intl/list": {
114
+ "types": "./dist/types/components/intl/list.d.mts",
115
+ "default": "./dist/components/intl/list.mjs"
116
+ },
117
+ "./components/intl/language-picker": {
118
+ "types": "./dist/types/components/intl/language-picker.d.mts",
119
+ "default": "./dist/components/intl/language-picker.mjs"
120
+ },
121
+ "./components/intl/date-time": {
122
+ "types": "./dist/types/components/intl/date-time.d.mts",
123
+ "default": "./dist/components/intl/date-time.mjs"
124
+ },
125
+ "./components/aside-toc": {
126
+ "types": "./dist/types/components/aside-toc.d.mts",
127
+ "default": "./dist/components/aside-toc.mjs"
128
+ },
129
+ "./polyfills/weakref": {
130
+ "types": "./dist/types/polyfills/weakref.d.mts",
131
+ "default": "./dist/polyfills/weakref.mjs"
43
132
  }
44
133
  },
45
- "bin": {
46
- "bruh": "./src/cli/index.mjs"
47
- },
48
134
  "files": [
49
- "./src/",
50
135
  "./dist/"
51
136
  ],
52
137
  "scripts": {
53
138
  "build": "vite build",
54
- "prepare": "npm run build"
139
+ "prepare": "npm run build",
140
+ "test": "vitest",
141
+ "typecheck": "tsc --noEmit",
142
+ "bench": "vitest bench",
143
+ "ts-trace": "tsc --noEmit --incremental false --generateTrace ./ts-trace/",
144
+ "ts-trace-analyze": "analyze-trace ./ts-trace/"
145
+ },
146
+ "dependencies": {
147
+ "csstype": "^3.2.3",
148
+ "html-info": "^0.0.9"
55
149
  },
56
150
  "optionalDependencies": {
57
151
  "cac": "^6.7.14",
58
- "sharp": "^0.31.0"
152
+ "sharp": "^0.34.5"
59
153
  },
60
154
  "devDependencies": {
61
- "vite": "^3.1.0"
155
+ "@types/node": "^25.0.3",
156
+ "@typescript/analyze-trace": "^0.10.1",
157
+ "@vitest/browser": "^4.0.16",
158
+ "playwright": "^1.57.0",
159
+ "rollup-plugin-node-externals": "^8.1.2",
160
+ "typescript": "^5.9.3",
161
+ "vite": "^7.3.0",
162
+ "vite-plugin-dts": "^4.5.4",
163
+ "vite-tsconfig-paths": "^6.0.3",
164
+ "vitest": "^4.0.16"
62
165
  }
63
166
  }