@velarscript/web 0.10.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 (95) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +89 -0
  3. package/dist/analyzer.d.ts +302 -0
  4. package/dist/analyzer.d.ts.map +1 -0
  5. package/dist/analyzer.js +2931 -0
  6. package/dist/analyzer.js.map +1 -0
  7. package/dist/ast.d.ts +220 -0
  8. package/dist/ast.d.ts.map +1 -0
  9. package/dist/ast.js +102 -0
  10. package/dist/ast.js.map +1 -0
  11. package/dist/browser-test.d.ts +29 -0
  12. package/dist/browser-test.d.ts.map +1 -0
  13. package/dist/browser-test.js +33 -0
  14. package/dist/browser-test.js.map +1 -0
  15. package/dist/compiler.d.ts +9 -0
  16. package/dist/compiler.d.ts.map +1 -0
  17. package/dist/compiler.js +715 -0
  18. package/dist/compiler.js.map +1 -0
  19. package/dist/css-tokens.d.ts +46 -0
  20. package/dist/css-tokens.d.ts.map +1 -0
  21. package/dist/css-tokens.js +363 -0
  22. package/dist/css-tokens.js.map +1 -0
  23. package/dist/editor.d.ts +3 -0
  24. package/dist/editor.d.ts.map +1 -0
  25. package/dist/editor.js +147 -0
  26. package/dist/editor.js.map +1 -0
  27. package/dist/elements.d.ts +11 -0
  28. package/dist/elements.d.ts.map +1 -0
  29. package/dist/elements.js +24 -0
  30. package/dist/elements.js.map +1 -0
  31. package/dist/emitter.d.ts +79 -0
  32. package/dist/emitter.d.ts.map +1 -0
  33. package/dist/emitter.js +2699 -0
  34. package/dist/emitter.js.map +1 -0
  35. package/dist/host.d.ts +7 -0
  36. package/dist/host.d.ts.map +1 -0
  37. package/dist/host.js +224 -0
  38. package/dist/host.js.map +1 -0
  39. package/dist/index.d.ts +11 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +23 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/inspection.d.ts +3 -0
  44. package/dist/inspection.d.ts.map +1 -0
  45. package/dist/inspection.js +82 -0
  46. package/dist/inspection.js.map +1 -0
  47. package/dist/keyframes.d.ts +16 -0
  48. package/dist/keyframes.d.ts.map +1 -0
  49. package/dist/keyframes.js +29 -0
  50. package/dist/keyframes.js.map +1 -0
  51. package/dist/lexer.d.ts +85 -0
  52. package/dist/lexer.d.ts.map +1 -0
  53. package/dist/lexer.js +422 -0
  54. package/dist/lexer.js.map +1 -0
  55. package/dist/look-static.d.ts +31 -0
  56. package/dist/look-static.d.ts.map +1 -0
  57. package/dist/look-static.js +266 -0
  58. package/dist/look-static.js.map +1 -0
  59. package/dist/look.d.ts +134 -0
  60. package/dist/look.d.ts.map +1 -0
  61. package/dist/look.js +627 -0
  62. package/dist/look.js.map +1 -0
  63. package/dist/parser.d.ts +71 -0
  64. package/dist/parser.d.ts.map +1 -0
  65. package/dist/parser.js +976 -0
  66. package/dist/parser.js.map +1 -0
  67. package/dist/project-config.d.ts +33 -0
  68. package/dist/project-config.d.ts.map +1 -0
  69. package/dist/project-config.js +199 -0
  70. package/dist/project-config.js.map +1 -0
  71. package/dist/runtime-foundation.d.ts +7 -0
  72. package/dist/runtime-foundation.d.ts.map +1 -0
  73. package/dist/runtime-foundation.js +1245 -0
  74. package/dist/runtime-foundation.js.map +1 -0
  75. package/dist/runtime.d.ts +7 -0
  76. package/dist/runtime.d.ts.map +1 -0
  77. package/dist/runtime.js +3444 -0
  78. package/dist/runtime.js.map +1 -0
  79. package/dist/semantic.d.ts +3 -0
  80. package/dist/semantic.d.ts.map +1 -0
  81. package/dist/semantic.js +150 -0
  82. package/dist/semantic.js.map +1 -0
  83. package/dist/types.d.ts +56 -0
  84. package/dist/types.d.ts.map +1 -0
  85. package/dist/types.js +178 -0
  86. package/dist/types.js.map +1 -0
  87. package/dist/websocket-runtime.d.ts +2 -0
  88. package/dist/websocket-runtime.d.ts.map +1 -0
  89. package/dist/websocket-runtime.js +30 -0
  90. package/dist/websocket-runtime.js.map +1 -0
  91. package/dist/worker-runtime.d.ts +2 -0
  92. package/dist/worker-runtime.d.ts.map +1 -0
  93. package/dist/worker-runtime.js +72 -0
  94. package/dist/worker-runtime.js.map +1 -0
  95. package/package.json +52 -0
@@ -0,0 +1,3444 @@
1
+ import { VELAR_ERROR_NORMALIZATION_RUNTIME, VELAR_RUNTIME_REGISTRY_KEY, VELAR_RUNTIME_SCHEMA_VERSION, VELAR_STRICT_JSON_RUNTIME, VELAR_TEXT_METHOD_RUNTIME, VELAR_TYPE_REGISTRY_RUNTIME, VELAR_UTF8_RUNTIME, } from "@velarscript/compiler/extension";
2
+ import { WEB_DOM_HOST_RUNTIME, WEB_ERROR_HOST_RUNTIME, WEB_RUNTIME_FOUNDATION } from "./runtime-foundation.js";
3
+ import { VELAR_WEB_WORKER_RUNTIME } from "./worker-runtime.js";
4
+ import { VELAR_WEB_WEBSOCKET_RUNTIME } from "./websocket-runtime.js";
5
+ const ownedCallbackRuntime = String.raw `
6
+ ${WEB_ERROR_HOST_RUNTIME}
7
+ const __velarOwnedReflectApply = Object.getOwnPropertyDescriptor(Reflect, "apply")?.value;
8
+ const __velarOwnedQueueMicrotask = globalThis.queueMicrotask;
9
+ function __velarOwnedEnqueue(callback) {
10
+ if (typeof __velarOwnedQueueMicrotask !== "function" || typeof __velarOwnedReflectApply !== "function") {
11
+ throw new TypeError("The browser queueMicrotask API is unavailable");
12
+ }
13
+ return __velarOwnedReflectApply(__velarOwnedQueueMicrotask, globalThis, [callback]);
14
+ }
15
+ function __velarReportOwnedCallback(failure, phase, detail) {
16
+ const error = __velarNormalizeError(failure);
17
+ const runtime = globalThis[Symbol.for(${JSON.stringify(VELAR_RUNTIME_REGISTRY_KEY)})];
18
+ if (runtime && typeof runtime.report === "function") runtime.report(error, { phase, detail, unhandled: true });
19
+ else __velarOwnedEnqueue(() => { throw error; });
20
+ }
21
+ function __velarInvokeOwnedCallback(callback, arguments_, phase, detail) {
22
+ if (callback == null) return;
23
+ try {
24
+ const result = callback(...arguments_);
25
+ __velarObservePromise(result, (failure) => __velarReportOwnedCallback(failure, phase, detail));
26
+ } catch (failure) {
27
+ __velarReportOwnedCallback(failure, phase, detail);
28
+ }
29
+ }
30
+ function __velarInvokeOwnedRead(read, callback, phase, detail) {
31
+ try { __velarInvokeOwnedCallback(callback, [read()], phase, detail); }
32
+ catch (failure) { __velarReportOwnedCallback(failure, phase, detail); }
33
+ }
34
+ `.trimStart();
35
+ const fileRegistryRuntime = String.raw `
36
+ const nativeFilesKey = Symbol.for("velar.file.registry.v1");
37
+ const nativeFiles = (() => {
38
+ const descriptor = Object.getOwnPropertyDescriptor(globalThis, nativeFilesKey);
39
+ if (descriptor) {
40
+ if (!("value" in descriptor)) throw new TypeError("VelarScript file registry cannot be an accessor");
41
+ if (descriptor.configurable || descriptor.enumerable || descriptor.writable) throw new TypeError("VelarScript file registry ownership is invalid");
42
+ try { WeakMap.prototype.has.call(descriptor.value, descriptor.value); }
43
+ catch { throw new TypeError("VelarScript file registry is invalid"); }
44
+ return descriptor.value;
45
+ }
46
+ const registry = new WeakMap();
47
+ Object.defineProperty(globalThis, nativeFilesKey, { value: registry, enumerable: false, configurable: false, writable: false });
48
+ return registry;
49
+ })();
50
+ const __velarNativeFileName = typeof File === "function" ? Object.getOwnPropertyDescriptor(File.prototype, "name")?.get : null;
51
+ const __velarNativeFileModified = typeof File === "function" ? Object.getOwnPropertyDescriptor(File.prototype, "lastModified")?.get : null;
52
+ const __velarNativeBlobSize = typeof Blob === "function" ? Object.getOwnPropertyDescriptor(Blob.prototype, "size")?.get : null;
53
+ const __velarNativeBlobType = typeof Blob === "function" ? Object.getOwnPropertyDescriptor(Blob.prototype, "type")?.get : null;
54
+ const __velarNativeBlobText = typeof Blob === "function" ? Object.getOwnPropertyDescriptor(Blob.prototype, "text")?.value : null;
55
+ function __velarReadNativeFileField(operation, file) {
56
+ if (typeof operation !== "function") throw new TypeError("The browser does not expose the required native File API");
57
+ try { return operation.call(file); }
58
+ catch { throw new TypeError("A file picker returned an invalid native File"); }
59
+ }
60
+ function __velarNativeFile(value, message) {
61
+ const file = value && WeakMap.prototype.get.call(nativeFiles, value);
62
+ if (!file) throw new TypeError(message);
63
+ try {
64
+ if (typeof __velarNativeFileName !== "function") throw new TypeError();
65
+ __velarNativeFileName.call(file);
66
+ } catch { throw new TypeError(message); }
67
+ return file;
68
+ }
69
+ `.trimStart();
70
+ const listRuntime = String.raw `
71
+ const __velarMaxListItems = 1000000;
72
+ const __velarListNativeArray = globalThis.Array;
73
+ const __velarListNativeObject = globalThis.Object;
74
+ const __velarListNativeSymbol = globalThis.Symbol;
75
+ const __velarListReflectApply = Object.getOwnPropertyDescriptor(Reflect, "apply")?.value;
76
+ const __velarListArrayIsArray = Object.getOwnPropertyDescriptor(Array, "isArray")?.value;
77
+ const __velarListGetOwnPropertySymbols = Object.getOwnPropertyDescriptor(Object, "getOwnPropertySymbols")?.value;
78
+ const __velarListGetOwnPropertyNames = Object.getOwnPropertyDescriptor(Object, "getOwnPropertyNames")?.value;
79
+ const __velarListGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor(Object, "getOwnPropertyDescriptor")?.value;
80
+ const __velarListDefineProperty = Object.getOwnPropertyDescriptor(Object, "defineProperty")?.value;
81
+ const __velarListSymbolFor = Object.getOwnPropertyDescriptor(Symbol, "for")?.value;
82
+ const __velarListRuntimeKey = typeof __velarListReflectApply === "function" && typeof __velarListSymbolFor === "function"
83
+ ? __velarListReflectApply(__velarListSymbolFor, __velarListNativeSymbol, [${JSON.stringify(VELAR_RUNTIME_REGISTRY_KEY)}]) : null;
84
+ const __velarListIterateKey = typeof __velarListReflectApply === "function" && typeof __velarListSymbolFor === "function"
85
+ ? __velarListReflectApply(__velarListSymbolFor, __velarListNativeSymbol, ["velar.reactive.iterate.v1"]) : null;
86
+ function __velarRequireListIntrinsics() {
87
+ if (typeof __velarListNativeArray !== "function" || typeof __velarListNativeObject !== "function"
88
+ || typeof __velarListReflectApply !== "function" || typeof __velarListArrayIsArray !== "function"
89
+ || typeof __velarListGetOwnPropertySymbols !== "function" || typeof __velarListGetOwnPropertyNames !== "function"
90
+ || typeof __velarListGetOwnPropertyDescriptor !== "function" || typeof __velarListDefineProperty !== "function"
91
+ || __velarListRuntimeKey === null || __velarListIterateKey === null) {
92
+ throw new TypeError("The Web List guard intrinsics are unavailable");
93
+ }
94
+ }
95
+ function __velarListReactiveRuntime() {
96
+ __velarRequireListIntrinsics();
97
+ const descriptor = __velarListReflectApply(__velarListGetOwnPropertyDescriptor, __velarListNativeObject, [globalThis, __velarListRuntimeKey]);
98
+ const runtime = descriptor && "value" in descriptor ? descriptor.value : null;
99
+ return runtime && runtime.version === ${JSON.stringify(VELAR_RUNTIME_SCHEMA_VERSION)} && typeof runtime.toRaw === "function"
100
+ && typeof runtime.collectionRead === "function" ? runtime : null;
101
+ }
102
+ function __velarRequireList(value, name) {
103
+ __velarRequireListIntrinsics();
104
+ const reactive = __velarListReactiveRuntime();
105
+ if (reactive) value = reactive.toRaw(value);
106
+ if (!__velarListReflectApply(__velarListArrayIsArray, __velarListNativeArray, [value])) throw new TypeError(name + " requires a List");
107
+ if (value.length > __velarMaxListItems) throw new RangeError(name + " cannot exceed " + __velarMaxListItems + " items");
108
+ if (__velarListReflectApply(__velarListGetOwnPropertySymbols, __velarListNativeObject, [value]).length > 0
109
+ || __velarListReflectApply(__velarListGetOwnPropertyNames, __velarListNativeObject, [value]).length !== value.length + 1) {
110
+ throw new TypeError(name + " requires a dense List without extra fields");
111
+ }
112
+ const lengthDescriptor = __velarListReflectApply(__velarListGetOwnPropertyDescriptor, __velarListNativeObject, [value, "length"]);
113
+ if (!lengthDescriptor || !lengthDescriptor.writable || lengthDescriptor.enumerable
114
+ || lengthDescriptor.configurable || !("value" in lengthDescriptor)) {
115
+ throw new TypeError(name + " requires an ordinary mutable List length");
116
+ }
117
+ const output = new __velarListNativeArray(value.length);
118
+ for (let index = 0; index < value.length; index += 1) {
119
+ const descriptor = __velarListReflectApply(__velarListGetOwnPropertyDescriptor, __velarListNativeObject, [value, index]);
120
+ if (!descriptor?.enumerable || !descriptor.configurable || !descriptor.writable || !("value" in descriptor)) {
121
+ throw new TypeError(name + " requires ordinary mutable List elements");
122
+ }
123
+ const item = reactive ? reactive.collectionRead(value, __velarListIterateKey, descriptor.value) : descriptor.value;
124
+ __velarListReflectApply(__velarListDefineProperty, __velarListNativeObject, [output, index, {
125
+ value: item, enumerable: true, configurable: true, writable: true,
126
+ }]);
127
+ }
128
+ return output;
129
+ }
130
+ `.trimStart();
131
+ const optionsRuntime = String.raw `
132
+ const __velarOptionsNativeArray = globalThis.Array;
133
+ const __velarOptionsNativeObject = globalThis.Object;
134
+ const __velarOptionsNativeSet = globalThis.Set;
135
+ const __velarOptionsReflectApply = Object.getOwnPropertyDescriptor(Reflect, "apply")?.value;
136
+ const __velarOptionsArrayIsArray = Object.getOwnPropertyDescriptor(Array, "isArray")?.value;
137
+ const __velarOptionsGetPrototypeOf = Object.getOwnPropertyDescriptor(Object, "getPrototypeOf")?.value;
138
+ const __velarOptionsGetOwnPropertySymbols = Object.getOwnPropertyDescriptor(Object, "getOwnPropertySymbols")?.value;
139
+ const __velarOptionsGetOwnPropertyNames = Object.getOwnPropertyDescriptor(Object, "getOwnPropertyNames")?.value;
140
+ const __velarOptionsGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor(Object, "getOwnPropertyDescriptor")?.value;
141
+ const __velarOptionsCreate = Object.getOwnPropertyDescriptor(Object, "create")?.value;
142
+ const __velarOptionsFreeze = Object.getOwnPropertyDescriptor(Object, "freeze")?.value;
143
+ const __velarOptionsSetHas = Object.getOwnPropertyDescriptor(Set.prototype, "has")?.value;
144
+ const __velarOptionsSetAdd = Object.getOwnPropertyDescriptor(Set.prototype, "add")?.value;
145
+ const __velarOptionsObjectPrototype = Object.prototype;
146
+ function __velarRequireOptionsIntrinsics() {
147
+ if (typeof __velarOptionsNativeArray !== "function" || typeof __velarOptionsNativeObject !== "function"
148
+ || typeof __velarOptionsNativeSet !== "function" || typeof __velarOptionsReflectApply !== "function"
149
+ || typeof __velarOptionsArrayIsArray !== "function" || typeof __velarOptionsGetPrototypeOf !== "function"
150
+ || typeof __velarOptionsGetOwnPropertySymbols !== "function" || typeof __velarOptionsGetOwnPropertyNames !== "function"
151
+ || typeof __velarOptionsGetOwnPropertyDescriptor !== "function" || typeof __velarOptionsCreate !== "function"
152
+ || typeof __velarOptionsFreeze !== "function" || typeof __velarOptionsSetHas !== "function"
153
+ || typeof __velarOptionsSetAdd !== "function") {
154
+ throw new TypeError("The Web options guard intrinsics are unavailable");
155
+ }
156
+ }
157
+ function __velarOptionFields(fields) {
158
+ __velarRequireOptionsIntrinsics();
159
+ if (!__velarOptionsReflectApply(__velarOptionsArrayIsArray, __velarOptionsNativeArray, [fields])) {
160
+ throw new TypeError("Web option fields must be an internal List");
161
+ }
162
+ const allowed = new __velarOptionsNativeSet();
163
+ for (let index = 0; index < fields.length; index += 1) {
164
+ if (typeof fields[index] !== "string") throw new TypeError("Web option fields must be text");
165
+ __velarOptionsReflectApply(__velarOptionsSetAdd, allowed, [fields[index]]);
166
+ }
167
+ return allowed;
168
+ }
169
+ function __velarFreezeOptionsValue(value) {
170
+ __velarRequireOptionsIntrinsics();
171
+ return __velarOptionsReflectApply(__velarOptionsFreeze, __velarOptionsNativeObject, [value]);
172
+ }
173
+ function __velarOptions(value, name, allowed) {
174
+ __velarRequireOptionsIntrinsics();
175
+ let prototype = null;
176
+ if (value && typeof value === "object") {
177
+ prototype = __velarOptionsReflectApply(__velarOptionsGetPrototypeOf, __velarOptionsNativeObject, [value]);
178
+ }
179
+ if (!value || typeof value !== "object"
180
+ || __velarOptionsReflectApply(__velarOptionsArrayIsArray, __velarOptionsNativeArray, [value])
181
+ || (prototype !== __velarOptionsObjectPrototype && prototype !== null)) {
182
+ throw new TypeError(name + " must be a record");
183
+ }
184
+ if (__velarOptionsReflectApply(__velarOptionsGetOwnPropertySymbols, __velarOptionsNativeObject, [value]).length > 0) {
185
+ throw new TypeError(name + " cannot contain symbol fields");
186
+ }
187
+ const output = __velarOptionsReflectApply(__velarOptionsCreate, __velarOptionsNativeObject, [null]);
188
+ const keys = __velarOptionsReflectApply(__velarOptionsGetOwnPropertyNames, __velarOptionsNativeObject, [value]);
189
+ for (let index = 0; index < keys.length; index += 1) {
190
+ const key = keys[index];
191
+ if (!__velarOptionsReflectApply(__velarOptionsSetHas, allowed, [key])) throw new TypeError("Unknown " + name + " field '" + key + "'");
192
+ const descriptor = __velarOptionsReflectApply(__velarOptionsGetOwnPropertyDescriptor, __velarOptionsNativeObject, [value, key]);
193
+ if (!descriptor?.enumerable || !("value" in descriptor)) throw new TypeError(name + " field '" + key + "' must be an enumerable data value");
194
+ output[key] = descriptor.value;
195
+ }
196
+ return __velarFreezeOptionsValue(output);
197
+ }
198
+ function __velarString(value, name) { if (typeof value !== "string") throw new TypeError(name + " must be a string"); return value; }
199
+ function __velarBool(value, name) { if (typeof value !== "boolean") throw new TypeError(name + " must be bool"); return value; }
200
+ `.trimStart();
201
+ const webHostAbiRuntime = String.raw `
202
+ const __velarBrowserMissingField = Object.freeze({});
203
+ const __velarBrowserReflectApply = Object.getOwnPropertyDescriptor(Reflect, "apply")?.value;
204
+ const __velarBrowserGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor(Object, "getOwnPropertyDescriptor")?.value;
205
+ const __velarBrowserGetPrototypeOf = Object.getOwnPropertyDescriptor(Object, "getPrototypeOf")?.value;
206
+ const __velarBrowserHasInstance = Object.getOwnPropertyDescriptor(Function.prototype, Symbol.hasInstance)?.value;
207
+ function __velarBrowserDescriptor(value, name) {
208
+ if ((typeof value !== "object" && typeof value !== "function") || value === null
209
+ || typeof __velarBrowserGetOwnPropertyDescriptor !== "function" || typeof __velarBrowserGetPrototypeOf !== "function") return null;
210
+ let current = value;
211
+ while (current !== null) {
212
+ const descriptor = __velarBrowserReflectApply(__velarBrowserGetOwnPropertyDescriptor, Object, [current, name]);
213
+ if (descriptor) return descriptor;
214
+ current = __velarBrowserReflectApply(__velarBrowserGetPrototypeOf, Object, [current]);
215
+ }
216
+ return null;
217
+ }
218
+ function __velarBrowserOwnDataField(value, name) {
219
+ if ((typeof value !== "object" && typeof value !== "function") || value === null
220
+ || typeof __velarBrowserGetOwnPropertyDescriptor !== "function") return __velarBrowserMissingField;
221
+ const descriptor = __velarBrowserReflectApply(__velarBrowserGetOwnPropertyDescriptor, Object, [value, name]);
222
+ return descriptor?.enumerable && "value" in descriptor ? descriptor.value : __velarBrowserMissingField;
223
+ }
224
+ function __velarBrowserDataMethod(value, name) {
225
+ const descriptor = __velarBrowserDescriptor(value, name);
226
+ return descriptor && "value" in descriptor && typeof descriptor.value === "function"
227
+ ? descriptor.value
228
+ : __velarBrowserMissingField;
229
+ }
230
+ function __velarBrowserGlobalMember(name, kind) {
231
+ const descriptor = __velarBrowserDescriptor(globalThis, name);
232
+ if (!descriptor) return null;
233
+ const member = kind === "get" ? descriptor.get : "value" in descriptor ? descriptor.value : null;
234
+ return typeof member === "function" ? member : null;
235
+ }
236
+ function __velarBrowserGlobalField(name) {
237
+ const descriptor = __velarBrowserDescriptor(globalThis, name);
238
+ if (!descriptor) return __velarBrowserMissingField;
239
+ if ("value" in descriptor) return descriptor.value;
240
+ if (typeof descriptor.get !== "function" || typeof __velarBrowserReflectApply !== "function") return __velarBrowserMissingField;
241
+ try { return __velarBrowserReflectApply(descriptor.get, globalThis, []); }
242
+ catch { return __velarBrowserMissingField; }
243
+ }
244
+ function __velarBrowserConstructor(name) {
245
+ const value = __velarBrowserGlobalField(name);
246
+ return typeof value === "function" ? value : null;
247
+ }
248
+ function __velarBrowserPrototypeMember(constructor, name, kind) {
249
+ if (typeof constructor !== "function" || typeof __velarBrowserGetOwnPropertyDescriptor !== "function") return null;
250
+ const descriptor = __velarBrowserReflectApply(__velarBrowserGetOwnPropertyDescriptor, Object, [constructor, "prototype"]);
251
+ const member = descriptor && "value" in descriptor ? __velarBrowserDescriptor(descriptor.value, name) : null;
252
+ if (!member) return null;
253
+ const operation = kind === "get" ? member.get : "value" in member ? member.value : null;
254
+ return typeof operation === "function" ? operation : null;
255
+ }
256
+ function __velarBrowserHostMember(value, constructor, name, kind) {
257
+ const descriptor = __velarBrowserDescriptor(value, name);
258
+ if (descriptor) {
259
+ const operation = kind === "get" ? descriptor.get : "value" in descriptor ? descriptor.value : null;
260
+ if (typeof operation === "function") return operation;
261
+ }
262
+ return __velarBrowserPrototypeMember(constructor, name, kind);
263
+ }
264
+ function __velarBrowserNativeInstance(value, constructor) {
265
+ if (typeof constructor !== "function" || typeof __velarBrowserHasInstance !== "function"
266
+ || typeof __velarBrowserReflectApply !== "function") return false;
267
+ try { return __velarBrowserReflectApply(__velarBrowserHasInstance, constructor, [value]) === true; }
268
+ catch { return false; }
269
+ }
270
+ function __velarBrowserField(value, name, nativeGetter, constructor) {
271
+ if (typeof nativeGetter === "function" && __velarBrowserNativeInstance(value, constructor)) {
272
+ return __velarBrowserReflectApply(nativeGetter, value, []);
273
+ }
274
+ return __velarBrowserOwnDataField(value, name);
275
+ }
276
+ function __velarBrowserCallCaptured(operation, receiver, arguments_, name) {
277
+ if (typeof operation !== "function" || typeof __velarBrowserReflectApply !== "function") {
278
+ throw new TypeError("The browser does not expose native " + name);
279
+ }
280
+ return __velarBrowserReflectApply(operation, receiver, arguments_);
281
+ }
282
+ function __velarBrowserCall(value, name, nativeMethod, constructor, arguments_ = []) {
283
+ if (typeof nativeMethod === "function" && __velarBrowserNativeInstance(value, constructor)) {
284
+ return __velarBrowserReflectApply(nativeMethod, value, arguments_);
285
+ }
286
+ const method = __velarBrowserOwnDataField(value, name);
287
+ if (typeof method !== "function") throw new TypeError("The browser returned an invalid " + name + " host operation");
288
+ return __velarBrowserCallCaptured(method, value, arguments_, name);
289
+ }
290
+ `.trimStart();
291
+ const browserHostRuntime = String.raw `
292
+ ${webHostAbiRuntime}
293
+ const __velarBrowserWindow = globalThis;
294
+ const __velarBrowserLocation = __velarBrowserGlobalField("location");
295
+ const __velarBrowserNavigator = __velarBrowserGlobalField("navigator");
296
+ const __velarBrowserDocument = __velarBrowserGlobalField("document");
297
+ const __velarBrowserHistory = __velarBrowserGlobalField("history");
298
+ const __velarBrowserSecureContext = __velarBrowserGlobalField("isSecureContext");
299
+ const __velarBrowserLocationConstructor = __velarBrowserConstructor("Location");
300
+ const __velarBrowserNavigatorConstructor = __velarBrowserConstructor("Navigator");
301
+ const __velarBrowserDocumentConstructor = __velarBrowserConstructor("Document");
302
+ const __velarBrowserMediaQueryListConstructor = __velarBrowserConstructor("MediaQueryList");
303
+ const __velarBrowserEventTargetConstructor = __velarBrowserConstructor("EventTarget");
304
+ const __velarBrowserNodeConstructor = __velarBrowserConstructor("Node");
305
+ const __velarBrowserElementConstructor = __velarBrowserConstructor("Element");
306
+ const __velarBrowserHtmlElementConstructor = __velarBrowserConstructor("HTMLElement");
307
+ const __velarBrowserTextAreaConstructor = __velarBrowserConstructor("HTMLTextAreaElement");
308
+ const __velarBrowserDialogConstructor = __velarBrowserConstructor("HTMLDialogElement");
309
+ const __velarBrowserClipboardEventConstructor = __velarBrowserConstructor("ClipboardEvent");
310
+ const __velarBrowserDataTransferConstructor = __velarBrowserConstructor("DataTransfer");
311
+ const __velarBrowserDomRectConstructor = __velarBrowserConstructor("DOMRect");
312
+ const __velarBrowserDomRectReadOnlyConstructor = __velarBrowserConstructor("DOMRectReadOnly");
313
+ const __velarBrowserClipboardConstructor = __velarBrowserConstructor("Clipboard");
314
+ const __velarBrowserHistoryConstructor = __velarBrowserConstructor("History");
315
+ const __velarBrowserUrlConstructor = __velarBrowserConstructor("URL");
316
+ const __velarBrowserUrlSearchParamsConstructor = __velarBrowserConstructor("URLSearchParams");
317
+ const __velarBrowserPopStateEventConstructor = __velarBrowserConstructor("PopStateEvent");
318
+ const __velarBrowserLocationHref = __velarBrowserHostMember(__velarBrowserLocation, __velarBrowserLocationConstructor, "href", "get");
319
+ const __velarBrowserLocationOrigin = __velarBrowserHostMember(__velarBrowserLocation, __velarBrowserLocationConstructor, "origin", "get");
320
+ const __velarBrowserLocationPathname = __velarBrowserHostMember(__velarBrowserLocation, __velarBrowserLocationConstructor, "pathname", "get");
321
+ const __velarBrowserLocationSearch = __velarBrowserHostMember(__velarBrowserLocation, __velarBrowserLocationConstructor, "search", "get");
322
+ const __velarBrowserLocationHash = __velarBrowserHostMember(__velarBrowserLocation, __velarBrowserLocationConstructor, "hash", "get");
323
+ const __velarBrowserLocationReload = __velarBrowserHostMember(__velarBrowserLocation, __velarBrowserLocationConstructor, "reload", "value");
324
+ const __velarBrowserNavigatorLanguage = __velarBrowserPrototypeMember(__velarBrowserNavigatorConstructor, "language", "get");
325
+ const __velarBrowserNavigatorLanguages = __velarBrowserPrototypeMember(__velarBrowserNavigatorConstructor, "languages", "get");
326
+ const __velarBrowserNavigatorOnline = __velarBrowserPrototypeMember(__velarBrowserNavigatorConstructor, "onLine", "get");
327
+ const __velarBrowserNavigatorTouchPoints = __velarBrowserPrototypeMember(__velarBrowserNavigatorConstructor, "maxTouchPoints", "get");
328
+ const __velarBrowserNavigatorClipboard = __velarBrowserPrototypeMember(__velarBrowserNavigatorConstructor, "clipboard", "get");
329
+ const __velarBrowserDocumentVisibility = __velarBrowserPrototypeMember(__velarBrowserDocumentConstructor, "visibilityState", "get");
330
+ const __velarBrowserMediaMatches = __velarBrowserPrototypeMember(__velarBrowserMediaQueryListConstructor, "matches", "get");
331
+ const __velarBrowserNodeConnected = __velarBrowserPrototypeMember(__velarBrowserNodeConstructor, "isConnected", "get");
332
+ const __velarBrowserDialogOpen = __velarBrowserPrototypeMember(__velarBrowserDialogConstructor, "open", "get");
333
+ const __velarBrowserDialogResult = __velarBrowserPrototypeMember(__velarBrowserDialogConstructor, "returnValue", "get");
334
+ const __velarBrowserDialogShowModal = __velarBrowserPrototypeMember(__velarBrowserDialogConstructor, "showModal", "value");
335
+ const __velarBrowserDialogClose = __velarBrowserPrototypeMember(__velarBrowserDialogConstructor, "close", "value");
336
+ const __velarBrowserElementScrollIntoView = __velarBrowserPrototypeMember(__velarBrowserElementConstructor, "scrollIntoView", "value");
337
+ const __velarBrowserElementScrollTo = __velarBrowserPrototypeMember(__velarBrowserElementConstructor, "scrollTo", "value");
338
+ const __velarBrowserElementScrollLeft = __velarBrowserPrototypeMember(__velarBrowserElementConstructor, "scrollLeft", "get");
339
+ const __velarBrowserElementScrollTop = __velarBrowserPrototypeMember(__velarBrowserElementConstructor, "scrollTop", "get");
340
+ const __velarBrowserElementScrollWidth = __velarBrowserPrototypeMember(__velarBrowserElementConstructor, "scrollWidth", "get");
341
+ const __velarBrowserElementScrollHeight = __velarBrowserPrototypeMember(__velarBrowserElementConstructor, "scrollHeight", "get");
342
+ const __velarBrowserElementClientWidth = __velarBrowserPrototypeMember(__velarBrowserElementConstructor, "clientWidth", "get");
343
+ const __velarBrowserElementClientHeight = __velarBrowserPrototypeMember(__velarBrowserElementConstructor, "clientHeight", "get");
344
+ const __velarBrowserElementSetPointerCapture = __velarBrowserPrototypeMember(__velarBrowserElementConstructor, "setPointerCapture", "value");
345
+ const __velarBrowserElementReleasePointerCapture = __velarBrowserPrototypeMember(__velarBrowserElementConstructor, "releasePointerCapture", "value");
346
+ const __velarBrowserElementMeasure = __velarBrowserPrototypeMember(__velarBrowserElementConstructor, "getBoundingClientRect", "value");
347
+ const __velarBrowserElementFocus = __velarBrowserPrototypeMember(__velarBrowserHtmlElementConstructor, "focus", "value");
348
+ const __velarBrowserElementBlur = __velarBrowserPrototypeMember(__velarBrowserHtmlElementConstructor, "blur", "value");
349
+ const __velarBrowserTextAreaValue = __velarBrowserPrototypeMember(__velarBrowserTextAreaConstructor, "value", "get");
350
+ const __velarBrowserTextAreaSelectionStart = __velarBrowserPrototypeMember(__velarBrowserTextAreaConstructor, "selectionStart", "get");
351
+ const __velarBrowserTextAreaSelectionEnd = __velarBrowserPrototypeMember(__velarBrowserTextAreaConstructor, "selectionEnd", "get");
352
+ const __velarBrowserTextAreaSelectionDirection = __velarBrowserPrototypeMember(__velarBrowserTextAreaConstructor, "selectionDirection", "get");
353
+ const __velarBrowserTextAreaSetSelectionRange = __velarBrowserPrototypeMember(__velarBrowserTextAreaConstructor, "setSelectionRange", "value");
354
+ const __velarBrowserRectX = __velarBrowserPrototypeMember(__velarBrowserDomRectConstructor, "x", "get");
355
+ const __velarBrowserRectY = __velarBrowserPrototypeMember(__velarBrowserDomRectConstructor, "y", "get");
356
+ const __velarBrowserRectWidth = __velarBrowserPrototypeMember(__velarBrowserDomRectConstructor, "width", "get");
357
+ const __velarBrowserRectHeight = __velarBrowserPrototypeMember(__velarBrowserDomRectConstructor, "height", "get");
358
+ const __velarBrowserRectTop = __velarBrowserPrototypeMember(__velarBrowserDomRectReadOnlyConstructor, "top", "get");
359
+ const __velarBrowserRectRight = __velarBrowserPrototypeMember(__velarBrowserDomRectReadOnlyConstructor, "right", "get");
360
+ const __velarBrowserRectBottom = __velarBrowserPrototypeMember(__velarBrowserDomRectReadOnlyConstructor, "bottom", "get");
361
+ const __velarBrowserRectLeft = __velarBrowserPrototypeMember(__velarBrowserDomRectReadOnlyConstructor, "left", "get");
362
+ const __velarBrowserClipboardWrite = __velarBrowserPrototypeMember(__velarBrowserClipboardConstructor, "writeText", "value");
363
+ const __velarBrowserClipboardRead = __velarBrowserPrototypeMember(__velarBrowserClipboardConstructor, "readText", "value");
364
+ const __velarBrowserClipboardEventData = __velarBrowserPrototypeMember(__velarBrowserClipboardEventConstructor, "clipboardData", "get");
365
+ const __velarBrowserDataTransferGetData = __velarBrowserPrototypeMember(__velarBrowserDataTransferConstructor, "getData", "value");
366
+ const __velarBrowserDataTransferSetData = __velarBrowserPrototypeMember(__velarBrowserDataTransferConstructor, "setData", "value");
367
+ const __velarBrowserEventAdd = __velarBrowserPrototypeMember(__velarBrowserEventTargetConstructor, "addEventListener", "value");
368
+ const __velarBrowserEventRemove = __velarBrowserPrototypeMember(__velarBrowserEventTargetConstructor, "removeEventListener", "value");
369
+ const __velarBrowserEventDispatch = __velarBrowserPrototypeMember(__velarBrowserEventTargetConstructor, "dispatchEvent", "value");
370
+ const __velarBrowserHistoryPush = __velarBrowserPrototypeMember(__velarBrowserHistoryConstructor, "pushState", "value");
371
+ const __velarBrowserHistoryReplace = __velarBrowserPrototypeMember(__velarBrowserHistoryConstructor, "replaceState", "value");
372
+ const __velarBrowserHistoryBack = __velarBrowserPrototypeMember(__velarBrowserHistoryConstructor, "back", "value");
373
+ const __velarBrowserHistoryForward = __velarBrowserPrototypeMember(__velarBrowserHistoryConstructor, "forward", "value");
374
+ const __velarBrowserUrlOrigin = __velarBrowserPrototypeMember(__velarBrowserUrlConstructor, "origin", "get");
375
+ const __velarBrowserUrlPathname = __velarBrowserPrototypeMember(__velarBrowserUrlConstructor, "pathname", "get");
376
+ const __velarBrowserUrlSearch = __velarBrowserPrototypeMember(__velarBrowserUrlConstructor, "search", "get");
377
+ const __velarBrowserUrlHash = __velarBrowserPrototypeMember(__velarBrowserUrlConstructor, "hash", "get");
378
+ const __velarBrowserUrlSearchParamsForEach = __velarBrowserPrototypeMember(__velarBrowserUrlSearchParamsConstructor, "forEach", "value");
379
+ const __velarBrowserSetTimeout = __velarBrowserGlobalMember("setTimeout", "value");
380
+ const __velarBrowserClearTimeout = __velarBrowserGlobalMember("clearTimeout", "value");
381
+ const __velarBrowserQueueMicrotask = __velarBrowserGlobalMember("queueMicrotask", "value");
382
+ const __velarBrowserMatchMedia = __velarBrowserGlobalMember("matchMedia", "value");
383
+ const __velarBrowserOpen = __velarBrowserGlobalMember("open", "value");
384
+ const __velarBrowserScrollTo = __velarBrowserGlobalMember("scrollTo", "value");
385
+ const __velarBrowserAnimationFrame = __velarBrowserGlobalMember("requestAnimationFrame", "value");
386
+ const __velarBrowserGlobalAddEventListener = __velarBrowserGlobalMember("addEventListener", "value");
387
+ const __velarBrowserGlobalRemoveEventListener = __velarBrowserGlobalMember("removeEventListener", "value");
388
+ const __velarBrowserGlobalDispatchEvent = __velarBrowserGlobalMember("dispatchEvent", "value");
389
+ const __velarBrowserClipboard = __velarBrowserField(__velarBrowserNavigator, "clipboard", __velarBrowserNavigatorClipboard, __velarBrowserNavigatorConstructor);
390
+ function __velarBrowserListen(target, name, callback, options = undefined) {
391
+ if (__velarBrowserNativeInstance(target, __velarBrowserEventTargetConstructor)) {
392
+ __velarBrowserCallCaptured(__velarBrowserEventAdd, target, [name, callback, options], "EventTarget.addEventListener");
393
+ return () => __velarBrowserCallCaptured(__velarBrowserEventRemove, target, [name, callback, options?.capture ?? false], "EventTarget.removeEventListener");
394
+ }
395
+ const add = __velarBrowserDataMethod(target, "addEventListener");
396
+ const remove = __velarBrowserDataMethod(target, "removeEventListener");
397
+ __velarBrowserCallCaptured(add, target, [name, callback, options], "addEventListener");
398
+ return () => __velarBrowserCallCaptured(remove, target, [name, callback, options?.capture ?? false], "removeEventListener");
399
+ }
400
+ function __velarBrowserListenGlobal(name, callback, options = undefined) {
401
+ __velarBrowserCallCaptured(__velarBrowserGlobalAddEventListener, __velarBrowserWindow, [name, callback, options], "global addEventListener");
402
+ return () => __velarBrowserCallCaptured(__velarBrowserGlobalRemoveEventListener, __velarBrowserWindow, [name, callback, options?.capture ?? false], "global removeEventListener");
403
+ }
404
+ `.trimStart();
405
+ const storageHostRuntime = String.raw `
406
+ ${webHostAbiRuntime}
407
+ const storageWindow = globalThis;
408
+ const storageLocalArea = __velarBrowserGlobalField("localStorage");
409
+ const storageSessionArea = __velarBrowserGlobalField("sessionStorage");
410
+ const storageIndexedDb = __velarBrowserGlobalField("indexedDB");
411
+ const storageNativeStorage = __velarBrowserConstructor("Storage");
412
+ const storageNativeCustomEvent = __velarBrowserConstructor("CustomEvent");
413
+ const storageNativeStorageEvent = __velarBrowserConstructor("StorageEvent");
414
+ const storageNativeEventTarget = __velarBrowserConstructor("EventTarget");
415
+ const storageNativeIdbFactory = __velarBrowserConstructor("IDBFactory");
416
+ const storageNativeIdbRequest = __velarBrowserConstructor("IDBRequest");
417
+ const storageNativeIdbDatabase = __velarBrowserConstructor("IDBDatabase");
418
+ const storageNativeIdbTransaction = __velarBrowserConstructor("IDBTransaction");
419
+ const storageNativeIdbObjectStore = __velarBrowserConstructor("IDBObjectStore");
420
+ const storageNativeDomStringList = __velarBrowserConstructor("DOMStringList");
421
+ const storageLength = __velarBrowserPrototypeMember(storageNativeStorage, "length", "get");
422
+ const storageKey = __velarBrowserPrototypeMember(storageNativeStorage, "key", "value");
423
+ const storageGetItem = __velarBrowserPrototypeMember(storageNativeStorage, "getItem", "value");
424
+ const storageSetItem = __velarBrowserPrototypeMember(storageNativeStorage, "setItem", "value");
425
+ const storageRemoveItem = __velarBrowserPrototypeMember(storageNativeStorage, "removeItem", "value");
426
+ const storageCustomEventDetail = __velarBrowserPrototypeMember(storageNativeCustomEvent, "detail", "get");
427
+ const storageEventStorageArea = __velarBrowserPrototypeMember(storageNativeStorageEvent, "storageArea", "get");
428
+ const storageEventKey = __velarBrowserPrototypeMember(storageNativeStorageEvent, "key", "get");
429
+ const storageEventNewValue = __velarBrowserPrototypeMember(storageNativeStorageEvent, "newValue", "get");
430
+ const storageEventOldValue = __velarBrowserPrototypeMember(storageNativeStorageEvent, "oldValue", "get");
431
+ const storageEventAdd = __velarBrowserPrototypeMember(storageNativeEventTarget, "addEventListener", "value");
432
+ const storageEventRemove = __velarBrowserPrototypeMember(storageNativeEventTarget, "removeEventListener", "value");
433
+ const storageGlobalAdd = __velarBrowserGlobalMember("addEventListener", "value");
434
+ const storageGlobalRemove = __velarBrowserGlobalMember("removeEventListener", "value");
435
+ const storageGlobalDispatch = __velarBrowserGlobalMember("dispatchEvent", "value");
436
+ const storageIdbOpen = __velarBrowserPrototypeMember(storageNativeIdbFactory, "open", "value");
437
+ const storageIdbRequestResult = __velarBrowserPrototypeMember(storageNativeIdbRequest, "result", "get");
438
+ const storageIdbRequestError = __velarBrowserPrototypeMember(storageNativeIdbRequest, "error", "get");
439
+ const storageIdbObjectStoreNames = __velarBrowserPrototypeMember(storageNativeIdbDatabase, "objectStoreNames", "get");
440
+ const storageIdbTransaction = __velarBrowserPrototypeMember(storageNativeIdbDatabase, "transaction", "value");
441
+ const storageIdbCreateObjectStore = __velarBrowserPrototypeMember(storageNativeIdbDatabase, "createObjectStore", "value");
442
+ const storageIdbClose = __velarBrowserPrototypeMember(storageNativeIdbDatabase, "close", "value");
443
+ const storageDomStringListContains = __velarBrowserPrototypeMember(storageNativeDomStringList, "contains", "value");
444
+ const storageIdbTransactionObjectStore = __velarBrowserPrototypeMember(storageNativeIdbTransaction, "objectStore", "value");
445
+ const storageIdbTransactionError = __velarBrowserPrototypeMember(storageNativeIdbTransaction, "error", "get");
446
+ const storageIdbTransactionAbort = __velarBrowserPrototypeMember(storageNativeIdbTransaction, "abort", "value");
447
+ const storageIdbObjectGet = __velarBrowserPrototypeMember(storageNativeIdbObjectStore, "get", "value");
448
+ const storageIdbObjectPut = __velarBrowserPrototypeMember(storageNativeIdbObjectStore, "put", "value");
449
+ const storageIdbObjectGetKey = __velarBrowserPrototypeMember(storageNativeIdbObjectStore, "getKey", "value");
450
+ const storageIdbObjectGetAllKeys = __velarBrowserPrototypeMember(storageNativeIdbObjectStore, "getAllKeys", "value");
451
+ const storageIdbObjectDelete = __velarBrowserPrototypeMember(storageNativeIdbObjectStore, "delete", "value");
452
+ const storageIdbObjectClear = __velarBrowserPrototypeMember(storageNativeIdbObjectStore, "clear", "value");
453
+ function storageHostField(value, name, nativeGetter, constructor) {
454
+ return __velarBrowserField(value, name, nativeGetter, constructor);
455
+ }
456
+ function storageHostCall(value, name, nativeMethod, constructor, arguments_ = []) {
457
+ return __velarBrowserCall(value, name, nativeMethod, constructor, arguments_);
458
+ }
459
+ function storageListen(target, name, callback, options = undefined) {
460
+ if (__velarBrowserNativeInstance(target, storageNativeEventTarget)) {
461
+ __velarBrowserCallCaptured(storageEventAdd, target, [name, callback, options], "EventTarget.addEventListener");
462
+ return () => __velarBrowserCallCaptured(storageEventRemove, target, [name, callback, options?.capture ?? false], "EventTarget.removeEventListener");
463
+ }
464
+ const add = __velarBrowserDataMethod(target, "addEventListener");
465
+ const remove = __velarBrowserDataMethod(target, "removeEventListener");
466
+ __velarBrowserCallCaptured(add, target, [name, callback, options], "addEventListener");
467
+ return () => __velarBrowserCallCaptured(remove, target, [name, callback, options?.capture ?? false], "removeEventListener");
468
+ }
469
+ function storageListenGlobal(name, callback) {
470
+ __velarBrowserCallCaptured(storageGlobalAdd, storageWindow, [name, callback], "global addEventListener");
471
+ return () => __velarBrowserCallCaptured(storageGlobalRemove, storageWindow, [name, callback], "global removeEventListener");
472
+ }
473
+ `.trimStart();
474
+ const runtimeTypeRuntime = VELAR_TYPE_REGISTRY_RUNTIME;
475
+ export const webModuleSources = new Map([
476
+ ["velar/look", String.raw `
477
+ ${runtimeTypeRuntime}
478
+
479
+ const lookMissingField = Object.freeze({});
480
+ const lookReflectApply = Object.getOwnPropertyDescriptor(Reflect, "apply")?.value;
481
+ const lookGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor(Object, "getOwnPropertyDescriptor")?.value;
482
+ const lookRegExpTest = Object.getOwnPropertyDescriptor(RegExp.prototype, "test")?.value;
483
+ function lookOwnData(value, name) {
484
+ if (value === null || (typeof value !== "object" && typeof value !== "function")
485
+ || typeof lookReflectApply !== "function" || typeof lookGetOwnPropertyDescriptor !== "function") return lookMissingField;
486
+ const descriptor = lookReflectApply(lookGetOwnPropertyDescriptor, Object, [value, name]);
487
+ return descriptor && descriptor.enumerable && "value" in descriptor ? descriptor.value : lookMissingField;
488
+ }
489
+ function lookMatches(pattern, value) {
490
+ return typeof lookReflectApply === "function" && typeof lookRegExpTest === "function"
491
+ ? lookReflectApply(lookRegExpTest, pattern, [value])
492
+ : false;
493
+ }
494
+ function lookText(value, label) {
495
+ if (typeof value !== "string") throw new TypeError(label + " must be text");
496
+ if (value.length === 0 || value.length > 65536) throw new RangeError(label + " must contain 1 through 65536 characters");
497
+ return value;
498
+ }
499
+ function lookFinite(value, label) {
500
+ if (typeof value !== "number" || !Number.isFinite(value)) throw new TypeError(label + " must be a finite number");
501
+ return value;
502
+ }
503
+ function lookRange(value, label, minimum, maximum) {
504
+ value = lookFinite(value, label);
505
+ if (value < minimum || value > maximum) throw new RangeError(label + " must be from " + minimum + " through " + maximum);
506
+ return value;
507
+ }
508
+ function lookVisual(value, label) {
509
+ if (typeof value === "number") return String(lookFinite(value, label));
510
+ return lookText(value, label);
511
+ }
512
+ function lookResult(value) {
513
+ if (value.length > 1024 * 1024) throw new RangeError("A constructed Look value cannot exceed 1 MiB");
514
+ return value;
515
+ }
516
+ function lookType(name, predicate) {
517
+ return __velarRegisterRuntimeType(Object.freeze({
518
+ is(value) { return predicate(value); },
519
+ parse(value) {
520
+ if (!predicate(value)) throw new TypeError(name + " received an invalid visual value");
521
+ return value;
522
+ },
523
+ }));
524
+ }
525
+ const lengthPattern = /^[+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:px|rem|em|vw|vh|vmin|vmax)$/;
526
+ const percentagePattern = /^[+-]?(?:\d+(?:\.\d+)?|\.\d+)%$/;
527
+ const trackFractionPattern = /^[+-]?(?:\d+(?:\.\d+)?|\.\d+)fr$/;
528
+ const durationPattern = /^[+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:ms|s)$/;
529
+ const anglePattern = /^[+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:deg|turn)$/;
530
+ const calculatedLengthPattern = /^(?:calc|min|max|clamp)\(/;
531
+ const textVisual = (value) => typeof value === "string" && value.length > 0 && value.length <= 1024 * 1024;
532
+
533
+ export const Look = lookType("Look", (value) => value !== null && typeof value === "object" && lookOwnData(value, "__velarLook") === true);
534
+ export const Length = lookType("Length", (value) => typeof value === "string" && (lookMatches(lengthPattern, value) || lookMatches(calculatedLengthPattern, value)));
535
+ export const Percentage = lookType("Percentage", (value) => typeof value === "string" && lookMatches(percentagePattern, value));
536
+ export const LengthPercentage = lookType("LengthPercentage", (value) => typeof value === "string" && (lookMatches(lengthPattern, value) || lookMatches(percentagePattern, value) || lookMatches(calculatedLengthPattern, value)));
537
+ export const TrackFraction = lookType("TrackFraction", (value) => typeof value === "string" && lookMatches(trackFractionPattern, value));
538
+ export const Duration = lookType("Duration", (value) => typeof value === "string" && lookMatches(durationPattern, value));
539
+ export const Angle = lookType("Angle", (value) => typeof value === "string" && lookMatches(anglePattern, value));
540
+ export const Color = lookType("Color", textVisual);
541
+ export const Border = lookType("Border", textVisual);
542
+ export const Shadow = lookType("Shadow", textVisual);
543
+ export const Image = lookType("Image", textVisual);
544
+ export const Track = lookType("Track", textVisual);
545
+ export const TrackList = lookType("TrackList", textVisual);
546
+ export const Transition = lookType("Transition", textVisual);
547
+ export const Spacing = lookType("Spacing", textVisual);
548
+ export const Keyframes = lookType("Keyframes", (value) => lookOwnData(value, "__velarKeyframes") === true
549
+ && typeof lookOwnData(value, "name") === "string");
550
+ export const Animation = lookType("Animation", (value) => lookOwnData(value, "__velarAnimation") === true
551
+ && typeof lookOwnData(value, "css") === "string");
552
+
553
+ export function color(value) { return lookText(value, "Color"); }
554
+ export function rgb(red, green, blue) {
555
+ const channels = [red, green, blue].map((value, index) => lookRange(value, "RGB channel " + (index + 1), 0, 255));
556
+ return lookResult("rgb(" + channels.join(" ") + ")");
557
+ }
558
+ export function rgba(red, green, blue, alpha) {
559
+ const channels = [red, green, blue].map((value, index) => lookRange(value, "RGB channel " + (index + 1), 0, 255));
560
+ return lookResult("rgb(" + channels.join(" ") + " / " + lookRange(alpha, "RGB alpha", 0, 1) + ")");
561
+ }
562
+ export function hsl(hue, saturation, lightness) {
563
+ return lookResult("hsl(" + lookFinite(hue, "HSL hue") + " " + lookRange(saturation, "HSL saturation", 0, 100)
564
+ + "% " + lookRange(lightness, "HSL lightness", 0, 100) + "%)");
565
+ }
566
+ export function alpha(value, opacity) {
567
+ return lookResult("color-mix(in srgb, " + lookText(value, "Color") + " " + (lookRange(opacity, "Color opacity", 0, 1) * 100) + "%, transparent)");
568
+ }
569
+ export function lighten(value, amount) {
570
+ return lookResult("color-mix(in srgb, " + lookText(value, "Color") + ", white " + (lookRange(amount, "Color amount", 0, 1) * 100) + "%)");
571
+ }
572
+ export function darken(value, amount) {
573
+ return lookResult("color-mix(in srgb, " + lookText(value, "Color") + ", black " + (lookRange(amount, "Color amount", 0, 1) * 100) + "%)");
574
+ }
575
+ export function border(width, value, style = "solid") {
576
+ if (typeof style !== "string" || !["none", "hidden", "dotted", "dashed", "solid", "double", "groove", "ridge", "inset", "outset"].includes(style)) {
577
+ throw new TypeError("Border style is invalid");
578
+ }
579
+ return lookResult(lookVisual(width, "Border width") + " " + style + " " + lookText(value, "Border color"));
580
+ }
581
+ export function shadow(x, y, blur, value, spread = "0px", inset = false) {
582
+ if (typeof inset !== "boolean") throw new TypeError("Shadow inset must be bool");
583
+ return lookResult((inset ? "inset " : "") + lookVisual(x, "Shadow x") + " " + lookVisual(y, "Shadow y") + " "
584
+ + lookVisual(blur, "Shadow blur") + " " + lookVisual(spread, "Shadow spread") + " " + lookText(value, "Shadow color"));
585
+ }
586
+ export function linearGradient(angle, start, end) {
587
+ return lookResult("linear-gradient(" + lookVisual(angle, "Gradient angle") + ", " + lookText(start, "Gradient start") + ", " + lookText(end, "Gradient end") + ")");
588
+ }
589
+ export function asset(path) { return lookResult("url(" + JSON.stringify(lookText(path, "Asset path")) + ")"); }
590
+ export function minmax(minimum, maximum) { return lookResult("minmax(" + lookVisual(minimum, "Minimum track") + ", " + lookVisual(maximum, "Maximum track") + ")"); }
591
+ export function repeat(count, size) { return lookResult("repeat(" + lookVisual(count, "Repeat count") + ", " + lookVisual(size, "Repeat size") + ")"); }
592
+ export function tracks(first, ...rest) {
593
+ const values = [first, ...rest];
594
+ if (values.length > 1024) throw new RangeError("tracks cannot contain more than 1024 values");
595
+ return lookResult(values.map((value, index) => lookVisual(value, "Track " + (index + 1))).join(" "));
596
+ }
597
+ export function transition(property, duration, easing = "ease", delay) {
598
+ const suffix = delay === undefined ? "" : " " + lookVisual(delay, "Transition delay");
599
+ return lookResult(lookText(property, "Transition property") + " " + lookVisual(duration, "Transition duration") + " " + lookText(easing, "Transition easing") + suffix);
600
+ }
601
+ export function spacing(first, second, third, fourth) {
602
+ return lookResult([first, second, third, fourth].filter((value) => value !== undefined)
603
+ .map((value, index) => lookVisual(value, "Spacing value " + (index + 1))).join(" "));
604
+ }
605
+ export function min(first, second) { return lookResult("min(" + lookVisual(first, "min value") + ", " + lookVisual(second, "min value") + ")"); }
606
+ export function max(first, second) { return lookResult("max(" + lookVisual(first, "max value") + ", " + lookVisual(second, "max value") + ")"); }
607
+ export function clamp(minimum, preferred, maximum) {
608
+ return lookResult("clamp(" + lookVisual(minimum, "clamp minimum") + ", " + lookVisual(preferred, "clamp preferred") + ", " + lookVisual(maximum, "clamp maximum") + ")");
609
+ }
610
+ export function animate(frames, duration, easing = "ease", delay = "0ms", count = 1, loop = false, direction = "normal", fill = "none") {
611
+ if (lookOwnData(frames, "__velarKeyframes") !== true) throw new TypeError("animate frames must be a Keyframes value");
612
+ const name = lookText(lookOwnData(frames, "name"), "Keyframes name");
613
+ if (!lookMatches(durationPattern, duration)) throw new TypeError("Animation duration must be a Duration value");
614
+ if (!lookMatches(durationPattern, delay)) throw new TypeError("Animation delay must be a Duration value");
615
+ if (!["linear", "ease", "ease-in", "ease-out", "ease-in-out", "step-start", "step-end"].includes(easing)) throw new TypeError("Animation easing is invalid");
616
+ if (!["normal", "reverse", "alternate", "alternate-reverse"].includes(direction)) throw new TypeError("Animation direction is invalid");
617
+ if (!["none", "forwards", "backwards", "both"].includes(fill)) throw new TypeError("Animation fill is invalid");
618
+ if (typeof loop !== "boolean") throw new TypeError("Animation loop must be bool");
619
+ count = lookFinite(count, "Animation count");
620
+ if (!Number.isInteger(count) || count <= 0 || count > 1000000) throw new RangeError("Animation count must be a positive integer no greater than 1000000");
621
+ const css = [name, duration, easing, delay, loop ? "infinite" : String(count), direction, fill].join(" ");
622
+ return Object.freeze({ __velarAnimation: true, css: lookResult(css) });
623
+ }
624
+ `.trimStart()],
625
+ ["velar/app", String.raw `
626
+ ${WEB_RUNTIME_FOUNDATION}
627
+
628
+ export function onError(handler) {
629
+ if (typeof handler !== "function") throw new TypeError("onError requires a callback");
630
+ if (!__velarGraphSetContains(__velarRuntime.errorHandlers, handler) && __velarGraphSetCount(__velarRuntime.errorHandlers) >= 1000) throw new RangeError("An application cannot install more than 1000 error handlers");
631
+ __velarGraphSetInsert(__velarRuntime.errorHandlers, handler);
632
+ return () => { __velarGraphSetRemove(__velarRuntime.errorHandlers, handler); return null; };
633
+ }
634
+
635
+ export function reportError(error, phase = "manual", detail = "") {
636
+ if (!__velarIsError(error)) throw new TypeError("reportError requires an Error");
637
+ if (typeof phase !== "string" || typeof detail !== "string") throw new TypeError("reportError phase and detail must be strings");
638
+ if (phase.length > 256 || detail.length > 65536) throw new RangeError("reportError phase/detail text is too long");
639
+ __velarRuntime.report(error, { phase, detail, unhandled: false });
640
+ return null;
641
+ }
642
+ `.trimStart()],
643
+ ["velar/config", String.raw `
644
+ ${runtimeTypeRuntime}
645
+ const source = "__VELAR_PUBLIC_CONFIG__";
646
+ function freeze(value) {
647
+ if (!value || typeof value !== "object" || Object.isFrozen(value)) return value;
648
+ for (const child of Object.values(value)) freeze(child);
649
+ return Object.freeze(value);
650
+ }
651
+ const value = freeze(source);
652
+ export function publicConfig(Type) { Type = __velarRequireRuntimeType(Type, "publicConfig"); return Type.parse(value); }
653
+ export function has(key) { if (typeof key !== "string") throw new TypeError("Config keys must be strings"); return Object.prototype.hasOwnProperty.call(value, key); }
654
+ export function keys() { return Object.keys(value).sort(); }
655
+ `.trimStart()],
656
+ ["velar/web", String.raw `
657
+ ${VELAR_ERROR_NORMALIZATION_RUNTIME}
658
+ ${listRuntime}
659
+ ${optionsRuntime}
660
+ ${runtimeTypeRuntime}
661
+ ${browserHostRuntime}
662
+ ${WEB_DOM_HOST_RUNTIME}
663
+ const appBase = "__VELAR_WEB_BASE__";
664
+ let nextDomId = 1;
665
+ function webLocationField(name, getter) {
666
+ return __velarBrowserField(__velarBrowserLocation, name, getter, __velarBrowserLocationConstructor);
667
+ }
668
+ function webUrl(value, base) {
669
+ if (typeof __velarBrowserUrlConstructor !== "function") throw new TypeError("The browser URL API is unavailable");
670
+ return new __velarBrowserUrlConstructor(value, base);
671
+ }
672
+ function webUrlField(value, name, getter) {
673
+ return __velarBrowserField(value, name, getter, __velarBrowserUrlConstructor);
674
+ }
675
+ const webEventMissingField = Object.freeze({});
676
+ const webEventReflectApply = Object.getOwnPropertyDescriptor(Reflect, "apply")?.value;
677
+ function webEventConstructor(name) {
678
+ const descriptor = Object.getOwnPropertyDescriptor(globalThis, name);
679
+ return descriptor && "value" in descriptor && typeof descriptor.value === "function" ? descriptor.value : null;
680
+ }
681
+ function webEventPrototypeMember(constructor, name, kind) {
682
+ let prototype = typeof constructor === "function" ? Object.getOwnPropertyDescriptor(constructor, "prototype")?.value : null;
683
+ while (prototype && prototype !== Object.prototype) {
684
+ const descriptor = Object.getOwnPropertyDescriptor(prototype, name);
685
+ if (descriptor) {
686
+ const member = kind === "get" ? descriptor.get : "value" in descriptor ? descriptor.value : null;
687
+ return typeof member === "function" ? member : null;
688
+ }
689
+ prototype = Object.getPrototypeOf(prototype);
690
+ }
691
+ return null;
692
+ }
693
+ const webNativeEvent = webEventConstructor("Event");
694
+ const webNativeMouseEvent = webEventConstructor("MouseEvent");
695
+ const webEventDefaultPrevented = webEventPrototypeMember(webNativeEvent, "defaultPrevented", "get");
696
+ const webEventPreventDefault = webEventPrototypeMember(webNativeEvent, "preventDefault", "value");
697
+ const webEventButton = webEventPrototypeMember(webNativeMouseEvent, "button", "get");
698
+ const webEventMetaKey = webEventPrototypeMember(webNativeMouseEvent, "metaKey", "get");
699
+ const webEventCtrlKey = webEventPrototypeMember(webNativeMouseEvent, "ctrlKey", "get");
700
+ const webEventShiftKey = webEventPrototypeMember(webNativeMouseEvent, "shiftKey", "get");
701
+ const webEventAltKey = webEventPrototypeMember(webNativeMouseEvent, "altKey", "get");
702
+ function webEventField(event, name, nativeGetter) {
703
+ if (typeof nativeGetter === "function" && typeof webEventReflectApply === "function") {
704
+ try { return webEventReflectApply(nativeGetter, event, []); } catch {}
705
+ }
706
+ if (event === null || (typeof event !== "object" && typeof event !== "function")) return webEventMissingField;
707
+ const descriptor = Object.getOwnPropertyDescriptor(event, name);
708
+ return descriptor?.enumerable && "value" in descriptor ? descriptor.value : webEventMissingField;
709
+ }
710
+ function webEventCall(event, name, nativeMethod) {
711
+ if (typeof nativeMethod === "function" && typeof webEventReflectApply === "function") {
712
+ try { return webEventReflectApply(nativeMethod, event, []); } catch {}
713
+ }
714
+ const method = webEventField(event, name, null);
715
+ if (typeof method !== "function" || typeof webEventReflectApply !== "function") throw new TypeError("Link received an invalid click event");
716
+ return webEventReflectApply(method, event, []);
717
+ }
718
+ function reportLinkEventFailure(failure) {
719
+ const error = __velarNormalizeError(failure);
720
+ const runtime = globalThis[Symbol.for(${JSON.stringify(VELAR_RUNTIME_REGISTRY_KEY)})];
721
+ if (runtime && typeof runtime.report === "function") runtime.report(error, { phase: "event", detail: "link", unhandled: true });
722
+ else __velarEnqueue(() => { throw error; });
723
+ }
724
+
725
+ export function domId(prefix = "velar") {
726
+ prefix = __velarString(prefix, "DOM ID prefix");
727
+ if (!/^[A-Za-z][A-Za-z0-9_-]*$/u.test(prefix)) throw new TypeError("DOM ID prefixes must start with a letter and contain only letters, numbers, underscores, or hyphens");
728
+ if (prefix.length > 64) throw new RangeError("DOM ID prefixes cannot exceed 64 characters");
729
+ if (!Number.isSafeInteger(nextDomId)) throw new RangeError("The VelarScript DOM ID space is exhausted");
730
+ return prefix + "-" + nextDomId++;
731
+ }
732
+
733
+ function isBoundedStringMap(value) {
734
+ let size;
735
+ try { size = Reflect.getOwnPropertyDescriptor(Map.prototype, "size").get.call(value); }
736
+ catch { return false; }
737
+ if (size > 100000) return false;
738
+ let codeUnits = 0;
739
+ for (const [key, item] of Map.prototype.entries.call(value)) {
740
+ if (typeof key !== "string" || typeof item !== "string") return false;
741
+ codeUnits += key.length + item.length;
742
+ if (codeUnits > 2 * 1024 * 1024) return false;
743
+ }
744
+ return true;
745
+ }
746
+
747
+ function checkedRouteContext(value) {
748
+ try {
749
+ const fields = __velarOptions(value, "RouteContext", __velarOptionFields(["path", "params", "query", "hash"]));
750
+ if (Object.keys(fields).length !== 4 || typeof fields.path !== "string" || fields.path.length > 2 * 1024 * 1024
751
+ || !isBoundedStringMap(fields.params) || !isBoundedStringMap(fields.query)
752
+ || typeof fields.hash !== "string" || fields.hash.length > 2 * 1024 * 1024) return null;
753
+ return value;
754
+ } catch { return null; }
755
+ }
756
+
757
+ export const RouteContext = __velarRegisterRuntimeType(Object.freeze({
758
+ is(value) { return checkedRouteContext(value) !== null; },
759
+ parse(value) {
760
+ if (checkedRouteContext(value) === null) throw new TypeError("RouteContext requires bounded path/hash text and string params/query Maps");
761
+ return value;
762
+ },
763
+ }));
764
+
765
+ function validateRoutePath(path) {
766
+ if (typeof path !== "string" || !path.startsWith("/")) throw new TypeError("A VelarScript route path must start with '/'");
767
+ if (path.length > 8192) throw new RangeError("A VelarScript route path cannot exceed 8192 code units");
768
+ if (path.includes("?") || path.includes("#")) throw new TypeError("A VelarScript route path describes only a pathname");
769
+ if (path.includes("\\")) throw new TypeError("A VelarScript route path cannot contain a backslash");
770
+ if (path.length > 1 && path.endsWith("/")) throw new TypeError("A VelarScript route path cannot end with '/'");
771
+ const names = new Set();
772
+ const segments = path.split("/").slice(1);
773
+ for (const [index, segment] of segments.entries()) {
774
+ if (!segment && path !== "/") throw new TypeError("A VelarScript route path cannot contain an empty segment");
775
+ if (segment === "*") {
776
+ if (index !== segments.length - 1) throw new TypeError("A VelarScript route wildcard must be the final segment");
777
+ if (names.has("wildcard")) throw new TypeError("A VelarScript route parameter named 'wildcard' conflicts with the '*' capture");
778
+ names.add("wildcard");
779
+ continue;
780
+ }
781
+ if (segment.includes("*")) throw new TypeError("A VelarScript route wildcard must occupy its whole final segment");
782
+ if (!segment.startsWith(":")) continue;
783
+ const name = segment.slice(1);
784
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/u.test(name)) throw new TypeError("A VelarScript route parameter requires a valid name");
785
+ if (names.has(name)) throw new TypeError("A VelarScript route parameter cannot be repeated: " + name);
786
+ names.add(name);
787
+ }
788
+ return path;
789
+ }
790
+
791
+ function compileRoutePath(path) {
792
+ const names = [];
793
+ const source = path.split("/").map((part) => {
794
+ if (part === "*") { names.push("wildcard"); return "(.*)"; }
795
+ if (part.startsWith(":")) { names.push(part.slice(1)); return "([^/]+)"; }
796
+ return part.replace(/[.*+?^$(){}|[\]\\]/g, "\\$&");
797
+ }).join("/");
798
+ return Object.freeze({ names: Object.freeze(names), pattern: new RegExp("^" + source + "/?$") });
799
+ }
800
+
801
+ export function route(path, component) {
802
+ path = validateRoutePath(path);
803
+ if (typeof component !== "function") throw new TypeError("A VelarScript route component must be callable");
804
+ return Object.freeze({ path, component });
805
+ }
806
+
807
+ export function lazy(loader, exportName, loading = null, failed = null) {
808
+ if (typeof loader !== "function") throw new TypeError("VelarScript lazy requires a module loader");
809
+ if (typeof exportName !== "string" || !exportName) throw new TypeError("VelarScript lazy requires an exported component name");
810
+ if (exportName.length > 4096) throw new RangeError("VelarScript lazy export names cannot exceed 4096 characters");
811
+ if (loading != null && typeof loading !== "function") throw new TypeError("VelarScript lazy loading fallback must be a component");
812
+ if (failed != null && typeof failed !== "function") throw new TypeError("VelarScript lazy failure fallback must be a component");
813
+
814
+ let resolved = null;
815
+ let pending = null;
816
+ const load = () => {
817
+ if (resolved) return Promise.resolve(resolved);
818
+ if (!pending) {
819
+ pending = Promise.resolve().then(loader).then((module) => {
820
+ const target = module && module[exportName];
821
+ if (typeof target !== "function") throw new TypeError("Dynamically loaded module has no component export '" + exportName + "'");
822
+ resolved = target;
823
+ return target;
824
+ }).catch((error) => {
825
+ pending = null;
826
+ throw error;
827
+ });
828
+ }
829
+ return pending;
830
+ };
831
+
832
+ return function VelarLazy(props = {}, namespace = "html") {
833
+ const svg = namespace === "svg";
834
+ const host = svg
835
+ ? __velarDomCreateElementNS("http://www.w3.org/2000/svg", "g")
836
+ : __velarDomCreateElement("velar-lazy");
837
+ if (!svg) host.style.display = "contents";
838
+ let active = loading ? loading({}, namespace) : null;
839
+ if (active != null && !active.__velarComponent) throw new TypeError("VelarScript lazy loading fallback must render a component");
840
+ let mounted = false;
841
+ let destroyed = false;
842
+ if (active && active.__velarComponent) __velarDomAppend(host, active.node);
843
+ else __velarDomAppend(host, __velarDomCreateComment("lazy component loading"));
844
+
845
+ const replace = (next) => {
846
+ if (!next || !next.__velarComponent) throw new TypeError("VelarScript lazy fallbacks must render components");
847
+ if (destroyed) { next.destroy(); return; }
848
+ if (active && active.__velarComponent) active.destroy(false);
849
+ active = next;
850
+ __velarDomReplaceChildren(host, next.node);
851
+ if (mounted) next.__mount();
852
+ };
853
+
854
+ const fail = (value) => {
855
+ const error = __velarNormalizeError(value);
856
+ const runtime = globalThis[Symbol.for(${JSON.stringify(VELAR_RUNTIME_REGISTRY_KEY)})];
857
+ runtime?.report?.(error, { phase: "resource", detail: "lazy:" + exportName, component: exportName, unhandled: false });
858
+ try {
859
+ if (failed) replace(failed({ error }, namespace));
860
+ else {
861
+ const message = svg
862
+ ? __velarDomCreateElementNS("http://www.w3.org/2000/svg", "text")
863
+ : __velarDomCreateElement("div");
864
+ __velarDomSetAttribute(message, "role", "alert");
865
+ __velarDomSetText(message, "Unable to load " + exportName);
866
+ replace(component(message));
867
+ }
868
+ } catch (fallbackFailure) {
869
+ const fallbackError = __velarNormalizeError(fallbackFailure);
870
+ runtime?.report?.(fallbackError, { phase: "render", detail: "lazy-fallback:" + exportName, component: exportName, unhandled: false });
871
+ if (active && active.__velarComponent) active.destroy(false);
872
+ active = null;
873
+ if (!destroyed) {
874
+ const message = svg
875
+ ? __velarDomCreateElementNS("http://www.w3.org/2000/svg", "text")
876
+ : __velarDomCreateElement("div");
877
+ __velarDomSetAttribute(message, "role", "alert");
878
+ __velarDomSetText(message, "Unable to render " + exportName);
879
+ __velarDomReplaceChildren(host, message);
880
+ }
881
+ }
882
+ };
883
+
884
+ void load().then((target) => replace(target(props, namespace))).catch(fail);
885
+
886
+ return component(host, () => {
887
+ mounted = true;
888
+ if (active && active.__velarComponent) active.__mount();
889
+ }, () => {
890
+ destroyed = true;
891
+ if (active && active.__velarComponent) active.destroy(false);
892
+ });
893
+ };
894
+ }
895
+
896
+ export function navigate(to, options = {}) {
897
+ options = __velarOptions(options, "Navigation options", __velarOptionFields(["replace", "scroll"]));
898
+ const replace = options.replace ?? false;
899
+ const scroll = options.scroll ?? true;
900
+ __velarBool(replace, "Navigation replace");
901
+ __velarBool(scroll, "Navigation scroll");
902
+ const href = internalHref(to);
903
+ if (replace) __velarBrowserCall(__velarBrowserHistory, "replaceState", __velarBrowserHistoryReplace, __velarBrowserHistoryConstructor, [null, "", href]);
904
+ else __velarBrowserCall(__velarBrowserHistory, "pushState", __velarBrowserHistoryPush, __velarBrowserHistoryConstructor, [null, "", href]);
905
+ if (typeof __velarBrowserPopStateEventConstructor !== "function") throw new TypeError("The browser PopStateEvent API is unavailable");
906
+ const event = new __velarBrowserPopStateEventConstructor("popstate");
907
+ __velarBrowserCallCaptured(__velarBrowserGlobalDispatchEvent, __velarBrowserWindow, [event], "dispatchEvent");
908
+ if (scroll) __velarBrowserCallCaptured(__velarBrowserAnimationFrame, __velarBrowserWindow, [() => {
909
+ __velarBrowserCallCaptured(__velarBrowserScrollTo, __velarBrowserWindow, [{ top: 0, left: 0 }], "scrollTo");
910
+ }], "requestAnimationFrame");
911
+ return null;
912
+ }
913
+
914
+ export function redirect(to) {
915
+ return navigate(to, { replace: true });
916
+ }
917
+
918
+ export function back() {
919
+ __velarBrowserCall(__velarBrowserHistory, "back", __velarBrowserHistoryBack, __velarBrowserHistoryConstructor);
920
+ return null;
921
+ }
922
+
923
+ export function forward() {
924
+ __velarBrowserCall(__velarBrowserHistory, "forward", __velarBrowserHistoryForward, __velarBrowserHistoryConstructor);
925
+ return null;
926
+ }
927
+
928
+ export function reload() {
929
+ __velarBrowserCall(__velarBrowserLocation, "reload", __velarBrowserLocationReload, __velarBrowserLocationConstructor);
930
+ return null;
931
+ }
932
+
933
+ export function currentRoute() {
934
+ const path = applicationPath(webLocationField("pathname", __velarBrowserLocationPathname)) ?? "/";
935
+ return Object.freeze({ path, params: new Map(), query: queryValues(), hash: routeHash() });
936
+ }
937
+
938
+ export function Head(props) {
939
+ props = __velarOptions(props, "Head props", __velarOptionFields(["title", "description", "canonical", "robots", "image", "themeColor", "language"]));
940
+ let { title, description = "", canonical = "", robots = "", image = "", themeColor = "", language = "" } = props;
941
+ title = __velarString(title, "Head title");
942
+ description = __velarString(description, "Head description");
943
+ canonical = __velarString(canonical, "Head canonical URL");
944
+ robots = __velarString(robots, "Head robots");
945
+ image = __velarString(image, "Head image");
946
+ themeColor = __velarString(themeColor, "Head theme color");
947
+ language = __velarString(language, "Head language");
948
+ if (title.length > 4096) throw new RangeError("Head titles cannot exceed 4096 characters");
949
+ if (description.length > 65536) throw new RangeError("Head descriptions cannot exceed 64 KiB");
950
+ if (canonical.length > 2 * 1024 * 1024 || image.length > 2 * 1024 * 1024) throw new RangeError("Head URLs cannot exceed 2 MiB");
951
+ if (robots.length > 4096) throw new RangeError("Head robots cannot exceed 4096 characters");
952
+ if (themeColor.length > 256) throw new RangeError("Head theme colors cannot exceed 256 characters");
953
+ if (language.length > 256) throw new RangeError("Head language tags cannot exceed 256 characters");
954
+ if (language && !/^[A-Za-z]{2,8}(?:-[A-Za-z0-9]{1,8})*$/u.test(language)) {
955
+ throw new TypeError("Head language must be a simple BCP 47 language tag");
956
+ }
957
+ const node = document.createComment("velar head");
958
+ let previousTitle = "";
959
+ let previousLanguage = null;
960
+ let restorers = [];
961
+ return component(node, () => {
962
+ previousTitle = document.title;
963
+ document.title = title;
964
+ previousLanguage = document.documentElement.getAttribute("lang");
965
+ if (language) document.documentElement.setAttribute("lang", language);
966
+ restorers = [
967
+ ownHead('meta[name="description"]', "meta", "name", "description", "content", description),
968
+ ownHead('link[rel="canonical"]', "link", "rel", "canonical", "href", canonical),
969
+ ownHead('meta[name="robots"]', "meta", "name", "robots", "content", robots),
970
+ ownHead('meta[property="og:image"]', "meta", "property", "og:image", "content", image),
971
+ ownHead('meta[name="theme-color"]', "meta", "name", "theme-color", "content", themeColor),
972
+ ];
973
+ }, () => {
974
+ if (document.title === title) document.title = previousTitle;
975
+ if (language && document.documentElement.getAttribute("lang") === language) {
976
+ if (previousLanguage == null) document.documentElement.removeAttribute("lang");
977
+ else document.documentElement.setAttribute("lang", previousLanguage);
978
+ }
979
+ for (const restore of restorers.reverse()) restore();
980
+ });
981
+ }
982
+
983
+ function ownHead(selector, tag, identityName, identityValue, valueName, value) {
984
+ if (!value) return () => {};
985
+ let element = document.head.querySelector(selector);
986
+ const created = !element;
987
+ if (!element) {
988
+ element = document.createElement(tag);
989
+ element.setAttribute(identityName, identityValue);
990
+ document.head.append(element);
991
+ }
992
+ const previous = element.getAttribute(valueName);
993
+ element.setAttribute(valueName, value);
994
+ return () => {
995
+ if (element.getAttribute(valueName) !== value) return;
996
+ if (created) element.remove();
997
+ else if (previous == null) element.removeAttribute(valueName);
998
+ else element.setAttribute(valueName, previous);
999
+ };
1000
+ }
1001
+
1002
+ export function announce(message, priority = "polite") {
1003
+ message = __velarString(message, "Announcement message");
1004
+ if (message.length > 65536) throw new RangeError("Announcement messages cannot exceed 64 KiB");
1005
+ if (priority !== "polite" && priority !== "assertive") throw new TypeError("Announcement priority must be 'polite' or 'assertive'");
1006
+ let region = document.querySelector('[data-velar-announcer="' + priority + '"]');
1007
+ if (!region) {
1008
+ region = document.createElement("div");
1009
+ region.setAttribute("data-velar-announcer", priority);
1010
+ region.setAttribute("role", priority === "assertive" ? "alert" : "status");
1011
+ region.setAttribute("aria-live", priority);
1012
+ region.setAttribute("aria-atomic", "true");
1013
+ region.style.cssText = "position:fixed;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0";
1014
+ document.body.append(region);
1015
+ }
1016
+ region.textContent = "";
1017
+ __velarBrowserCallCaptured(__velarBrowserAnimationFrame, __velarBrowserWindow, [() => { region.textContent = message; }], "requestAnimationFrame");
1018
+ return null;
1019
+ }
1020
+
1021
+ export function Router(props) {
1022
+ props = __velarOptions(props, "Router props", __velarOptionFields(["routes", "fallback"]));
1023
+ let { routes, fallback = null } = props;
1024
+ const routeItems = __velarRequireList(routes, "Router routes");
1025
+ if (routeItems.length > 10000) throw new RangeError("A Router cannot contain more than 10000 routes");
1026
+ routes = routeItems.map((item) => {
1027
+ item = __velarOptions(item, "Router route", __velarOptionFields(["path", "component"]));
1028
+ validateRoutePath(item.path);
1029
+ if (typeof item.component !== "function") throw new TypeError("A Router route component must be callable");
1030
+ return Object.freeze({ path: item.path, component: item.component, matcher: compileRoutePath(item.path) });
1031
+ });
1032
+ if (fallback != null && typeof fallback !== "function") throw new TypeError("A Router fallback must be a component");
1033
+ const node = __velarDomCreateElement("velar-router");
1034
+ let active = null;
1035
+ let mounted = false;
1036
+ const notFound = ({ route }) => {
1037
+ const page = __velarDomCreateElement("main");
1038
+ __velarDomSetAttribute(page, "data-velar-not-found", "");
1039
+ const title = __velarDomCreateElement("h1");
1040
+ __velarDomSetText(title, "Page not found");
1041
+ const detail = __velarDomCreateElement("p");
1042
+ __velarDomSetText(detail, "No route matches " + route.path);
1043
+ __velarDomAppend(page, title, detail);
1044
+ return component(page);
1045
+ };
1046
+ const render = () => {
1047
+ try {
1048
+ const path = applicationPath(webLocationField("pathname", __velarBrowserLocationPathname));
1049
+ const match = path === null ? null : matchRoute(routes, path);
1050
+ const context = match?.context ?? { path: path ?? "/", params: new Map(), query: queryValues(), hash: routeHash() };
1051
+ const next = match ? match.item.component({ route: context }) : (fallback ?? notFound)({ route: context });
1052
+ if (!next || !next.__velarComponent) throw new TypeError("A VelarScript Router target must render a component");
1053
+ if (active) active.destroy();
1054
+ active = next;
1055
+ __velarDomReplaceChildren(node, active.node);
1056
+ if (mounted) active.__mount();
1057
+ } catch (value) {
1058
+ const error = __velarNormalizeError(value);
1059
+ if (!mounted) throw error;
1060
+ const runtime = globalThis[Symbol.for(${JSON.stringify(VELAR_RUNTIME_REGISTRY_KEY)})];
1061
+ if (runtime && typeof runtime.report === "function") {
1062
+ runtime.report(error, { phase: "render", detail: "router", component: "Router", unhandled: true });
1063
+ } else {
1064
+ __velarEnqueue(() => { throw error; });
1065
+ }
1066
+ }
1067
+ };
1068
+ const changed = () => render();
1069
+ let removeRouteListener = null;
1070
+ render();
1071
+ return component(node, () => {
1072
+ mounted = true;
1073
+ removeRouteListener = __velarBrowserListenGlobal("popstate", changed);
1074
+ if (active) active.__mount();
1075
+ }, () => {
1076
+ if (removeRouteListener) removeRouteListener();
1077
+ if (active) active.destroy(false);
1078
+ });
1079
+ }
1080
+
1081
+ export function Link(props) {
1082
+ props = __velarOptions(props, "Link props", __velarOptionFields(["to", "replace", "class", "look", "children"]));
1083
+ let { to, replace = false, children } = props;
1084
+ to = __velarString(to, "Link target");
1085
+ if (to.length > 2 * 1024 * 1024) throw new RangeError("Link targets cannot exceed 2 MiB");
1086
+ __velarBool(replace, "Link replace");
1087
+ const external = isExternal(to);
1088
+ const href = external ? to : internalHref(to);
1089
+ const node = __velarDomCreateElement("a");
1090
+ const releaseHost = forwardHost(node, props);
1091
+ node.href = href;
1092
+ append(node, children);
1093
+ const clicked = (event) => {
1094
+ try {
1095
+ const defaultPrevented = webEventField(event, "defaultPrevented", webEventDefaultPrevented);
1096
+ const button = webEventField(event, "button", webEventButton);
1097
+ const metaKey = webEventField(event, "metaKey", webEventMetaKey);
1098
+ const ctrlKey = webEventField(event, "ctrlKey", webEventCtrlKey);
1099
+ const shiftKey = webEventField(event, "shiftKey", webEventShiftKey);
1100
+ const altKey = webEventField(event, "altKey", webEventAltKey);
1101
+ if (defaultPrevented === webEventMissingField || button === webEventMissingField || metaKey === webEventMissingField
1102
+ || ctrlKey === webEventMissingField || shiftKey === webEventMissingField || altKey === webEventMissingField
1103
+ || typeof defaultPrevented !== "boolean" || !Number.isSafeInteger(button)
1104
+ || typeof metaKey !== "boolean" || typeof ctrlKey !== "boolean" || typeof shiftKey !== "boolean" || typeof altKey !== "boolean") {
1105
+ throw new TypeError("Link received an invalid click event");
1106
+ }
1107
+ if (defaultPrevented || button !== 0 || metaKey || ctrlKey || shiftKey || altKey) return;
1108
+ if (external) return;
1109
+ if (webUrlField(webUrl(node.href, webLocationField("href", __velarBrowserLocationHref)), "origin", __velarBrowserUrlOrigin)
1110
+ !== webLocationField("origin", __velarBrowserLocationOrigin)) return;
1111
+ webEventCall(event, "preventDefault", webEventPreventDefault);
1112
+ navigate(to, { replace });
1113
+ } catch (failure) { reportLinkEventFailure(failure); }
1114
+ };
1115
+ let removeClick = null;
1116
+ return component(node, () => { removeClick = __velarBrowserListen(node, "click", clicked); }, () => { if (removeClick) removeClick(); releaseHost(); });
1117
+ }
1118
+
1119
+ export function NavLink(props) {
1120
+ props = __velarOptions(props, "NavLink props", __velarOptionFields(["to", "exact", "replace", "class", "look", "children"]));
1121
+ let { to, exact = false, replace = false, children } = props;
1122
+ to = __velarString(to, "NavLink target");
1123
+ __velarBool(exact, "NavLink exact");
1124
+ __velarBool(replace, "NavLink replace");
1125
+ internalHref(to);
1126
+ const linked = Link({ to, replace, class: props.class, look: props.look, children });
1127
+ const target = normalizeApplicationPath(webUrlField(webUrl(to, "https://velar.invalid"), "pathname", __velarBrowserUrlPathname));
1128
+ const update = () => {
1129
+ const application = applicationPath(webLocationField("pathname", __velarBrowserLocationPathname));
1130
+ const current = application === null ? null : normalizeApplicationPath(application);
1131
+ const active = current !== null && (current === target || (!exact && target !== "/" && current.startsWith(target + "/")));
1132
+ if (active) __velarDomSetAttribute(linked.node, "aria-current", "page");
1133
+ else __velarDomRemoveAttribute(linked.node, "aria-current");
1134
+ };
1135
+ let removeRouteListener = null;
1136
+ update();
1137
+ return component(linked.node, () => {
1138
+ linked.__mount();
1139
+ removeRouteListener = __velarBrowserListenGlobal("popstate", update);
1140
+ }, () => {
1141
+ if (removeRouteListener) removeRouteListener();
1142
+ linked.destroy(false);
1143
+ });
1144
+ }
1145
+
1146
+ // These runtime-implemented components read their props exactly once at
1147
+ // construction; the emitted instantiation path snapshots each prop thunk for
1148
+ // them instead of building a live reactive props store, so their strict
1149
+ // record validation keeps rejecting accessor fields.
1150
+ Head.__velarSnapshotProps = true;
1151
+ Router.__velarSnapshotProps = true;
1152
+ Link.__velarSnapshotProps = true;
1153
+ NavLink.__velarSnapshotProps = true;
1154
+
1155
+ function forwardHost(node, props) {
1156
+ const cleanups = [];
1157
+ if (props.class != null) {
1158
+ if (typeof props.class !== "string") throw new TypeError("Link class must be a string");
1159
+ const names = props.class.split(/\s+/).filter(Boolean);
1160
+ node.classList.add(...names);
1161
+ cleanups.push(() => node.classList.remove(...names));
1162
+ }
1163
+ if (props.look != null) {
1164
+ const runtime = globalThis[Symbol.for(${JSON.stringify(VELAR_RUNTIME_REGISTRY_KEY)})];
1165
+ if (!runtime || typeof runtime.applyLook !== "function") throw new TypeError("Link Look requires the VelarScript Web runtime");
1166
+ cleanups.push(runtime.applyLook(node, props.look));
1167
+ }
1168
+ return () => { for (const cleanup of cleanups.reverse()) cleanup(); };
1169
+ }
1170
+
1171
+ function normalizeApplicationPath(path) {
1172
+ return path.length > 1 ? path.replace(/\/+$/u, "") : "/";
1173
+ }
1174
+
1175
+ function matchRoute(routes, pathname) {
1176
+ for (const item of routes) {
1177
+ const result = item.matcher.pattern.exec(pathname);
1178
+ if (!result) continue;
1179
+ const params = new Map();
1180
+ let decodable = true;
1181
+ for (const [index, name] of item.matcher.names.entries()) {
1182
+ try { params.set(name, decodeURIComponent(result[index + 1] ?? "")); }
1183
+ catch { decodable = false; break; }
1184
+ }
1185
+ if (!decodable) continue;
1186
+ return { item, context: { path: pathname, params, query: queryValues(), hash: routeHash() } };
1187
+ }
1188
+ return null;
1189
+ }
1190
+
1191
+ function applicationPath(pathname) {
1192
+ if (typeof pathname !== "string" || pathname.length > 2 * 1024 * 1024) throw new RangeError("Application paths cannot exceed 2 MiB");
1193
+ if (appBase === "/") return pathname;
1194
+ const prefix = appBase.slice(0, -1);
1195
+ if (pathname === prefix) return "/";
1196
+ return pathname.startsWith(appBase) ? "/" + pathname.slice(appBase.length) : null;
1197
+ }
1198
+
1199
+ function internalHref(to) {
1200
+ if (typeof to !== "string" || !to.startsWith("/") || isExternal(to)) throw new TypeError("VelarScript navigation targets must be application paths starting with '/'");
1201
+ if (to.length > 2 * 1024 * 1024) throw new RangeError("VelarScript navigation targets cannot exceed 2 MiB");
1202
+ const parsed = webUrl(to, "https://velar.invalid");
1203
+ const pathname = webUrlField(parsed, "pathname", __velarBrowserUrlPathname);
1204
+ const search = webUrlField(parsed, "search", __velarBrowserUrlSearch);
1205
+ const hash = webUrlField(parsed, "hash", __velarBrowserUrlHash);
1206
+ return appBase + pathname.slice(1) + search + hash;
1207
+ }
1208
+
1209
+ function isExternal(to) {
1210
+ return typeof to === "string" && (/^[a-z][a-z\d+.-]*:/i.test(to) || to.startsWith("//"));
1211
+ }
1212
+
1213
+ function queryValues() {
1214
+ const search = webLocationField("search", __velarBrowserLocationSearch);
1215
+ if (typeof search !== "string") throw new TypeError("Route queries require browser text");
1216
+ if (search.length > 2 * 1024 * 1024) throw new RangeError("Route queries cannot exceed 2 MiB");
1217
+ const output = new Map();
1218
+ let count = 0;
1219
+ if (typeof __velarBrowserUrlSearchParamsConstructor !== "function" || typeof __velarBrowserUrlSearchParamsForEach !== "function") {
1220
+ throw new TypeError("The browser URLSearchParams API is unavailable");
1221
+ }
1222
+ const params = new __velarBrowserUrlSearchParamsConstructor(search);
1223
+ __velarBrowserCallCaptured(__velarBrowserUrlSearchParamsForEach, params, [(value, name) => {
1224
+ count += 1;
1225
+ if (count > 100000) throw new RangeError("Route queries cannot exceed 100000 fields");
1226
+ output.set(name, value);
1227
+ }], "URLSearchParams.forEach");
1228
+ return output;
1229
+ }
1230
+
1231
+ function routeHash() {
1232
+ const hash = webLocationField("hash", __velarBrowserLocationHash);
1233
+ if (typeof hash !== "string") throw new TypeError("Route hashes require browser text");
1234
+ if (hash.length > 2 * 1024 * 1024) throw new RangeError("Route hashes cannot exceed 2 MiB");
1235
+ return hash;
1236
+ }
1237
+
1238
+ function component(node, mounted, cleanup) {
1239
+ let destroyed = false;
1240
+ let ready = false;
1241
+ return {
1242
+ __velarComponent: true,
1243
+ node,
1244
+ mount(target, before = null) {
1245
+ if (destroyed) throw new Error("Cannot mount a destroyed VelarScript component");
1246
+ if (ready) throw new Error("Cannot mount a VelarScript component more than once");
1247
+ const parent = typeof target === "string" ? __velarDomQuerySelector(target) : target;
1248
+ if (!parent) throw new Error("VelarScript mount target was not found");
1249
+ __velarDomInsertBefore(parent, node, before);
1250
+ this.__mount();
1251
+ return null;
1252
+ },
1253
+ __mount() { if (!destroyed && !ready) { ready = true; if (mounted) mounted(); } },
1254
+ destroy(remove = true) { if (!destroyed) { destroyed = true; if (cleanup) cleanup(); if (remove) __velarDomRemove(node); } return null; },
1255
+ };
1256
+ }
1257
+
1258
+ function append(parent, value, state = null) {
1259
+ state ??= { active: __velarDomCreateSet(), depth: 0, values: 0, text: 0 };
1260
+ if (value == null || value === false || value === true) return;
1261
+ state.values += 1;
1262
+ if (state.values > 1000000) throw new RangeError("JSX cannot render more than 1000000 values");
1263
+ if (typeof value === "string") {
1264
+ state.text += value.length;
1265
+ if (state.text > 16 * 1024 * 1024) throw new RangeError("JSX text cannot exceed 16 MiB");
1266
+ __velarDomAppend(parent, __velarDomCreateTextNode(value));
1267
+ return;
1268
+ }
1269
+ if (typeof value === "number") {
1270
+ if (!__velarDomIsFinite(value)) throw new TypeError("JSX numbers must be finite");
1271
+ __velarDomAppend(parent, __velarDomCreateTextNode(__velarDomString(value)));
1272
+ return;
1273
+ }
1274
+ if (__velarDomIsNode(value)) { __velarDomAppend(parent, value); return; }
1275
+ if (__velarDomIsArray(value)) {
1276
+ if (state.depth >= 128) throw new RangeError("JSX Lists cannot exceed 128 nested levels");
1277
+ if (__velarDomSetContains(state.active, value)) throw new TypeError("JSX cannot render a cyclic List");
1278
+ const values = __velarRequireList(value, "JSX children");
1279
+ __velarDomSetInsert(state.active, value);
1280
+ state.depth += 1;
1281
+ try { for (const item of values) append(parent, item, state); }
1282
+ finally { state.depth -= 1; __velarDomSetRemove(state.active, value); }
1283
+ return;
1284
+ }
1285
+ throw new TypeError("JSX can render only text, finite numbers, bool, enums, WebNode values, and Lists of those values");
1286
+ }
1287
+ `.trimStart()],
1288
+ ["velar/forms", String.raw `
1289
+ ${listRuntime}
1290
+ ${optionsRuntime}
1291
+ ${runtimeTypeRuntime}
1292
+ const NativeFormElement = typeof globalThis.HTMLFormElement === "function" ? globalThis.HTMLFormElement : null;
1293
+ const NativeFormData = typeof globalThis.FormData === "function" ? globalThis.FormData : null;
1294
+ const NativeFormMap = typeof globalThis.Map === "function" ? globalThis.Map : null;
1295
+ const NativeFormWeakMap = typeof globalThis.WeakMap === "function" ? globalThis.WeakMap : null;
1296
+ const NativeFormNumber = typeof globalThis.Number === "function" ? globalThis.Number : null;
1297
+ const NativeFormNode = typeof globalThis.Node === "function" ? globalThis.Node : null;
1298
+ const NativeFormElementBase = typeof globalThis.Element === "function" ? globalThis.Element : null;
1299
+ const NativeFormHtmlElement = typeof globalThis.HTMLElement === "function" ? globalThis.HTMLElement : null;
1300
+ const NativeFormDocumentConstructor = typeof globalThis.Document === "function" ? globalThis.Document : null;
1301
+ const NativeFormDocument = globalThis.document ?? null;
1302
+ const NativeFormHtmlCollection = typeof globalThis.HTMLCollection === "function" ? globalThis.HTMLCollection : null;
1303
+ const NativeFormNodeList = typeof globalThis.NodeList === "function" ? globalThis.NodeList : null;
1304
+ const NativeFormInput = typeof globalThis.HTMLInputElement === "function" ? globalThis.HTMLInputElement : null;
1305
+ const NativeFormButton = typeof globalThis.HTMLButtonElement === "function" ? globalThis.HTMLButtonElement : null;
1306
+ const NativeFormSelect = typeof globalThis.HTMLSelectElement === "function" ? globalThis.HTMLSelectElement : null;
1307
+ const NativeFormTextArea = typeof globalThis.HTMLTextAreaElement === "function" ? globalThis.HTMLTextAreaElement : null;
1308
+ const NativeFormFieldSet = typeof globalThis.HTMLFieldSetElement === "function" ? globalThis.HTMLFieldSetElement : null;
1309
+ const NativeFormOptGroup = typeof globalThis.HTMLOptGroupElement === "function" ? globalThis.HTMLOptGroupElement : null;
1310
+ const NativeFormOption = typeof globalThis.HTMLOptionElement === "function" ? globalThis.HTMLOptionElement : null;
1311
+ const formReflectApply = Object.getOwnPropertyDescriptor(Reflect, "apply")?.value;
1312
+ const formHasInstance = Object.getOwnPropertyDescriptor(Function.prototype, Symbol.hasInstance)?.value;
1313
+ const formGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor(Object, "getOwnPropertyDescriptor")?.value;
1314
+ const formDefineProperty = Object.getOwnPropertyDescriptor(Object, "defineProperty")?.value;
1315
+ const formDataGet = typeof NativeFormData === "function" ? Object.getOwnPropertyDescriptor(NativeFormData.prototype, "get")?.value : null;
1316
+ const formDataGetAll = typeof NativeFormData === "function" ? Object.getOwnPropertyDescriptor(NativeFormData.prototype, "getAll")?.value : null;
1317
+ const formDataHas = typeof NativeFormData === "function" ? Object.getOwnPropertyDescriptor(NativeFormData.prototype, "has")?.value : null;
1318
+ const formDataForEach = typeof NativeFormData === "function" ? Object.getOwnPropertyDescriptor(NativeFormData.prototype, "forEach")?.value : null;
1319
+ const formMapGet = typeof NativeFormMap === "function" ? Object.getOwnPropertyDescriptor(NativeFormMap.prototype, "get")?.value : null;
1320
+ const formMapHas = typeof NativeFormMap === "function" ? Object.getOwnPropertyDescriptor(NativeFormMap.prototype, "has")?.value : null;
1321
+ const formMapSet = typeof NativeFormMap === "function" ? Object.getOwnPropertyDescriptor(NativeFormMap.prototype, "set")?.value : null;
1322
+ const formWeakMapGet = typeof NativeFormWeakMap === "function" ? Object.getOwnPropertyDescriptor(NativeFormWeakMap.prototype, "get")?.value : null;
1323
+ const formWeakMapHas = typeof NativeFormWeakMap === "function" ? Object.getOwnPropertyDescriptor(NativeFormWeakMap.prototype, "has")?.value : null;
1324
+ const formWeakMapSet = typeof NativeFormWeakMap === "function" ? Object.getOwnPropertyDescriptor(NativeFormWeakMap.prototype, "set")?.value : null;
1325
+ const formWeakMapDelete = typeof NativeFormWeakMap === "function" ? Object.getOwnPropertyDescriptor(NativeFormWeakMap.prototype, "delete")?.value : null;
1326
+ const formStringTrim = Object.getOwnPropertyDescriptor(String.prototype, "trim")?.value;
1327
+ const formRegexTest = Object.getOwnPropertyDescriptor(RegExp.prototype, "test")?.value;
1328
+ const formRegexSplit = Object.getOwnPropertyDescriptor(RegExp.prototype, Symbol.split)?.value;
1329
+ const formArrayJoin = Object.getOwnPropertyDescriptor(Array.prototype, "join")?.value;
1330
+ const formNumberIsFinite = Object.getOwnPropertyDescriptor(Number, "isFinite")?.value;
1331
+ const formNumberIsSafeInteger = Object.getOwnPropertyDescriptor(Number, "isSafeInteger")?.value;
1332
+ const formElementOwner = NativeFormElementBase ?? NativeFormElement;
1333
+ const formHtmlOwner = NativeFormHtmlElement ?? NativeFormElement;
1334
+ const formDocumentCreateElement = typeof NativeFormDocumentConstructor === "function"
1335
+ ? Object.getOwnPropertyDescriptor(NativeFormDocumentConstructor.prototype, "createElement")?.value
1336
+ : NativeFormDocument && typeof NativeFormDocument === "object" ? Object.getOwnPropertyDescriptor(NativeFormDocument, "createElement")?.value : null;
1337
+ const formElementGetAttribute = typeof formElementOwner === "function" ? Object.getOwnPropertyDescriptor(formElementOwner.prototype, "getAttribute")?.value : null;
1338
+ const formElementSetAttribute = typeof formElementOwner === "function" ? Object.getOwnPropertyDescriptor(formElementOwner.prototype, "setAttribute")?.value : null;
1339
+ const formElementRemoveAttribute = typeof formElementOwner === "function" ? Object.getOwnPropertyDescriptor(formElementOwner.prototype, "removeAttribute")?.value : null;
1340
+ const formElementInsertAdjacentElement = typeof formElementOwner === "function" ? Object.getOwnPropertyDescriptor(formElementOwner.prototype, "insertAdjacentElement")?.value : null;
1341
+ const formElementRemove = typeof formElementOwner === "function" ? Object.getOwnPropertyDescriptor(formElementOwner.prototype, "remove")?.value : null;
1342
+ const formElementQuerySelector = typeof formElementOwner === "function"
1343
+ ? Object.getOwnPropertyDescriptor(formElementOwner.prototype, "querySelector")?.value ?? Object.getOwnPropertyDescriptor(NativeFormElement?.prototype ?? {}, "querySelector")?.value : null;
1344
+ const formElementQuerySelectorAll = typeof formElementOwner === "function"
1345
+ ? Object.getOwnPropertyDescriptor(formElementOwner.prototype, "querySelectorAll")?.value ?? Object.getOwnPropertyDescriptor(NativeFormElement?.prototype ?? {}, "querySelectorAll")?.value : null;
1346
+ const formHtmlFocus = typeof formHtmlOwner === "function" ? Object.getOwnPropertyDescriptor(formHtmlOwner.prototype, "focus")?.value : null;
1347
+ const formNativeReset = typeof NativeFormElement === "function" ? Object.getOwnPropertyDescriptor(NativeFormElement.prototype, "reset")?.value : null;
1348
+ const formElementsGet = typeof NativeFormElement === "function" ? Object.getOwnPropertyDescriptor(NativeFormElement.prototype, "elements")?.get : null;
1349
+ const formCollectionLengthGet = typeof NativeFormHtmlCollection === "function" ? Object.getOwnPropertyDescriptor(NativeFormHtmlCollection.prototype, "length")?.get : null;
1350
+ const formCollectionItem = typeof NativeFormHtmlCollection === "function" ? Object.getOwnPropertyDescriptor(NativeFormHtmlCollection.prototype, "item")?.value : null;
1351
+ const formNodeListLengthGet = typeof NativeFormNodeList === "function" ? Object.getOwnPropertyDescriptor(NativeFormNodeList.prototype, "length")?.get : null;
1352
+ const formNodeListItem = typeof NativeFormNodeList === "function" ? Object.getOwnPropertyDescriptor(NativeFormNodeList.prototype, "item")?.value : null;
1353
+ const formNodeTextContent = typeof NativeFormNode === "function" ? Object.getOwnPropertyDescriptor(NativeFormNode.prototype, "textContent") : null;
1354
+ const formElementId = typeof formElementOwner === "function" ? Object.getOwnPropertyDescriptor(formElementOwner.prototype, "id") : null;
1355
+ const formControlContracts = [
1356
+ NativeFormInput, NativeFormButton, NativeFormSelect, NativeFormTextArea, NativeFormFieldSet, NativeFormOptGroup, NativeFormOption,
1357
+ ].map((constructor) => constructor && typeof constructor === "function" ? {
1358
+ constructor,
1359
+ name: Object.getOwnPropertyDescriptor(constructor.prototype, "name") ?? null,
1360
+ disabled: Object.getOwnPropertyDescriptor(constructor.prototype, "disabled") ?? null,
1361
+ } : null);
1362
+ let nextErrorId = 1;
1363
+ const pendingFields = typeof NativeFormWeakMap === "function" ? new NativeFormWeakMap() : null;
1364
+ const maxFormFields = 100000;
1365
+ const maxFormTextCodeUnits = 16 * 1024 * 1024;
1366
+ function formText(value, name, maximum = 1024) { value = __velarString(value, name); if (value.length > maximum) throw new RangeError(name + " is too long"); return value; }
1367
+ function formCall(operation, receiver, arguments_, name) {
1368
+ if (typeof operation !== "function" || typeof formReflectApply !== "function") {
1369
+ throw new TypeError("The browser does not expose native " + name);
1370
+ }
1371
+ return formReflectApply(operation, receiver, arguments_);
1372
+ }
1373
+ function formInstance(constructor, value) {
1374
+ if (typeof constructor !== "function" || typeof formHasInstance !== "function" || typeof formReflectApply !== "function") return false;
1375
+ try { return formReflectApply(formHasInstance, constructor, [value]); } catch { return false; }
1376
+ }
1377
+ function formOwnDescriptor(value, name) {
1378
+ if ((typeof value !== "object" && typeof value !== "function") || value === null
1379
+ || typeof formGetOwnPropertyDescriptor !== "function" || typeof formReflectApply !== "function") return null;
1380
+ return formReflectApply(formGetOwnPropertyDescriptor, __velarOptionsNativeObject, [value, name]);
1381
+ }
1382
+ function formHostMethod(operation, owner, receiver, arguments_, name) {
1383
+ if (formInstance(owner, receiver)) return formCall(operation, receiver, arguments_, name);
1384
+ const descriptor = formOwnDescriptor(receiver, name);
1385
+ if (descriptor?.enumerable && "value" in descriptor && typeof descriptor.value === "function") {
1386
+ return formCall(descriptor.value, receiver, arguments_, name);
1387
+ }
1388
+ throw new TypeError("The browser does not expose native " + name);
1389
+ }
1390
+ function formHostRead(descriptor, owner, receiver, name) {
1391
+ if (formInstance(owner, receiver) && typeof descriptor?.get === "function") return formCall(descriptor.get, receiver, [], name);
1392
+ const own = formOwnDescriptor(receiver, name);
1393
+ if (own?.enumerable && "value" in own) return own.value;
1394
+ throw new TypeError("The browser does not expose a data-only " + name);
1395
+ }
1396
+ function formHostWrite(descriptor, owner, receiver, name, value) {
1397
+ if (formInstance(owner, receiver) && typeof descriptor?.set === "function") {
1398
+ formCall(descriptor.set, receiver, [value], name);
1399
+ return;
1400
+ }
1401
+ const own = formOwnDescriptor(receiver, name);
1402
+ if (!own?.enumerable || !("value" in own) || !own.writable || typeof formDefineProperty !== "function") {
1403
+ throw new TypeError("The browser does not expose a writable data-only " + name);
1404
+ }
1405
+ formReflectApply(formDefineProperty, __velarOptionsNativeObject, [receiver, name, {...own, value}]);
1406
+ }
1407
+ function formControlContract(value, field, writing = false) {
1408
+ for (let index = 0; index < formControlContracts.length; index += 1) {
1409
+ const contract = formControlContracts[index];
1410
+ if (!contract || !formInstance(contract.constructor, value)) continue;
1411
+ const descriptor = contract[field];
1412
+ if (writing ? typeof descriptor?.set === "function" : typeof descriptor?.get === "function") return [contract.constructor, descriptor];
1413
+ throw new TypeError("The browser form control does not expose native " + field);
1414
+ }
1415
+ return [null, null];
1416
+ }
1417
+ function formControlRead(value, field) {
1418
+ const [owner, descriptor] = formControlContract(value, field, false);
1419
+ return formHostRead(descriptor, owner, value, field);
1420
+ }
1421
+ function formControlWrite(value, field, item) {
1422
+ const [owner, descriptor] = formControlContract(value, field, true);
1423
+ formHostWrite(descriptor, owner, value, field, item);
1424
+ }
1425
+ function formSnapshotCollection(value, name, maximum) {
1426
+ if (__velarListReflectApply(__velarListArrayIsArray, __velarListNativeArray, [value])) {
1427
+ const output = __velarRequireList(value, name);
1428
+ if (output.length > maximum) throw new RangeError(name + " cannot exceed " + maximum + " items");
1429
+ return output;
1430
+ }
1431
+ let count;
1432
+ let itemOperation;
1433
+ if (formInstance(NativeFormHtmlCollection, value)) {
1434
+ count = formCall(formCollectionLengthGet, value, [], "HTMLCollection.length");
1435
+ itemOperation = formCollectionItem;
1436
+ } else if (formInstance(NativeFormNodeList, value)) {
1437
+ count = formCall(formNodeListLengthGet, value, [], "NodeList.length");
1438
+ itemOperation = formNodeListItem;
1439
+ } else {
1440
+ const length = formOwnDescriptor(value, "length");
1441
+ if (!length?.enumerable || !("value" in length)) throw new TypeError(name + " requires a bounded data-only collection");
1442
+ count = length.value;
1443
+ }
1444
+ if (typeof formNumberIsSafeInteger !== "function" || !formReflectApply(formNumberIsSafeInteger, NativeFormNumber, [count]) || count < 0) {
1445
+ throw new TypeError(name + " has an invalid length");
1446
+ }
1447
+ if (count > maximum) throw new RangeError(name + " cannot exceed " + maximum + " items");
1448
+ const output = new __velarListNativeArray(count);
1449
+ for (let index = 0; index < count; index += 1) {
1450
+ let item;
1451
+ if (typeof itemOperation === "function") item = formCall(itemOperation, value, [index], name + ".item");
1452
+ else {
1453
+ const descriptor = formOwnDescriptor(value, index);
1454
+ if (!descriptor?.enumerable || !("value" in descriptor)) throw new TypeError(name + " requires data-only indexed values");
1455
+ item = descriptor.value;
1456
+ }
1457
+ formListSet(output, index, item);
1458
+ }
1459
+ return output;
1460
+ }
1461
+ function formGetAttribute(element, name) { return formHostMethod(formElementGetAttribute, formElementOwner, element, [name], "getAttribute"); }
1462
+ function formSetAttribute(element, name, value) { return formHostMethod(formElementSetAttribute, formElementOwner, element, [name, value], "setAttribute"); }
1463
+ function formRemoveAttribute(element, name) { return formHostMethod(formElementRemoveAttribute, formElementOwner, element, [name], "removeAttribute"); }
1464
+ function formAttributeTokens(value) {
1465
+ value = formText(value, "Form accessibility metadata", 65536);
1466
+ if (!value) return new __velarListNativeArray();
1467
+ const raw = formCall(formRegexSplit, /\s+/u, [value], "RegExp split");
1468
+ const input = __velarRequireList(raw, "Form accessibility metadata tokens");
1469
+ const output = new __velarListNativeArray();
1470
+ const seen = typeof NativeFormMap === "function" ? new NativeFormMap() : null;
1471
+ if (!seen) throw new TypeError("The browser Map API is unavailable");
1472
+ for (let index = 0; index < input.length; index += 1) {
1473
+ const token = input[index];
1474
+ if (!token || formCall(formMapHas, seen, [token], "Map.has")) continue;
1475
+ formCall(formMapSet, seen, [token, true], "Map.set");
1476
+ formListSet(output, output.length, token);
1477
+ }
1478
+ return output;
1479
+ }
1480
+ function formJoinTokens(tokens) { return formCall(formArrayJoin, tokens, [" "], "Array.join"); }
1481
+ function formData(form) {
1482
+ if (typeof NativeFormData !== "function") throw new TypeError("The browser FormData API is unavailable");
1483
+ return new NativeFormData(form);
1484
+ }
1485
+ function formListSet(values, index, value) {
1486
+ __velarListReflectApply(__velarListDefineProperty, __velarListNativeObject, [values, index, {
1487
+ value, enumerable: true, configurable: true, writable: true,
1488
+ }]);
1489
+ }
1490
+ function formNumber(value) {
1491
+ if (typeof value !== "string") return null;
1492
+ if (typeof NativeFormNumber !== "function" || typeof formNumberIsFinite !== "function") {
1493
+ throw new TypeError("The browser number parsing intrinsics are unavailable");
1494
+ }
1495
+ const text = formCall(formStringTrim, value, [], "String.trim");
1496
+ if (!formCall(formRegexTest, /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/u, [text], "RegExp.test")) return null;
1497
+ const number = formReflectApply(NativeFormNumber, undefined, [text]);
1498
+ return formReflectApply(formNumberIsFinite, NativeFormNumber, [number]) ? number : null;
1499
+ }
1500
+ function formValue(value, name) {
1501
+ if (typeof value === "string" && value.length > maxFormTextCodeUnits) throw new RangeError(name + " cannot exceed 16 MiB");
1502
+ return value;
1503
+ }
1504
+ function formList(values, name) {
1505
+ const output = __velarRequireList(values, name);
1506
+ if (output.length > maxFormFields) throw new RangeError(name + " cannot exceed 100000 values");
1507
+ return output;
1508
+ }
1509
+ function formElements(form) {
1510
+ const elements = formHostRead({get: formElementsGet}, NativeFormElement, form, "elements");
1511
+ return formSnapshotCollection(elements, "Form controls", maxFormFields);
1512
+ }
1513
+ function formErrorNodes(form) {
1514
+ const nodes = formHostMethod(formElementQuerySelectorAll, formElementOwner, form, ["[data-velar-field-error]"], "querySelectorAll");
1515
+ return formSnapshotCollection(nodes, "Form field errors", maxFormFields);
1516
+ }
1517
+ function formType(value) { return __velarRequireRuntimeType(value, "Form reading"); }
1518
+ function decoderField(value) {
1519
+ value = __velarOptions(value, "Form decoder field", __velarOptionFields(["name", "kind", "optional", "enumValues"]));
1520
+ const name = formText(value.name, "Form decoder field name");
1521
+ const kind = formText(value.kind, "Form decoder field kind", 64);
1522
+ if (kind !== "string" && kind !== "number" && kind !== "bool" && kind !== "enum" && kind !== "strings") {
1523
+ throw new TypeError("Form decoder field '" + name + "' uses an unsupported decoder");
1524
+ }
1525
+ if (typeof value.optional !== "boolean") throw new TypeError("Form decoder optional must be bool");
1526
+ let enumValues = null;
1527
+ if (kind === "enum") {
1528
+ enumValues = __velarRequireList(value.enumValues, "Form enum values");
1529
+ if (enumValues.length > maxFormFields) throw new RangeError("Form enum values cannot exceed 100000 entries");
1530
+ for (let index = 0; index < enumValues.length; index += 1) {
1531
+ if (typeof enumValues[index] !== "string") throw new TypeError("Form enum values must be strings");
1532
+ }
1533
+ } else if (value.enumValues != null) {
1534
+ throw new TypeError("Only enum form decoders can declare enum values");
1535
+ }
1536
+ return __velarFreezeOptionsValue({ name, kind, optional: value.optional, enumValues });
1537
+ }
1538
+
1539
+ export function values(form) {
1540
+ requireForm(form);
1541
+ if (typeof NativeFormMap !== "function") throw new TypeError("The browser Map API is unavailable");
1542
+ const output = new NativeFormMap();
1543
+ let count = 0;
1544
+ const data = formData(form);
1545
+ formCall(formDataForEach, data, [(value, name) => {
1546
+ count += 1;
1547
+ if (count > maxFormFields) throw new RangeError("Forms cannot exceed 100000 submitted fields");
1548
+ const checkedName = formText(name, "Submitted form field name");
1549
+ formValue(value, "Form field '" + checkedName + "'");
1550
+ if (!formCall(formMapHas, output, [checkedName], "Map.has")) formCall(formMapSet, output, [checkedName, value], "Map.set");
1551
+ else {
1552
+ const current = formCall(formMapGet, output, [checkedName], "Map.get");
1553
+ if (__velarListReflectApply(__velarListArrayIsArray, __velarListNativeArray, [current])) {
1554
+ formListSet(current, current.length, value);
1555
+ } else {
1556
+ const repeated = new __velarListNativeArray(2);
1557
+ formListSet(repeated, 0, current);
1558
+ formListSet(repeated, 1, value);
1559
+ formCall(formMapSet, output, [checkedName, repeated], "Map.set");
1560
+ }
1561
+ }
1562
+ }], "FormData.forEach");
1563
+ return output;
1564
+ }
1565
+
1566
+ export function read(form, type, fields) {
1567
+ requireForm(form);
1568
+ type = formType(type);
1569
+ const decoderItems = __velarRequireList(fields, "Form decoder fields");
1570
+ if (decoderItems.length > maxFormFields) throw new RangeError("Form decoders cannot exceed 100000 fields");
1571
+ fields = decoderItems;
1572
+ for (let index = 0; index < fields.length; index += 1) fields[index] = decoderField(fields[index]);
1573
+ const data = formData(form);
1574
+ const output = __velarOptionsReflectApply(__velarOptionsCreate, __velarOptionsNativeObject, [null]);
1575
+ for (let fieldIndex = 0; fieldIndex < fields.length; fieldIndex += 1) {
1576
+ const field = fields[fieldIndex];
1577
+ const name = field.name;
1578
+ const value = formValue(formCall(formDataGet, data, [name], "FormData.get"), "Form field '" + name + "'");
1579
+ if (field.kind === "string") {
1580
+ if (value == null) output[name] = field.optional ? null : "";
1581
+ else if (typeof value === "string") output[name] = value;
1582
+ else throw new TypeError("Form field '" + name + "' is not textual");
1583
+ } else if (field.kind === "number") {
1584
+ if (value == null || (typeof value === "string" && formCall(formStringTrim, value, [], "String.trim") === "")) {
1585
+ if (field.optional) output[name] = null;
1586
+ else throw new TypeError("Form field '" + name + "' requires a finite number");
1587
+ } else {
1588
+ const number = formNumber(value);
1589
+ if (number === null) throw new TypeError("Form field '" + name + "' requires a finite decimal number");
1590
+ output[name] = number;
1591
+ }
1592
+ } else if (field.kind === "bool") {
1593
+ output[name] = formCall(formDataHas, data, [name], "FormData.has");
1594
+ } else if (field.kind === "enum") {
1595
+ if (value == null || value === "") {
1596
+ if (field.optional) output[name] = null;
1597
+ else throw new TypeError("Form field '" + name + "' requires a known enum value");
1598
+ } else if (typeof value === "string") {
1599
+ let known = false;
1600
+ for (let index = 0; index < field.enumValues.length; index += 1) {
1601
+ if (field.enumValues[index] === value) { known = true; break; }
1602
+ }
1603
+ if (!known) throw new TypeError("Form field '" + name + "' requires a known enum value");
1604
+ output[name] = value;
1605
+ } else {
1606
+ throw new TypeError("Form field '" + name + "' requires a known enum value");
1607
+ }
1608
+ } else if (field.kind === "strings") {
1609
+ const items = formList(formCall(formDataGetAll, data, [name], "FormData.getAll"), "Form field '" + name + "'");
1610
+ for (let index = 0; index < items.length; index += 1) {
1611
+ const item = items[index];
1612
+ formValue(item, "Form field '" + name + "'");
1613
+ if (typeof item !== "string") throw new TypeError("Form field '" + name + "' is not textual");
1614
+ }
1615
+ output[name] = items;
1616
+ } else {
1617
+ throw new TypeError("Form field '" + name + "' uses an unsupported decoder");
1618
+ }
1619
+ }
1620
+ return type.parse(output);
1621
+ }
1622
+
1623
+ export function fieldValue(form, name) {
1624
+ return firstValue(form, name);
1625
+ }
1626
+
1627
+ export function textValue(form, name, fallback = "") {
1628
+ name = formText(name, "Form field name");
1629
+ fallback = formText(fallback, "Form text fallback", maxFormTextCodeUnits);
1630
+ const value = firstValue(form, name);
1631
+ if (value == null) return fallback;
1632
+ if (typeof value !== "string") throw new TypeError("Form field '" + name + "' is not textual");
1633
+ return value;
1634
+ }
1635
+
1636
+ export function numberValue(form, name) {
1637
+ return formNumber(textValue(form, name));
1638
+ }
1639
+
1640
+ export function checkedValue(form, name) {
1641
+ requireForm(form);
1642
+ name = formText(name, "Form field name");
1643
+ const data = formData(form);
1644
+ return formCall(formDataHas, data, [name], "FormData.has");
1645
+ }
1646
+
1647
+ export function fieldValues(form, name) {
1648
+ requireForm(form);
1649
+ name = formText(name, "Form field name");
1650
+ const data = formData(form);
1651
+ const values = formList(formCall(formDataGetAll, data, [name], "FormData.getAll"), "Form field '" + name + "'");
1652
+ for (let index = 0; index < values.length; index += 1) {
1653
+ const value = values[index];
1654
+ formValue(value, "Form field '" + name + "'");
1655
+ if (typeof value !== "string") throw new TypeError("Form field '" + name + "' is not textual");
1656
+ }
1657
+ return values;
1658
+ }
1659
+
1660
+ export function setError(form, name, message) {
1661
+ requireForm(form);
1662
+ name = formText(name, "Form field name");
1663
+ message = formText(message, "Form error message", 65536);
1664
+ const field = namedField(form, name);
1665
+ if (!field) throw new Error("Form field '" + name + "' was not found");
1666
+ const errorNodes = formErrorNodes(form);
1667
+ let error = null;
1668
+ for (let index = 0; index < errorNodes.length; index += 1) {
1669
+ if (formGetAttribute(errorNodes[index], "data-velar-field-error") === name) { error = errorNodes[index]; break; }
1670
+ }
1671
+ if (!error) {
1672
+ error = formHostMethod(formDocumentCreateElement, NativeFormDocumentConstructor, NativeFormDocument, ["p"], "createElement");
1673
+ formHostWrite(formElementId, formElementOwner, error, "id", "velar-field-error-" + nextErrorId++);
1674
+ formSetAttribute(error, "data-velar-field-error", name);
1675
+ formSetAttribute(error, "role", "alert");
1676
+ formHostMethod(formElementInsertAdjacentElement, formElementOwner, field, ["afterend", error], "insertAdjacentElement");
1677
+ }
1678
+ formHostWrite(formNodeTextContent, NativeFormNode, error, "textContent", message);
1679
+ formSetAttribute(field, "aria-invalid", "true");
1680
+ const described = formAttributeTokens(formGetAttribute(field, "aria-describedby") ?? "");
1681
+ const errorId = formText(formHostRead(formElementId, formElementOwner, error, "id"), "Form error id");
1682
+ let hasErrorId = false;
1683
+ for (let index = 0; index < described.length; index += 1) if (described[index] === errorId) { hasErrorId = true; break; }
1684
+ if (!hasErrorId) formListSet(described, described.length, errorId);
1685
+ formSetAttribute(field, "aria-describedby", formJoinTokens(described));
1686
+ return null;
1687
+ }
1688
+
1689
+ export function clearError(form, name) {
1690
+ requireForm(form);
1691
+ name = formText(name, "Form field name");
1692
+ const field = namedField(form, name);
1693
+ const errorNodes = formErrorNodes(form);
1694
+ const removedIds = typeof NativeFormMap === "function" ? new NativeFormMap() : null;
1695
+ if (!removedIds) throw new TypeError("The browser Map API is unavailable");
1696
+ for (let index = 0; index < errorNodes.length; index += 1) {
1697
+ const error = errorNodes[index];
1698
+ if (formGetAttribute(error, "data-velar-field-error") !== name) continue;
1699
+ const errorId = formHostRead(formElementId, formElementOwner, error, "id");
1700
+ if (typeof errorId === "string" && errorId) formCall(formMapSet, removedIds, [errorId, true], "Map.set");
1701
+ formHostMethod(formElementRemove, formElementOwner, error, [], "remove");
1702
+ }
1703
+ if (field) {
1704
+ formRemoveAttribute(field, "aria-invalid");
1705
+ const described = formAttributeTokens(formGetAttribute(field, "aria-describedby") ?? "");
1706
+ const retained = new __velarListNativeArray();
1707
+ for (let index = 0; index < described.length; index += 1) {
1708
+ const id = described[index];
1709
+ if (!formCall(formMapHas, removedIds, [id], "Map.has")) formListSet(retained, retained.length, id);
1710
+ }
1711
+ if (retained.length) formSetAttribute(field, "aria-describedby", formJoinTokens(retained));
1712
+ else formRemoveAttribute(field, "aria-describedby");
1713
+ }
1714
+ return null;
1715
+ }
1716
+
1717
+ export function clearErrors(form) {
1718
+ requireForm(form);
1719
+ const nodes = formErrorNodes(form);
1720
+ const seen = typeof NativeFormMap === "function" ? new NativeFormMap() : null;
1721
+ if (!seen) throw new TypeError("The browser Map API is unavailable");
1722
+ const names = new __velarListNativeArray();
1723
+ for (let index = 0; index < nodes.length; index += 1) {
1724
+ const name = formText(formGetAttribute(nodes[index], "data-velar-field-error") ?? "", "Form error field name");
1725
+ if (!name || formCall(formMapHas, seen, [name], "Map.has")) continue;
1726
+ formCall(formMapSet, seen, [name, true], "Map.set");
1727
+ formListSet(names, names.length, name);
1728
+ }
1729
+ for (let index = 0; index < names.length; index += 1) clearError(form, names[index]);
1730
+ return null;
1731
+ }
1732
+
1733
+ export function errors(form) {
1734
+ requireForm(form);
1735
+ const nodes = formErrorNodes(form);
1736
+ const output = typeof NativeFormMap === "function" ? new NativeFormMap() : null;
1737
+ if (!output) throw new TypeError("The browser Map API is unavailable");
1738
+ for (let index = 0; index < nodes.length; index += 1) {
1739
+ const item = nodes[index];
1740
+ const name = formText(formGetAttribute(item, "data-velar-field-error") ?? "", "Form error field name");
1741
+ const message = formText(formHostRead(formNodeTextContent, NativeFormNode, item, "textContent") ?? "", "Form error message", 65536);
1742
+ if (name) formCall(formMapSet, output, [name, message], "Map.set");
1743
+ }
1744
+ return output;
1745
+ }
1746
+
1747
+ export function focusFirstError(form) {
1748
+ requireForm(form);
1749
+ const error = formHostMethod(formElementQuerySelector, formElementOwner, form, ["[data-velar-field-error]"], "querySelector");
1750
+ const field = error ? namedField(form, formText(formGetAttribute(error, "data-velar-field-error") ?? "", "Form error field name")) : null;
1751
+ if (!field) return false;
1752
+ formHostMethod(formHtmlFocus, formHtmlOwner, field, [], "focus");
1753
+ return true;
1754
+ }
1755
+
1756
+ export function setPending(form, pending) {
1757
+ requireForm(form);
1758
+ if (typeof pending !== "boolean") throw new TypeError("setPending requires a boolean");
1759
+ if (!pendingFields) throw new TypeError("The browser WeakMap API is unavailable");
1760
+ if (pending) {
1761
+ const elements = formElements(form);
1762
+ const snapshot = new __velarListNativeArray();
1763
+ for (let index = 0; index < elements.length; index += 1) {
1764
+ const field = elements[index];
1765
+ if (!field || typeof field !== "object") throw new TypeError("Form controls must expose a bool disabled state");
1766
+ const disabled = formControlRead(field, "disabled");
1767
+ if (typeof disabled !== "boolean") throw new TypeError("Form controls must expose a bool disabled state");
1768
+ const pair = new __velarListNativeArray(2);
1769
+ formListSet(pair, 0, field);
1770
+ formListSet(pair, 1, disabled);
1771
+ formListSet(snapshot, snapshot.length, pair);
1772
+ }
1773
+ if (!formCall(formWeakMapHas, pendingFields, [form], "WeakMap.has")) formCall(formWeakMapSet, pendingFields, [form, snapshot], "WeakMap.set");
1774
+ formSetAttribute(form, "aria-busy", "true");
1775
+ for (let index = 0; index < snapshot.length; index += 1) formControlWrite(snapshot[index][0], "disabled", true);
1776
+ } else {
1777
+ formRemoveAttribute(form, "aria-busy");
1778
+ const snapshot = formCall(formWeakMapGet, pendingFields, [form], "WeakMap.get") ?? new __velarListNativeArray();
1779
+ for (let index = 0; index < snapshot.length; index += 1) formControlWrite(snapshot[index][0], "disabled", snapshot[index][1]);
1780
+ formCall(formWeakMapDelete, pendingFields, [form], "WeakMap.delete");
1781
+ }
1782
+ return null;
1783
+ }
1784
+
1785
+ export function reset(form) {
1786
+ requireForm(form);
1787
+ if (!pendingFields) throw new TypeError("The browser WeakMap API is unavailable");
1788
+ if (formCall(formWeakMapHas, pendingFields, [form], "WeakMap.has")) setPending(form, false);
1789
+ clearErrors(form);
1790
+ formHostMethod(formNativeReset, NativeFormElement, form, [], "reset");
1791
+ return null;
1792
+ }
1793
+
1794
+ function namedField(form, name) {
1795
+ const elements = formElements(form);
1796
+ for (let index = 0; index < elements.length; index += 1) if (formControlRead(elements[index], "name") === name) return elements[index];
1797
+ return null;
1798
+ }
1799
+
1800
+ function firstValue(form, name) {
1801
+ requireForm(form);
1802
+ name = formText(name, "Form field name");
1803
+ const data = formData(form);
1804
+ return formValue(formCall(formDataGet, data, [name], "FormData.get"), "Form field '" + name + "'");
1805
+ }
1806
+
1807
+ function requireForm(value) {
1808
+ let accepted = false;
1809
+ if (typeof NativeFormElement === "function" && typeof formHasInstance === "function" && typeof formReflectApply === "function") {
1810
+ try { accepted = formReflectApply(formHasInstance, NativeFormElement, [value]); } catch {}
1811
+ }
1812
+ if (!accepted) throw new TypeError("VelarScript form helpers require a form element");
1813
+ }
1814
+ `.trimStart()],
1815
+ ["velar/http", String.raw `
1816
+ ${listRuntime}
1817
+ ${optionsRuntime}
1818
+ ${VELAR_STRICT_JSON_RUNTIME}
1819
+ ${VELAR_UTF8_RUNTIME}
1820
+ ${runtimeTypeRuntime}
1821
+ ${fileRegistryRuntime}
1822
+ const formBodies = new WeakMap();
1823
+ const nativeFetch = typeof globalThis.fetch === "function" ? globalThis.fetch : null;
1824
+ const NativeHeaders = typeof globalThis.Headers === "function" ? globalThis.Headers : null;
1825
+ const NativeResponse = typeof globalThis.Response === "function" ? globalThis.Response : null;
1826
+ const NativeAbortController = typeof globalThis.AbortController === "function" ? globalThis.AbortController : null;
1827
+ const NativeFormData = typeof globalThis.FormData === "function" ? globalThis.FormData : null;
1828
+ const NativeBlob = typeof globalThis.Blob === "function" ? globalThis.Blob : null;
1829
+ const NativeTextDecoder = typeof globalThis.TextDecoder === "function" ? globalThis.TextDecoder : null;
1830
+ const NativeUint8Array = typeof globalThis.Uint8Array === "function" ? globalThis.Uint8Array : null;
1831
+ const NativeMap = typeof globalThis.Map === "function" ? globalThis.Map : null;
1832
+ const nativeReflectApply = Object.getOwnPropertyDescriptor(Reflect, "apply")?.value;
1833
+ const nativeMapSize = Object.getOwnPropertyDescriptor(Map.prototype, "size")?.get;
1834
+ const nativeMapGet = Object.getOwnPropertyDescriptor(Map.prototype, "get")?.value;
1835
+ const nativeMapHas = Object.getOwnPropertyDescriptor(Map.prototype, "has")?.value;
1836
+ const nativeMapSet = Object.getOwnPropertyDescriptor(Map.prototype, "set")?.value;
1837
+ const nativeMapForEach = Object.getOwnPropertyDescriptor(Map.prototype, "forEach")?.value;
1838
+ const nativeWeakMapGet = Object.getOwnPropertyDescriptor(WeakMap.prototype, "get")?.value;
1839
+ const nativeWeakMapSet = Object.getOwnPropertyDescriptor(WeakMap.prototype, "set")?.value;
1840
+ const nativeHeadersSet = typeof NativeHeaders === "function" ? Object.getOwnPropertyDescriptor(NativeHeaders.prototype, "set")?.value : null;
1841
+ const nativeHeadersHas = typeof NativeHeaders === "function" ? Object.getOwnPropertyDescriptor(NativeHeaders.prototype, "has")?.value : null;
1842
+ const nativeHeadersForEach = typeof NativeHeaders === "function" ? Object.getOwnPropertyDescriptor(NativeHeaders.prototype, "forEach")?.value : null;
1843
+ const nativeResponseOk = typeof NativeResponse === "function" ? Object.getOwnPropertyDescriptor(NativeResponse.prototype, "ok")?.get : null;
1844
+ const nativeResponseStatus = typeof NativeResponse === "function" ? Object.getOwnPropertyDescriptor(NativeResponse.prototype, "status")?.get : null;
1845
+ const nativeResponseStatusText = typeof NativeResponse === "function" ? Object.getOwnPropertyDescriptor(NativeResponse.prototype, "statusText")?.get : null;
1846
+ const nativeResponseUrl = typeof NativeResponse === "function" ? Object.getOwnPropertyDescriptor(NativeResponse.prototype, "url")?.get : null;
1847
+ const nativeResponseHeaders = typeof NativeResponse === "function" ? Object.getOwnPropertyDescriptor(NativeResponse.prototype, "headers")?.get : null;
1848
+ const nativeResponseBody = typeof NativeResponse === "function" ? Object.getOwnPropertyDescriptor(NativeResponse.prototype, "body")?.get : null;
1849
+ const nativeAbort = typeof NativeAbortController === "function" ? Object.getOwnPropertyDescriptor(NativeAbortController.prototype, "abort")?.value : null;
1850
+ const nativeAbortSignal = typeof NativeAbortController === "function" ? Object.getOwnPropertyDescriptor(NativeAbortController.prototype, "signal")?.get : null;
1851
+ const nativeFormAppend = typeof NativeFormData === "function" ? Object.getOwnPropertyDescriptor(NativeFormData.prototype, "append")?.value : null;
1852
+ const nativeFormDelete = typeof NativeFormData === "function" ? Object.getOwnPropertyDescriptor(NativeFormData.prototype, "delete")?.value : null;
1853
+ const nativeFormHas = typeof NativeFormData === "function" ? Object.getOwnPropertyDescriptor(NativeFormData.prototype, "has")?.value : null;
1854
+ const nativeFormGetAll = typeof NativeFormData === "function" ? Object.getOwnPropertyDescriptor(NativeFormData.prototype, "getAll")?.value : null;
1855
+ const nativeFormForEach = typeof NativeFormData === "function" ? Object.getOwnPropertyDescriptor(NativeFormData.prototype, "forEach")?.value : null;
1856
+ const nativeTextDecode = typeof NativeTextDecoder === "function" ? Object.getOwnPropertyDescriptor(NativeTextDecoder.prototype, "decode")?.value : null;
1857
+ const nativeSetTimeout = typeof globalThis.setTimeout === "function" ? globalThis.setTimeout : null;
1858
+ const nativeClearTimeout = typeof globalThis.clearTimeout === "function" ? globalThis.clearTimeout : null;
1859
+ const nativeStreamGetReader = typeof ReadableStream === "function" ? Object.getOwnPropertyDescriptor(ReadableStream.prototype, "getReader")?.value : null;
1860
+ const nativeStreamCancel = typeof ReadableStream === "function" ? Object.getOwnPropertyDescriptor(ReadableStream.prototype, "cancel")?.value : null;
1861
+ const nativeReaderRead = typeof ReadableStreamDefaultReader === "function" ? Object.getOwnPropertyDescriptor(ReadableStreamDefaultReader.prototype, "read")?.value : null;
1862
+ const nativeReaderCancel = typeof ReadableStreamDefaultReader === "function" ? Object.getOwnPropertyDescriptor(ReadableStreamDefaultReader.prototype, "cancel")?.value : null;
1863
+ const nativeTypedArrayPrototype = typeof NativeUint8Array === "function" ? Object.getPrototypeOf(NativeUint8Array.prototype) : null;
1864
+ const nativeTypedArrayTag = nativeTypedArrayPrototype ? Object.getOwnPropertyDescriptor(nativeTypedArrayPrototype, Symbol.toStringTag)?.get : null;
1865
+ const nativeTypedArrayByteLength = nativeTypedArrayPrototype ? Object.getOwnPropertyDescriptor(nativeTypedArrayPrototype, "byteLength")?.get : null;
1866
+ const nativeUint8ArraySet = Object.getOwnPropertyDescriptor(nativeTypedArrayPrototype, "set")?.value;
1867
+
1868
+ function httpBytesKind(value) {
1869
+ if (typeof nativeReflectApply !== "function" || typeof nativeTypedArrayTag !== "function") return null;
1870
+ try { return nativeReflectApply(nativeTypedArrayTag, value, []); } catch { return null; }
1871
+ }
1872
+ const __velarHttpBytes = Object.freeze({
1873
+ is(value) { return httpBytesKind(value) === "Uint8Array"; },
1874
+ parse(value) {
1875
+ if (httpBytesKind(value) !== "Uint8Array" || typeof NativeUint8Array !== "function"
1876
+ || typeof nativeTypedArrayByteLength !== "function" || typeof nativeUint8ArraySet !== "function") {
1877
+ throw new TypeError("Bytes requires Uint8Array");
1878
+ }
1879
+ const output = new NativeUint8Array(nativeReflectApply(nativeTypedArrayByteLength, value, []));
1880
+ nativeReflectApply(nativeUint8ArraySet, output, [value]);
1881
+ return output;
1882
+ },
1883
+ });
1884
+
1885
+ function runtimeHttpType(Type) { return __velarRequireRuntimeType(Type, "HTTP parsing"); }
1886
+
1887
+ function requireHttpHost() {
1888
+ if (typeof nativeFetch !== "function" || typeof NativeHeaders !== "function" || typeof NativeResponse !== "function"
1889
+ || typeof NativeAbortController !== "function" || typeof NativeFormData !== "function" || typeof NativeBlob !== "function"
1890
+ || typeof NativeTextDecoder !== "function" || typeof NativeUint8Array !== "function" || typeof NativeMap !== "function"
1891
+ || typeof nativeReflectApply !== "function" || typeof nativeMapSize !== "function" || typeof nativeMapGet !== "function"
1892
+ || typeof nativeMapHas !== "function" || typeof nativeMapSet !== "function" || typeof nativeMapForEach !== "function"
1893
+ || typeof nativeWeakMapGet !== "function" || typeof nativeWeakMapSet !== "function" || typeof nativeHeadersSet !== "function"
1894
+ || typeof nativeHeadersHas !== "function" || typeof nativeHeadersForEach !== "function" || typeof nativeResponseOk !== "function"
1895
+ || typeof nativeResponseStatus !== "function" || typeof nativeResponseStatusText !== "function" || typeof nativeResponseUrl !== "function"
1896
+ || typeof nativeResponseHeaders !== "function" || typeof nativeResponseBody !== "function" || typeof nativeAbort !== "function"
1897
+ || typeof nativeAbortSignal !== "function"
1898
+ || typeof nativeFormAppend !== "function" || typeof nativeFormDelete !== "function" || typeof nativeFormHas !== "function"
1899
+ || typeof nativeFormGetAll !== "function" || typeof nativeFormForEach !== "function" || typeof nativeTextDecode !== "function"
1900
+ || typeof nativeSetTimeout !== "function" || typeof nativeClearTimeout !== "function") {
1901
+ throw new TypeError("The Web HTTP host ABI is unavailable");
1902
+ }
1903
+ }
1904
+
1905
+ function headerMap(value) {
1906
+ requireHttpHost();
1907
+ const output = new NativeHeaders();
1908
+ nativeReflectApply(nativeMapForEach, value, [(item, name) => nativeReflectApply(nativeHeadersSet, output, [name, item])]);
1909
+ return output;
1910
+ }
1911
+
1912
+ function methodOf(value) {
1913
+ const method = __velarString(value, "HTTP method").toUpperCase();
1914
+ if (method.length > 32) throw new RangeError("HTTP methods cannot exceed 32 characters");
1915
+ if (!/^[!#$%&'*+.^_\x60|~0-9A-Z-]+$/u.test(method) || ["CONNECT", "TRACE", "TRACK"].includes(method)) throw new TypeError("HTTP method is invalid or forbidden by Fetch");
1916
+ return method;
1917
+ }
1918
+
1919
+ function headersOf(value) {
1920
+ if (value == null) { requireHttpHost(); return new NativeMap(); }
1921
+ try { requireHttpHost(); nativeReflectApply(nativeMapSize, value, []); }
1922
+ catch { throw new TypeError("HTTP headers must be Map<string, string>"); }
1923
+ const headers = new NativeMap();
1924
+ let units = 0;
1925
+ nativeReflectApply(nativeMapForEach, value, [(item, name) => {
1926
+ if (typeof name !== "string" || typeof item !== "string" || !/^[!#$%&'*+.^_|~0-9A-Za-z-]+$/u.test(name) || /[\r\n]/u.test(item)) {
1927
+ throw new TypeError("HTTP headers must use valid string names and single-line values");
1928
+ }
1929
+ units += name.length + item.length;
1930
+ if ((!nativeReflectApply(nativeMapHas, headers, [name]) && nativeReflectApply(nativeMapSize, headers, []) >= 100) || units > 65536) throw new RangeError("HTTP headers cannot exceed 100 fields or 64 KiB");
1931
+ nativeReflectApply(nativeMapSet, headers, [name, item]);
1932
+ }]);
1933
+ return headers;
1934
+ }
1935
+
1936
+ function responseHeadersOf(value) {
1937
+ requireHttpHost();
1938
+ const headers = new NativeMap();
1939
+ let units = 0;
1940
+ try {
1941
+ nativeReflectApply(nativeHeadersForEach, value, [(item, name) => {
1942
+ if (typeof name !== "string" || typeof item !== "string") throw new TypeError("HTTP response header names and values must be strings");
1943
+ units += name.length + item.length;
1944
+ if ((!nativeReflectApply(nativeMapHas, headers, [name]) && nativeReflectApply(nativeMapSize, headers, []) >= 100) || units > 65536) throw new RangeError("HTTP response headers cannot exceed 100 fields or 64 KiB");
1945
+ nativeReflectApply(nativeMapSet, headers, [name, item]);
1946
+ }]);
1947
+ } catch (error) {
1948
+ if (error instanceof RangeError) throw error;
1949
+ throw new TypeError("HTTP responses require native Headers");
1950
+ }
1951
+ return headers;
1952
+ }
1953
+
1954
+ async function responseSnapshot(response) {
1955
+ let body = null;
1956
+ try {
1957
+ requireHttpHost();
1958
+ const ok = nativeReflectApply(nativeResponseOk, response, []);
1959
+ const status = nativeReflectApply(nativeResponseStatus, response, []);
1960
+ const statusText = __velarString(nativeReflectApply(nativeResponseStatusText, response, []), "HTTP response status text");
1961
+ const url = __velarString(nativeReflectApply(nativeResponseUrl, response, []), "HTTP response URL");
1962
+ const nativeHeaders = nativeReflectApply(nativeResponseHeaders, response, []);
1963
+ body = nativeReflectApply(nativeResponseBody, response, []);
1964
+ if (typeof ok !== "boolean" || !Number.isInteger(status) || status < 100 || status > 599
1965
+ || ok !== (status >= 200 && status <= 299)) {
1966
+ throw new TypeError("Fetch returned invalid HTTP response metadata");
1967
+ }
1968
+ if (statusText.length > 65536) throw new RangeError("HTTP response status text cannot exceed 64 KiB");
1969
+ if (url.length > 2 * 1024 * 1024) throw new RangeError("HTTP response URLs cannot exceed 2 MiB");
1970
+ return {ok, status, statusText, url, headers: responseHeadersOf(nativeHeaders), body};
1971
+ } catch (error) {
1972
+ if (body !== null && typeof nativeStreamCancel === "function") {
1973
+ try { await nativeReflectApply(nativeStreamCancel, body, [error]); } catch {}
1974
+ }
1975
+ throw error;
1976
+ }
1977
+ }
1978
+
1979
+ function optionsOf(value) {
1980
+ value = __velarOptions(value, "HTTP options", __velarOptionFields(["headers", "body", "timeout", "maxBytes", "credentials", "cache"]));
1981
+ const timeout = value.timeout ?? 120000;
1982
+ if (!Number.isSafeInteger(timeout) || timeout < 0 || timeout > 600000) throw new RangeError("HTTP timeout must be an integer from 0 through 600000 milliseconds");
1983
+ const maxBytes = value.maxBytes ?? 16 * 1024 * 1024;
1984
+ if (!Number.isSafeInteger(maxBytes) || maxBytes < 1 || maxBytes > 64 * 1024 * 1024) throw new RangeError("HTTP maxBytes must be an integer from 1 through 67108864");
1985
+ const credentials = value.credentials == null ? undefined : __velarString(value.credentials, "HTTP credentials");
1986
+ if (credentials !== undefined && !["omit", "same-origin", "include"].includes(credentials)) throw new TypeError("HTTP credentials must be omit, same-origin, or include");
1987
+ const cache = value.cache == null ? undefined : __velarString(value.cache, "HTTP cache mode");
1988
+ if (cache !== undefined && !["default", "no-store", "reload", "no-cache", "force-cache"].includes(cache)) throw new TypeError("HTTP cache mode must be default, no-store, reload, no-cache, or force-cache");
1989
+ let headers = headersOf(value.headers);
1990
+ let body = value.body ?? null;
1991
+ const multipart = body && typeof body === "object" ? nativeReflectApply(nativeWeakMapGet, formBodies, [body]) : null;
1992
+ const nativeForm = typeof NativeFormData === "function" && body instanceof NativeFormData;
1993
+ const nativeBlob = typeof NativeBlob === "function" && body instanceof NativeBlob;
1994
+ const bytes = body != null && __velarHttpBytes.is(body);
1995
+ if (bytes) body = __velarHttpBytes.parse(body);
1996
+ else if (body != null && typeof body !== "string" && !multipart && !nativeForm && !nativeBlob) {
1997
+ if (typeof body !== "object") throw new TypeError("HTTP body must be text, JSON data, a Blob, or a VelarScript form body");
1998
+ body = __velarJsonStringify(body);
1999
+ let hasContentType = false;
2000
+ nativeReflectApply(nativeMapForEach, headers, [(_item, name) => { if (name.toLowerCase() === "content-type") hasContentType = true; }]);
2001
+ if (!hasContentType) nativeReflectApply(nativeMapSet, headers, ["content-type", "application/json"]);
2002
+ headers = headersOf(headers);
2003
+ }
2004
+ if (typeof body === "string" && __velarUtf8ByteLength(body) > 16 * 1024 * 1024) throw new RangeError("HTTP body cannot exceed 16 MiB");
2005
+ return __velarFreezeOptionsValue({ headers, body, timeout, maxBytes, credentials, cache });
2006
+ }
2007
+
2008
+ function fieldName(value) {
2009
+ const name = __velarString(value, "Form body field name");
2010
+ if (!name) throw new TypeError("Form body field names cannot be empty");
2011
+ if (name.length > 1024) throw new RangeError("Form body field names cannot exceed 1024 characters");
2012
+ return name;
2013
+ }
2014
+
2015
+ function nativeFile(value) {
2016
+ return __velarNativeFile(value, "Form body files must come from velar/files pick()");
2017
+ }
2018
+
2019
+ export function formBody() {
2020
+ requireHttpHost();
2021
+ const data = new NativeFormData();
2022
+ let fieldCount = 0;
2023
+ const reserve = (count = 1) => { if (fieldCount + count > 100000) throw new RangeError("Form bodies cannot exceed 100000 fields"); fieldCount += count; };
2024
+ const fieldValue = (value) => { value = __velarString(value, "Form body field value"); if (__velarUtf8ByteLength(value) > 16 * 1024 * 1024) throw new RangeError("Form body field values cannot exceed 16 MiB"); return value; };
2025
+ const body = {
2026
+ field(name, value) { name = fieldName(name); value = fieldValue(value); reserve(); nativeReflectApply(nativeFormAppend, data, [name, value]); return null; },
2027
+ file(name, value, fileName = "") {
2028
+ const file = nativeFile(value);
2029
+ fileName = __velarString(fileName, "Form body file name");
2030
+ if (fileName.length > 4096) throw new RangeError("Form body file names cannot exceed 4096 characters");
2031
+ name = fieldName(name);
2032
+ reserve();
2033
+ if (fileName) nativeReflectApply(nativeFormAppend, data, [name, file, fileName]);
2034
+ else nativeReflectApply(nativeFormAppend, data, [name, file]);
2035
+ return null;
2036
+ },
2037
+ files(name, values) {
2038
+ name = fieldName(name);
2039
+ const input = __velarRequireList(values, "Form body files");
2040
+ const files = new __velarListNativeArray(input.length);
2041
+ for (let index = 0; index < input.length; index += 1) {
2042
+ __velarListReflectApply(__velarListDefineProperty, __velarListNativeObject, [files, index, {
2043
+ value: nativeFile(input[index]), enumerable: true, configurable: true, writable: true,
2044
+ }]);
2045
+ }
2046
+ reserve(files.length);
2047
+ for (let index = 0; index < files.length; index += 1) nativeReflectApply(nativeFormAppend, data, [name, files[index]]);
2048
+ return null;
2049
+ },
2050
+ remove(name) { name = fieldName(name); fieldCount -= nativeReflectApply(nativeFormGetAll, data, [name]).length; nativeReflectApply(nativeFormDelete, data, [name]); return null; },
2051
+ has(name) { return nativeReflectApply(nativeFormHas, data, [fieldName(name)]); },
2052
+ names() {
2053
+ const names = new __velarListNativeArray();
2054
+ const seen = new NativeMap();
2055
+ nativeReflectApply(nativeFormForEach, data, [(_value, name) => {
2056
+ if (nativeReflectApply(nativeMapHas, seen, [name])) return;
2057
+ const index = nativeReflectApply(nativeMapSize, seen, []);
2058
+ nativeReflectApply(nativeMapSet, seen, [name, true]);
2059
+ __velarListReflectApply(__velarListDefineProperty, __velarListNativeObject, [names, index, {
2060
+ value: name, enumerable: true, configurable: true, writable: true,
2061
+ }]);
2062
+ }]);
2063
+ return names;
2064
+ },
2065
+ };
2066
+ nativeReflectApply(nativeWeakMapSet, formBodies, [body, data]);
2067
+ return __velarFreezeOptionsValue(body);
2068
+ }
2069
+
2070
+ export class HttpError extends Error {
2071
+ constructor(message, status, url, body = null) {
2072
+ message = __velarString(message, "HTTP error message");
2073
+ url = __velarString(url, "HTTP error URL");
2074
+ if (message.length > 65536) throw new RangeError("HTTP error messages cannot exceed 64 KiB");
2075
+ if (url.length > 2 * 1024 * 1024) throw new RangeError("HTTP error URLs cannot exceed 2 MiB");
2076
+ if (!Number.isInteger(status) || status < 100 || status > 599) throw new RangeError("HTTP error status must be an integer from 100 through 599");
2077
+ super(message);
2078
+ this.name = "HttpError";
2079
+ this.status = status;
2080
+ this.url = url;
2081
+ this.body = body;
2082
+ }
2083
+ }
2084
+
2085
+ export class HttpAbortError extends Error {
2086
+ constructor(reason) {
2087
+ if (reason !== "cancelled" && reason !== "timeout") throw new TypeError("HTTP abort reason must be cancelled or timeout");
2088
+ super(reason === "timeout" ? "HTTP request timed out" : "HTTP request cancelled");
2089
+ this.name = "HttpAbortError";
2090
+ this.reason = reason;
2091
+ }
2092
+ }
2093
+
2094
+ // D60 rule 149: a module-provided enum carries the same runtime face a declared
2095
+ // enum does -- charter section 6 reserves is, parse, and values on every enum,
2096
+ // and member access alone kept the gap invisible until a call threw.
2097
+ export const HttpTransportPhase = __velarRegisterRuntimeType(__velarFreezeOptionsValue({
2098
+ request: "request",
2099
+ response: "response",
2100
+ is(value) { return value === "request" || value === "response"; },
2101
+ parse(value) {
2102
+ if (!HttpTransportPhase.is(value)) throw new TypeError("Value does not match HttpTransportPhase");
2103
+ return value;
2104
+ },
2105
+ values() { return ["request", "response"]; },
2106
+ }));
2107
+ export class HttpTransportError extends Error {
2108
+ constructor(message, phase) {
2109
+ message = __velarString(message, "HTTP transport error message");
2110
+ if (message.length === 0 || message.length > 65536) throw new RangeError("HTTP transport error messages must contain at most 64 KiB");
2111
+ if (phase !== HttpTransportPhase.request && phase !== HttpTransportPhase.response) {
2112
+ throw new TypeError("HTTP transport phase must be request or response");
2113
+ }
2114
+ super(message);
2115
+ this.name = "HttpTransportError";
2116
+ this.phase = phase;
2117
+ }
2118
+ }
2119
+
2120
+ async function readHttpTransportChunk(reader) {
2121
+ try { return await nativeReflectApply(nativeReaderRead, reader, []); }
2122
+ catch { throw new HttpTransportError("HTTP response transport failed", HttpTransportPhase.response); }
2123
+ }
2124
+
2125
+ class HttpResponse {
2126
+ constructor(response, request) {
2127
+ this.request = request;
2128
+ this.maxBytes = request.options.maxBytes;
2129
+ this.bytesValue = null;
2130
+ this.bytesPending = null;
2131
+ this.streaming = false;
2132
+ this.ok = response.ok;
2133
+ this.status = response.status;
2134
+ this.statusText = response.statusText;
2135
+ this.url = response.url;
2136
+ this.headers = response.headers;
2137
+ this.body = response.body;
2138
+ this.declaredLength = nativeReflectApply(nativeMapGet, response.headers, ["content-length"]) ?? null;
2139
+ this.contentType = nativeReflectApply(nativeMapGet, response.headers, ["content-type"]) ?? "";
2140
+ if (response.body === null) request.finish();
2141
+ }
2142
+ async bytes() {
2143
+ if (this.bytesValue) return this.bytesValue;
2144
+ if (this.bytesPending) return this.bytesPending;
2145
+ const declared = __velarDeclaredLength(this.declaredLength);
2146
+ if (this.body !== null && declared !== null && declared > this.maxBytes) {
2147
+ if (this.body !== null && typeof nativeStreamCancel === "function") {
2148
+ try { await nativeReflectApply(nativeStreamCancel, this.body, ["VelarScript HTTP response exceeded maxBytes"]); } catch {}
2149
+ }
2150
+ this.request.finish();
2151
+ throw new RangeError("HTTP response exceeds maxBytes");
2152
+ }
2153
+ this.bytesPending = (async () => {
2154
+ if (this.body === null) return new NativeUint8Array();
2155
+ let reader = null;
2156
+ try {
2157
+ if (typeof nativeStreamGetReader !== "function" || typeof nativeReaderRead !== "function" || typeof nativeReaderCancel !== "function"
2158
+ || typeof nativeTypedArrayTag !== "function" || typeof nativeTypedArrayByteLength !== "function" || typeof nativeUint8ArraySet !== "function") {
2159
+ throw new TypeError("The browser does not expose the required native response stream API");
2160
+ }
2161
+ try { reader = nativeReflectApply(nativeStreamGetReader, this.body, []); }
2162
+ catch { throw new TypeError("Fetch returned an invalid HTTP response body"); }
2163
+ const chunks = new __velarListNativeArray();
2164
+ let total = 0;
2165
+ while (true) {
2166
+ const next = await readHttpTransportChunk(reader);
2167
+ if (next.done) break;
2168
+ let kind;
2169
+ let length;
2170
+ try {
2171
+ kind = nativeReflectApply(nativeTypedArrayTag, next.value, []);
2172
+ length = nativeReflectApply(nativeTypedArrayByteLength, next.value, []);
2173
+ } catch { throw new TypeError("Fetch returned a non-byte response chunk"); }
2174
+ if (kind !== "Uint8Array") throw new TypeError("Fetch returned a non-byte response chunk");
2175
+ total += length;
2176
+ if (total > this.maxBytes) throw new RangeError("HTTP response exceeds maxBytes");
2177
+ if (chunks.length >= 1000000) throw new RangeError("HTTP responses cannot exceed 1000000 chunks");
2178
+ const chunk = new NativeUint8Array(length);
2179
+ nativeReflectApply(nativeUint8ArraySet, chunk, [next.value]);
2180
+ __velarListReflectApply(__velarListDefineProperty, __velarListNativeObject, [chunks, chunks.length, {
2181
+ value: chunk, enumerable: true, configurable: true, writable: true,
2182
+ }]);
2183
+ }
2184
+ const output = new NativeUint8Array(total);
2185
+ let offset = 0;
2186
+ for (let index = 0; index < chunks.length; index += 1) {
2187
+ const chunk = chunks[index];
2188
+ nativeReflectApply(nativeUint8ArraySet, output, [chunk, offset]);
2189
+ offset += nativeReflectApply(nativeTypedArrayByteLength, chunk, []);
2190
+ }
2191
+ return __velarHttpBytes.parse(output);
2192
+ } catch (error) {
2193
+ if (reader !== null) {
2194
+ try { await nativeReflectApply(nativeReaderCancel, reader, [error]); } catch {}
2195
+ } else if (typeof nativeStreamCancel === "function") {
2196
+ try { await nativeReflectApply(nativeStreamCancel, this.body, [error]); } catch {}
2197
+ }
2198
+ throw error;
2199
+ }
2200
+ })();
2201
+ try { this.bytesValue = await this.bytesPending; return this.bytesValue; }
2202
+ catch (error) { if (this.request.abortError) throw this.request.abortError; throw error; }
2203
+ finally { this.bytesPending = null; this.request.finish(); }
2204
+ }
2205
+ async json() { return __velarJsonParse(await this.text(), "HTTP JSON text"); }
2206
+ async text() { const decoder = new NativeTextDecoder("utf-8", { fatal: true }); return nativeReflectApply(nativeTextDecode, decoder, [await this.bytes()]); }
2207
+ async streamText(consume) {
2208
+ if (typeof consume !== "function") throw new TypeError("HTTP streamText requires an async consumer");
2209
+ if (this.bytesValue) {
2210
+ const decoder = new NativeTextDecoder("utf-8", { fatal: true });
2211
+ const result = await consume(nativeReflectApply(nativeTextDecode, decoder, [this.bytesValue]));
2212
+ if (result !== null) throw new TypeError("HTTP stream consumer must resolve to null");
2213
+ return null;
2214
+ }
2215
+ if (this.bytesPending || this.streaming) throw new Error("HTTP response body is already being consumed");
2216
+ if (this.body === null) return null;
2217
+ const declared = __velarDeclaredLength(this.declaredLength);
2218
+ if (declared !== null && declared > this.maxBytes) {
2219
+ if (typeof nativeStreamCancel === "function") {
2220
+ try { await nativeReflectApply(nativeStreamCancel, this.body, ["VelarScript HTTP response exceeded maxBytes"]); } catch {}
2221
+ }
2222
+ this.request.finish();
2223
+ throw new RangeError("HTTP response exceeds maxBytes");
2224
+ }
2225
+ if (typeof nativeStreamGetReader !== "function" || typeof nativeReaderRead !== "function" || typeof nativeReaderCancel !== "function"
2226
+ || typeof nativeTypedArrayTag !== "function" || typeof nativeTypedArrayByteLength !== "function") {
2227
+ this.request.finish();
2228
+ throw new TypeError("The browser does not expose the required native response stream API");
2229
+ }
2230
+ this.streaming = true;
2231
+ let reader;
2232
+ try { reader = nativeReflectApply(nativeStreamGetReader, this.body, []); }
2233
+ catch { this.request.finish(); throw new TypeError("Fetch returned an invalid HTTP response body"); }
2234
+ const decoder = new NativeTextDecoder("utf-8", { fatal: true });
2235
+ let total = 0;
2236
+ let chunks = 0;
2237
+ try {
2238
+ while (true) {
2239
+ const next = await readHttpTransportChunk(reader);
2240
+ if (next.done) break;
2241
+ let kind;
2242
+ let length;
2243
+ try { kind = nativeReflectApply(nativeTypedArrayTag, next.value, []); length = nativeReflectApply(nativeTypedArrayByteLength, next.value, []); }
2244
+ catch { throw new TypeError("Fetch returned a non-byte response chunk"); }
2245
+ if (kind !== "Uint8Array") throw new TypeError("Fetch returned a non-byte response chunk");
2246
+ total += length;
2247
+ chunks += 1;
2248
+ if (total > this.maxBytes || chunks > 1000000) {
2249
+ try { await nativeReflectApply(nativeReaderCancel, reader, ["VelarScript HTTP response exceeded its bound"]); } catch {}
2250
+ throw new RangeError(total > this.maxBytes ? "HTTP response exceeds maxBytes" : "HTTP responses cannot exceed 1000000 chunks");
2251
+ }
2252
+ const text = nativeReflectApply(nativeTextDecode, decoder, [next.value, { stream: true }]);
2253
+ if (text) {
2254
+ const result = await consume(text);
2255
+ if (result !== null) throw new TypeError("HTTP stream consumer must resolve to null");
2256
+ }
2257
+ if (this.request.abortError) throw this.request.abortError;
2258
+ }
2259
+ const tail = nativeReflectApply(nativeTextDecode, decoder, []);
2260
+ if (tail) {
2261
+ const result = await consume(tail);
2262
+ if (result !== null) throw new TypeError("HTTP stream consumer must resolve to null");
2263
+ }
2264
+ if (this.request.abortError) throw this.request.abortError;
2265
+ return null;
2266
+ } catch (error) {
2267
+ if (this.request.abortError) throw this.request.abortError;
2268
+ try { await nativeReflectApply(nativeReaderCancel, reader, [error]); } catch {}
2269
+ throw error;
2270
+ } finally {
2271
+ this.request.finish();
2272
+ }
2273
+ }
2274
+ async blob() { return new NativeBlob([await this.bytes()], { type: this.contentType }); }
2275
+ async parse(Type) { Type = runtimeHttpType(Type); return Type.parse(await this.json()); }
2276
+ }
2277
+
2278
+ class Request {
2279
+ constructor(method, url, options) {
2280
+ this.method = methodOf(method);
2281
+ this.url = __velarString(url, "HTTP URL");
2282
+ if (this.url.length > 2 * 1024 * 1024) throw new RangeError("HTTP URLs cannot exceed 2 MiB");
2283
+ this.options = optionsOf(options);
2284
+ if ((this.method === "GET" || this.method === "HEAD") && this.options.body != null) throw new TypeError(this.method + " requests cannot have a body");
2285
+ this.controller = null;
2286
+ this.pending = null;
2287
+ this.abortError = null;
2288
+ this.finished = false;
2289
+ this.timer = null;
2290
+ }
2291
+ async response() {
2292
+ if (this.pending) return this.pending;
2293
+ if (this.abortError) throw this.abortError;
2294
+ requireHttpHost();
2295
+ this.controller = new NativeAbortController();
2296
+ const timeoutMs = this.options.timeout;
2297
+ this.timer = timeoutMs ? nativeReflectApply(nativeSetTimeout, globalThis, [() => this.abort("timeout"), timeoutMs]) : null;
2298
+ this.pending = this.perform(this.controller);
2299
+ return this.pending;
2300
+ }
2301
+ finish() {
2302
+ if (this.finished) return;
2303
+ this.finished = true;
2304
+ if (this.timer) { nativeReflectApply(nativeClearTimeout, globalThis, [this.timer]); this.timer = null; }
2305
+ }
2306
+ abort(reason) {
2307
+ if (this.finished || this.abortError) return;
2308
+ this.abortError = new HttpAbortError(reason);
2309
+ if (this.timer) { nativeReflectApply(nativeClearTimeout, globalThis, [this.timer]); this.timer = null; }
2310
+ if (this.controller) nativeReflectApply(nativeAbort, this.controller, [this.abortError]);
2311
+ }
2312
+ async perform(controller) {
2313
+ try {
2314
+ const headers = headerMap(this.options.headers);
2315
+ let body = this.options.body;
2316
+ const multipart = body != null && typeof body === "object" ? nativeReflectApply(nativeWeakMapGet, formBodies, [body]) : null;
2317
+ if (multipart instanceof NativeFormData) {
2318
+ if (nativeReflectApply(nativeHeadersHas, headers, ["content-type"])) throw new TypeError("Do not set content-type for a VelarScript form body; the browser owns its multipart boundary");
2319
+ body = multipart;
2320
+ }
2321
+ const signal = nativeReflectApply(nativeAbortSignal, controller, []);
2322
+ let transportResponse;
2323
+ try {
2324
+ transportResponse = await nativeReflectApply(nativeFetch, globalThis, [this.url, {
2325
+ method: this.method,
2326
+ headers,
2327
+ body,
2328
+ credentials: this.options.credentials,
2329
+ cache: this.options.cache,
2330
+ signal,
2331
+ }]);
2332
+ } catch {
2333
+ if (this.abortError) throw this.abortError;
2334
+ throw new HttpTransportError("HTTP request transport failed", HttpTransportPhase.request);
2335
+ }
2336
+ const response = await responseSnapshot(transportResponse);
2337
+ if (this.abortError) throw this.abortError;
2338
+ const wrapped = new HttpResponse(response, this);
2339
+ if (!wrapped.ok) {
2340
+ const text = await wrapped.text();
2341
+ let parsed = text;
2342
+ try { parsed = text ? __velarJsonParse(text, "HTTP error JSON text") : null; } catch { parsed = text; }
2343
+ const errorUrl = wrapped.url || this.url;
2344
+ throw new HttpError("HTTP " + wrapped.status + " for " + errorUrl, wrapped.status, errorUrl, parsed);
2345
+ }
2346
+ return wrapped;
2347
+ } catch (error) {
2348
+ this.finish();
2349
+ if (this.abortError) throw this.abortError;
2350
+ throw error;
2351
+ }
2352
+ }
2353
+ async json() { return (await this.response()).json(); }
2354
+ async text() { return (await this.response()).text(); }
2355
+ async bytes() { return (await this.response()).bytes(); }
2356
+ async streamText(consume) { return (await this.response()).streamText(consume); }
2357
+ async blob() { return (await this.response()).blob(); }
2358
+ async parse(Type) { Type = runtimeHttpType(Type); return Type.parse(await this.json()); }
2359
+ cancel() { this.abort("cancelled"); return null; }
2360
+ }
2361
+
2362
+ const createRequest = (method) => (url, options = {}) => new Request(method, url, options);
2363
+ export const http = __velarFreezeOptionsValue({
2364
+ request(method, url, options = {}) { return new Request(method, url, options); },
2365
+ get: createRequest("GET"), post: createRequest("POST"), put: createRequest("PUT"), patch: createRequest("PATCH"), delete: createRequest("DELETE"), head: createRequest("HEAD"),
2366
+ });
2367
+ `.trimStart()],
2368
+ ["velar/storage", String.raw `
2369
+ ${ownedCallbackRuntime}
2370
+ ${VELAR_STRICT_JSON_RUNTIME}
2371
+ ${VELAR_UTF8_RUNTIME}
2372
+ ${listRuntime}
2373
+ ${runtimeTypeRuntime}
2374
+ ${storageHostRuntime}
2375
+ const changeEvent = "velar-storage-change";
2376
+ const storageMaxKeyCodeUnits = 4096;
2377
+ const storageMaxListingCodeUnits = 16 * 1024 * 1024;
2378
+ const storageMaxValueBytes = 16 * 1024 * 1024;
2379
+ const storageNumberIsSafeInteger = Object.getOwnPropertyDescriptor(Number, "isSafeInteger")?.value;
2380
+ const storageStringSlice = Object.getOwnPropertyDescriptor(String.prototype, "slice").value;
2381
+ const storageListSort = Object.getOwnPropertyDescriptor(Array.prototype, "sort").value;
2382
+ const storageMissingField = __velarBrowserMissingField;
2383
+ const storageNativeUint8Array = typeof globalThis.Uint8Array === "function" ? globalThis.Uint8Array : null;
2384
+ const storageTypedArrayPrototype = storageNativeUint8Array ? Object.getPrototypeOf(storageNativeUint8Array.prototype) : null;
2385
+ const storageTypedArrayTag = storageTypedArrayPrototype ? Object.getOwnPropertyDescriptor(storageTypedArrayPrototype, Symbol.toStringTag)?.get : null;
2386
+ const storageTypedArrayLength = storageTypedArrayPrototype ? Object.getOwnPropertyDescriptor(storageTypedArrayPrototype, "length")?.get : null;
2387
+ const storageTypedArraySet = storageTypedArrayPrototype ? Object.getOwnPropertyDescriptor(storageTypedArrayPrototype, "set")?.value : null;
2388
+ function storageBytesKind(value) {
2389
+ if (typeof storageTypedArrayTag !== "function") return null;
2390
+ try { return __velarBrowserReflectApply(storageTypedArrayTag, value, []); } catch { return null; }
2391
+ }
2392
+ const __velarStorageBytes = Object.freeze({
2393
+ is(value) { return storageBytesKind(value) === "Uint8Array"; },
2394
+ parse(value) {
2395
+ if (storageBytesKind(value) !== "Uint8Array" || typeof storageNativeUint8Array !== "function"
2396
+ || typeof storageTypedArrayLength !== "function" || typeof storageTypedArraySet !== "function") {
2397
+ throw new TypeError("Bytes requires Uint8Array");
2398
+ }
2399
+ const output = new storageNativeUint8Array(__velarBrowserReflectApply(storageTypedArrayLength, value, []));
2400
+ __velarBrowserReflectApply(storageTypedArraySet, output, [value]);
2401
+ return output;
2402
+ },
2403
+ });
2404
+
2405
+ export class StorageQuotaError extends Error { constructor(message = "Browser storage quota was exceeded") { super(message); this.name = "StorageQuotaError"; } }
2406
+ export class StorageTransactionError extends Error { constructor(message = "Browser storage transaction failed") { super(message); this.name = "StorageTransactionError"; } }
2407
+ export class StorageUpgradeError extends Error { constructor(message = "Browser storage upgrade failed") { super(message); this.name = "StorageUpgradeError"; } }
2408
+ function storageFailure(error, phase = "transaction") {
2409
+ if (error instanceof StorageQuotaError || error instanceof StorageTransactionError || error instanceof StorageUpgradeError) return error;
2410
+ if (error && typeof error === "object" && error.name === "QuotaExceededError") return new StorageQuotaError(error.message || undefined);
2411
+ const message = error && typeof error === "object" && typeof error.message === "string" ? error.message : undefined;
2412
+ return phase === "upgrade" ? new StorageUpgradeError(message) : new StorageTransactionError(message);
2413
+ }
2414
+
2415
+ function storageType(Type) { return __velarRequireRuntimeType(Type, "Storage reads"); }
2416
+ function storageText(value, name) { if (typeof value !== "string") throw new TypeError(name + " must be a string"); if (value.length > storageMaxKeyCodeUnits) throw new RangeError(name + " cannot exceed 4096 characters"); return value; }
2417
+ function storageSafeInteger(value) { return typeof storageNumberIsSafeInteger === "function" && __velarBrowserReflectApply(storageNumberIsSafeInteger, null, [value]); }
2418
+ function storageByteBudget(value) { if (!storageSafeInteger(value) || value <= 0 || value > storageMaxValueBytes) throw new RangeError("Storage maxBytes must be an integer from 1 through 16777216"); return value; }
2419
+ function storageOwnDataField(value, name) {
2420
+ return __velarBrowserOwnDataField(value, name);
2421
+ }
2422
+ function storageHostEventField(event, name, nativeGetter, constructor) {
2423
+ return storageHostField(event, name, nativeGetter, constructor);
2424
+ }
2425
+ function storageChangeSnapshot(event) {
2426
+ const detail = storageHostEventField(event, "detail", storageCustomEventDetail, storageNativeCustomEvent);
2427
+ if (detail === storageMissingField || detail === null || typeof detail !== "object") return null;
2428
+ const prototype = Object.getPrototypeOf(detail);
2429
+ if (prototype !== Object.prototype && prototype !== null) return null;
2430
+ const areaName = storageOwnDataField(detail, "areaName");
2431
+ const key = storageOwnDataField(detail, "key");
2432
+ const newValue = storageOwnDataField(detail, "newValue");
2433
+ const oldValue = storageOwnDataField(detail, "oldValue");
2434
+ if (areaName === storageMissingField || key === storageMissingField || newValue === storageMissingField || oldValue === storageMissingField) return null;
2435
+ return { areaName, key, newValue, oldValue };
2436
+ }
2437
+ function storageEventSnapshot(event) {
2438
+ const storageArea = storageHostEventField(event, "storageArea", storageEventStorageArea, storageNativeStorageEvent);
2439
+ const key = storageHostEventField(event, "key", storageEventKey, storageNativeStorageEvent);
2440
+ const newValue = storageHostEventField(event, "newValue", storageEventNewValue, storageNativeStorageEvent);
2441
+ const oldValue = storageHostEventField(event, "oldValue", storageEventOldValue, storageNativeStorageEvent);
2442
+ if (storageArea === storageMissingField || key === storageMissingField || newValue === storageMissingField || oldValue === storageMissingField) return null;
2443
+ return { storageArea, key, newValue, oldValue };
2444
+ }
2445
+ function parsed(raw, Type, fallback, maxBytes) {
2446
+ Type = storageType(Type);
2447
+ if (raw == null) return fallback;
2448
+ if (typeof raw !== "string" || __velarUtf8ByteLength(raw) > maxBytes) return fallback;
2449
+ try { return Type.parse(__velarJsonParse(raw, "Stored JSON text")); } catch { return fallback; }
2450
+ }
2451
+
2452
+ function createStore(storageArea, prefix = "", areaName = "local") {
2453
+ const area = () => {
2454
+ if (storageArea === storageMissingField || storageArea === null || (typeof storageArea !== "object" && typeof storageArea !== "function")) {
2455
+ throw new Error("velar/storage requires a browser storage environment");
2456
+ }
2457
+ return storageArea;
2458
+ };
2459
+ const full = (key) => {
2460
+ const value = storageText(key, "Storage key");
2461
+ if (prefix.length > storageMaxKeyCodeUnits - value.length) throw new RangeError("Scoped storage keys cannot exceed 4096 characters");
2462
+ return prefix + value;
2463
+ };
2464
+ const emit = (key, oldValue, newValue) => {
2465
+ if (typeof storageNativeCustomEvent !== "function") throw new TypeError("The browser CustomEvent API is unavailable");
2466
+ const detail = Object.freeze({ areaName, key, oldValue, newValue });
2467
+ return __velarBrowserCallCaptured(storageGlobalDispatch, storageWindow, [new storageNativeCustomEvent(changeEvent, { detail })], "dispatchEvent");
2468
+ };
2469
+ const api = {
2470
+ get(key, Type, fallback = null, maxBytes = storageMaxValueBytes) {
2471
+ Type = storageType(Type);
2472
+ maxBytes = storageByteBudget(maxBytes);
2473
+ const name = full(key);
2474
+ return parsed(storageHostCall(area(), "getItem", storageGetItem, storageNativeStorage, [name]), Type, fallback, maxBytes);
2475
+ },
2476
+ set(key, value, maxBytes = storageMaxValueBytes) {
2477
+ const name = full(key);
2478
+ maxBytes = storageByteBudget(maxBytes);
2479
+ const next = __velarJsonStringify(value);
2480
+ if (__velarUtf8ByteLength(next) > maxBytes) throw new RangeError("Stored JSON exceeds maxBytes");
2481
+ const target = area();
2482
+ const previous = storageHostCall(target, "getItem", storageGetItem, storageNativeStorage, [name]);
2483
+ storageHostCall(target, "setItem", storageSetItem, storageNativeStorage, [name, next]);
2484
+ emit(name, previous, next);
2485
+ return null;
2486
+ },
2487
+ has(key) { const name = full(key); return storageHostCall(area(), "getItem", storageGetItem, storageNativeStorage, [name]) != null; },
2488
+ keys() {
2489
+ const target = area();
2490
+ const count = storageHostField(target, "length", storageLength, storageNativeStorage);
2491
+ if (!storageSafeInteger(count) || count < 0 || count > 100000) throw new RangeError("Browser storage cannot exceed 100000 keys");
2492
+ const output = [];
2493
+ let outputUnits = 0;
2494
+ for (let index = 0; index < count; index += 1) {
2495
+ const key = storageHostCall(target, "key", storageKey, storageNativeStorage, [index]);
2496
+ if (key === null) continue;
2497
+ if (typeof key !== "string") throw new TypeError("Browser storage returned a non-string key");
2498
+ if (key.length < prefix.length || __velarBrowserCallCaptured(storageStringSlice, key, [0, prefix.length], "String.slice") !== prefix) continue;
2499
+ if (key.length > storageMaxKeyCodeUnits) throw new RangeError("Browser storage keys cannot exceed 4096 characters");
2500
+ const visible = __velarBrowserCallCaptured(storageStringSlice, key, [prefix.length], "String.slice");
2501
+ outputUnits += visible.length;
2502
+ if (outputUnits > storageMaxListingCodeUnits) throw new RangeError("Browser storage key listings cannot exceed 16 MiB");
2503
+ output.push(visible);
2504
+ }
2505
+ __velarBrowserCallCaptured(storageListSort, output, [], "Array.sort");
2506
+ return output;
2507
+ },
2508
+ remove(key) {
2509
+ const name = full(key);
2510
+ const target = area();
2511
+ const previous = storageHostCall(target, "getItem", storageGetItem, storageNativeStorage, [name]);
2512
+ storageHostCall(target, "removeItem", storageRemoveItem, storageNativeStorage, [name]);
2513
+ if (previous != null) emit(name, previous, null);
2514
+ return null;
2515
+ },
2516
+ clear() { for (const key of api.keys()) api.remove(key); return null; },
2517
+ scope(name) {
2518
+ const value = storageText(name, "Storage scope").trim();
2519
+ if (!value) throw new TypeError("Storage scope cannot be empty");
2520
+ if (prefix.length > storageMaxKeyCodeUnits - value.length - 1) throw new RangeError("Storage scope paths cannot exceed 4096 characters");
2521
+ return createStore(storageArea, prefix + value + ":", areaName);
2522
+ },
2523
+ watch(key, Type, callback, maxBytes = storageMaxValueBytes) {
2524
+ if (typeof callback !== "function") throw new TypeError("Storage watch requires a callback");
2525
+ Type = storageType(Type);
2526
+ maxBytes = storageByteBudget(maxBytes);
2527
+ const name = full(key);
2528
+ const changed = (event) => {
2529
+ const detail = storageChangeSnapshot(event);
2530
+ if (!detail || detail.areaName !== areaName || detail.key !== name) return;
2531
+ __velarInvokeOwnedCallback(callback, [parsed(detail.newValue, Type, null, maxBytes), parsed(detail.oldValue, Type, null, maxBytes)], "storage", "watch");
2532
+ };
2533
+ const stored = (event) => {
2534
+ const snapshot = storageEventSnapshot(event);
2535
+ if (!snapshot || snapshot.storageArea !== area() || snapshot.key !== name) return;
2536
+ __velarInvokeOwnedCallback(callback, [parsed(snapshot.newValue, Type, null, maxBytes), parsed(snapshot.oldValue, Type, null, maxBytes)], "storage", "watch");
2537
+ };
2538
+ const removeChanged = storageListenGlobal(changeEvent, changed);
2539
+ const removeStored = storageListenGlobal("storage", stored);
2540
+ return () => { removeChanged(); removeStored(); return null; };
2541
+ },
2542
+ };
2543
+ return Object.freeze(api);
2544
+ }
2545
+
2546
+ export const storage = createStore(storageLocalArea);
2547
+ export const session = createStore(storageSessionArea, "", "session");
2548
+
2549
+ export function database(name) {
2550
+ const databaseName = storageText(name, "Database name").trim();
2551
+ if (!databaseName) throw new TypeError("Database name cannot be empty");
2552
+ if (databaseName.length > 256) throw new RangeError("Database names cannot exceed 256 characters");
2553
+ if (storageIndexedDb === storageMissingField || storageIndexedDb === null) {
2554
+ throw new Error("velar/storage database requires IndexedDB");
2555
+ }
2556
+ let opened = null;
2557
+ const requestResult = (request) => storageHostField(request, "result", storageIdbRequestResult, storageNativeIdbRequest);
2558
+ const requestError = (request) => storageHostField(request, "error", storageIdbRequestError, storageNativeIdbRequest);
2559
+ const closeConnection = (value) => storageHostCall(value, "close", storageIdbClose, storageNativeIdbDatabase);
2560
+ const objectOperation = (store, operation, arguments_) => {
2561
+ const methods = {
2562
+ get: storageIdbObjectGet,
2563
+ put: storageIdbObjectPut,
2564
+ getKey: storageIdbObjectGetKey,
2565
+ getAllKeys: storageIdbObjectGetAllKeys,
2566
+ delete: storageIdbObjectDelete,
2567
+ clear: storageIdbObjectClear,
2568
+ };
2569
+ return storageHostCall(store, operation, methods[operation], storageNativeIdbObjectStore, arguments_);
2570
+ };
2571
+ const connect = () => {
2572
+ if (opened) return opened;
2573
+ const pending = new Promise((resolve, reject) => {
2574
+ let request;
2575
+ const guarded = (callback) => (...arguments_) => { try { callback(...arguments_); } catch (error) { reject(error); } };
2576
+ try {
2577
+ request = storageHostCall(storageIndexedDb, "open", storageIdbOpen, storageNativeIdbFactory, ["velar:" + databaseName, 1]);
2578
+ storageListen(request, "upgradeneeded", guarded(() => {
2579
+ const result = requestResult(request);
2580
+ const names = storageHostField(result, "objectStoreNames", storageIdbObjectStoreNames, storageNativeIdbDatabase);
2581
+ const present = storageHostCall(names, "contains", storageDomStringListContains, storageNativeDomStringList, ["values"]);
2582
+ if (typeof present !== "boolean") throw new TypeError("IndexedDB objectStoreNames.contains must return bool");
2583
+ if (!present) storageHostCall(result, "createObjectStore", storageIdbCreateObjectStore, storageNativeIdbDatabase, ["values"]);
2584
+ }), { once: true });
2585
+ storageListen(request, "success", guarded(() => {
2586
+ const result = requestResult(request);
2587
+ if (opened !== pending) { closeConnection(result); return; }
2588
+ storageListen(result, "versionchange", () => { closeConnection(result); if (opened === pending) opened = null; }, { once: true });
2589
+ storageListen(result, "close", () => { if (opened === pending) opened = null; }, { once: true });
2590
+ resolve(result);
2591
+ }), { once: true });
2592
+ storageListen(request, "error", guarded(() => reject(storageFailure(requestError(request), "upgrade"))), { once: true });
2593
+ storageListen(request, "blocked", () => reject(new StorageUpgradeError("VelarScript database upgrade is blocked by another open page")), { once: true });
2594
+ } catch (error) { reject(storageFailure(error, "upgrade")); }
2595
+ });
2596
+ opened = pending;
2597
+ void pending.catch(() => { if (opened === pending) opened = null; });
2598
+ return pending;
2599
+ };
2600
+ const request = async (mode, operation) => {
2601
+ const connection = connect();
2602
+ const db = await connection;
2603
+ return new Promise((resolve, reject) => {
2604
+ let transaction;
2605
+ try { transaction = storageHostCall(db, "transaction", storageIdbTransaction, storageNativeIdbDatabase, ["values", mode]); }
2606
+ catch (error) {
2607
+ if (opened === connection) {
2608
+ opened = null;
2609
+ try { closeConnection(db); } catch {}
2610
+ }
2611
+ reject(storageFailure(error));
2612
+ return;
2613
+ }
2614
+ let value;
2615
+ let settled = false;
2616
+ const fail = (error) => { if (!settled) { settled = true; reject(error); } };
2617
+ const guarded = (callback) => (...arguments_) => { try { callback(...arguments_); } catch (error) { fail(error); } };
2618
+ try {
2619
+ const store = storageHostCall(transaction, "objectStore", storageIdbTransactionObjectStore, storageNativeIdbTransaction, ["values"]);
2620
+ const result = operation(store);
2621
+ if (result !== null) {
2622
+ storageListen(result, "success", guarded(() => { value = requestResult(result); }), { once: true });
2623
+ storageListen(result, "error", guarded(() => fail(storageFailure(requestError(result)))), { once: true });
2624
+ }
2625
+ storageListen(transaction, "abort", guarded(() => fail(storageFailure(storageHostField(transaction, "error", storageIdbTransactionError, storageNativeIdbTransaction)))), { once: true });
2626
+ storageListen(transaction, "error", guarded(() => fail(storageFailure(storageHostField(transaction, "error", storageIdbTransactionError, storageNativeIdbTransaction)))), { once: true });
2627
+ storageListen(transaction, "complete", guarded(() => { if (!settled) { settled = true; resolve(value); } }), { once: true });
2628
+ } catch (error) {
2629
+ try { storageHostCall(transaction, "abort", storageIdbTransactionAbort, storageNativeIdbTransaction); } catch {}
2630
+ fail(storageFailure(error));
2631
+ }
2632
+ });
2633
+ };
2634
+ const keyOf = (key) => storageText(key, "Database key");
2635
+ return Object.freeze({
2636
+ async get(key, Type, fallback = null, maxBytes = storageMaxValueBytes) { Type = storageType(Type); maxBytes = storageByteBudget(maxBytes); const name = keyOf(key); const encoded = await request("readonly", (store) => objectOperation(store, "get", [name])); if (encoded === undefined || typeof encoded !== "string" || __velarUtf8ByteLength(encoded) > maxBytes) return fallback; try { return Type.parse(__velarJsonParse(encoded, "Stored JSON text")); } catch { return fallback; } },
2637
+ async set(key, value, maxBytes = storageMaxValueBytes) {
2638
+ const name = keyOf(key);
2639
+ maxBytes = storageByteBudget(maxBytes);
2640
+ const encoded = __velarJsonStringify(value);
2641
+ if (__velarUtf8ByteLength(encoded) > maxBytes) throw new RangeError("Stored JSON exceeds maxBytes");
2642
+ await request("readwrite", (store) => objectOperation(store, "put", [encoded, name]));
2643
+ return null;
2644
+ },
2645
+ async getBytes(key, fallback = null, maxBytes = storageMaxValueBytes) {
2646
+ const name = keyOf(key);
2647
+ maxBytes = storageByteBudget(maxBytes);
2648
+ const value = await request("readonly", (store) => objectOperation(store, "get", [name]));
2649
+ if (value === undefined) return fallback === null ? null : __velarStorageBytes.parse(fallback);
2650
+ let bytes;
2651
+ try { bytes = __velarStorageBytes.parse(value); } catch { throw new StorageTransactionError("Stored value is not Bytes"); }
2652
+ if (bytes.byteLength > maxBytes) throw new StorageTransactionError("Stored Bytes exceeds maxBytes");
2653
+ return bytes;
2654
+ },
2655
+ async setBytes(key, value, maxBytes = storageMaxValueBytes) {
2656
+ const name = keyOf(key);
2657
+ maxBytes = storageByteBudget(maxBytes);
2658
+ const bytes = __velarStorageBytes.parse(value);
2659
+ if (bytes.byteLength > maxBytes) throw new RangeError("Stored Bytes exceeds maxBytes");
2660
+ await request("readwrite", (store) => objectOperation(store, "put", [bytes, name]));
2661
+ return null;
2662
+ },
2663
+ async batch(changes) {
2664
+ changes = __velarRequireList(changes, "Database batch changes");
2665
+ if (changes.length > 10000) throw new RangeError("Database batches cannot exceed 10000 changes");
2666
+ const checked = [];
2667
+ let totalBytes = 0;
2668
+ for (let index = 0; index < changes.length; index += 1) {
2669
+ const change = changes[index];
2670
+ if (!change || typeof change !== "object" || Array.isArray(change)) throw new TypeError("Database batch changes must be records");
2671
+ const keys = Object.keys(change);
2672
+ if (keys.length !== 2 || !keys.includes("key") || !keys.includes("bytes")) throw new TypeError("Database batch changes require exactly key and bytes");
2673
+ const key = keyOf(change.key);
2674
+ const bytes = change.bytes === null ? null : __velarStorageBytes.parse(change.bytes);
2675
+ totalBytes += bytes?.byteLength ?? 0;
2676
+ if (totalBytes > 64 * 1024 * 1024) throw new RangeError("Database batch Bytes cannot exceed 64 MiB");
2677
+ checked.push({key, bytes});
2678
+ }
2679
+ await request("readwrite", (store) => {
2680
+ for (const change of checked) {
2681
+ objectOperation(store, change.bytes === null ? "delete" : "put", change.bytes === null ? [change.key] : [change.bytes, change.key]);
2682
+ }
2683
+ return null;
2684
+ });
2685
+ return null;
2686
+ },
2687
+ async has(key) { const name = keyOf(key); return (await request("readonly", (store) => objectOperation(store, "getKey", [name]))) !== undefined; },
2688
+ async keys() {
2689
+ let keys = await request("readonly", (store) => objectOperation(store, "getAllKeys", [undefined, 100001]));
2690
+ if (!Array.isArray(keys)) throw new TypeError("VelarScript database keys must be a List");
2691
+ if (keys.length > 100000) throw new RangeError("VelarScript databases cannot expose more than 100000 keys at once");
2692
+ keys = __velarRequireList(keys, "Database keys");
2693
+ for (const key of keys) if (typeof key !== "string") throw new TypeError("VelarScript database contains a non-string key");
2694
+ __velarBrowserCallCaptured(storageListSort, keys, [], "Array.sort");
2695
+ return keys;
2696
+ },
2697
+ async remove(key) { const name = keyOf(key); await request("readwrite", (store) => objectOperation(store, "delete", [name])); return null; },
2698
+ async clear() { await request("readwrite", (store) => objectOperation(store, "clear", [])); return null; },
2699
+ });
2700
+ }
2701
+ `.trimStart()],
2702
+ ["velar/browser", String.raw `
2703
+ ${VELAR_TEXT_METHOD_RUNTIME}
2704
+ ${ownedCallbackRuntime}
2705
+ ${optionsRuntime}
2706
+ ${browserHostRuntime}
2707
+ const timerRuntimeKey = Symbol.for(${JSON.stringify(VELAR_RUNTIME_REGISTRY_KEY)});
2708
+ const browserMediaEventConstructor = __velarBrowserConstructor("MediaQueryListEvent");
2709
+ const browserMediaEventMatches = __velarBrowserPrototypeMember(browserMediaEventConstructor, "matches", "get");
2710
+ function browserMediaEventField(event) {
2711
+ return __velarBrowserField(event, "matches", browserMediaEventMatches, browserMediaEventConstructor);
2712
+ }
2713
+
2714
+ function browserNumber(value, name) { if (!Number.isFinite(value)) throw new TypeError(name + " must be a finite number"); return value; }
2715
+ function browserBool(value, name) { if (typeof value !== "boolean") throw new TypeError(name + " must be bool"); return value; }
2716
+ function browserText(value, name, maximum) { value = __velarString(value, name); if (value.length > maximum) throw new RangeError(name + " is too long"); return value; }
2717
+ function browserQuery(search) {
2718
+ search = browserText(search, "Browser location query", 2 * 1024 * 1024);
2719
+ if (typeof __velarBrowserUrlSearchParamsConstructor !== "function" || typeof __velarBrowserUrlSearchParamsForEach !== "function") {
2720
+ throw new TypeError("The browser URLSearchParams API is unavailable");
2721
+ }
2722
+ const output = new Map();
2723
+ let count = 0;
2724
+ const params = new __velarBrowserUrlSearchParamsConstructor(search);
2725
+ __velarBrowserCallCaptured(__velarBrowserUrlSearchParamsForEach, params, [(value, name) => {
2726
+ count += 1;
2727
+ if (count > 100000) throw new RangeError("Browser location queries cannot exceed 100000 fields");
2728
+ output.set(name, value);
2729
+ }], "URLSearchParams.forEach");
2730
+ return output;
2731
+ }
2732
+ function browserLanguages(value) {
2733
+ if (!Array.isArray(value) || value.length > 1000 || Object.getOwnPropertySymbols(value).length > 0
2734
+ || Object.getOwnPropertyNames(value).length !== value.length + 1) throw new TypeError("Browser languages must be a dense List");
2735
+ const output = new Array(value.length);
2736
+ for (let index = 0; index < value.length; index += 1) {
2737
+ const descriptor = Object.getOwnPropertyDescriptor(value, index);
2738
+ if (!descriptor?.enumerable || !("value" in descriptor)) throw new TypeError("Browser languages cannot use accessors");
2739
+ output[index] = browserText(descriptor.value, "Browser language", 256);
2740
+ }
2741
+ return output;
2742
+ }
2743
+ function scrollBehavior(value) { value = __velarString(value, "Scroll behavior"); if (!["auto", "smooth", "instant"].includes(value)) throw new TypeError("Scroll behavior must be auto, smooth, or instant"); return value; }
2744
+
2745
+ function timerDuration(value, name, positive) {
2746
+ if (typeof value !== "string") throw new TypeError(name + " requires Duration; write a value such as 200ms or 2s");
2747
+ const match = /^([+-]?(?:\d+(?:\.\d+)?|\.\d+))(ms|s)$/.exec(value);
2748
+ if (!match) throw new TypeError(name + " requires Duration; write a value such as 200ms or 2s");
2749
+ const milliseconds = Number(match[1]) * (match[2] === "s" ? 1000 : 1);
2750
+ if (!Number.isFinite(milliseconds) || milliseconds < 0 || milliseconds > 2147483647 || (positive && milliseconds === 0)) {
2751
+ throw new RangeError(name + (positive ? " requires a Duration above 0ms through 2147483647ms" : " requires a Duration from 0ms through 2147483647ms"));
2752
+ }
2753
+ return milliseconds;
2754
+ }
2755
+
2756
+ function reportTimerFailure(failure, detail) {
2757
+ const error = __velarNormalizeError(failure);
2758
+ const runtime = globalThis[timerRuntimeKey];
2759
+ if (runtime && typeof runtime.report === "function") {
2760
+ runtime.report(error, { phase: "timer", detail, unhandled: true });
2761
+ } else {
2762
+ __velarBrowserCallCaptured(__velarBrowserQueueMicrotask, __velarBrowserWindow, [() => { throw error; }], "queueMicrotask");
2763
+ }
2764
+ }
2765
+
2766
+ async function invokeTimer(callback, detail) {
2767
+ try {
2768
+ const observed = __velarObservePromise(
2769
+ callback(),
2770
+ (failure) => __velarReportOwnedCallback(failure, "timer", detail),
2771
+ );
2772
+ if (observed) await observed;
2773
+ }
2774
+ catch (error) { reportTimerFailure(error, detail); }
2775
+ }
2776
+
2777
+ export function after(value, callback) {
2778
+ const duration = timerDuration(value, "after", false);
2779
+ if (typeof callback !== "function") throw new TypeError("after requires a callback");
2780
+ let active = true;
2781
+ const timer = __velarBrowserCallCaptured(__velarBrowserSetTimeout, __velarBrowserWindow, [() => {
2782
+ if (!active) return;
2783
+ active = false;
2784
+ void invokeTimer(callback, "after");
2785
+ }, duration], "setTimeout");
2786
+ return () => { active = false; __velarBrowserCallCaptured(__velarBrowserClearTimeout, __velarBrowserWindow, [timer], "clearTimeout"); return null; };
2787
+ }
2788
+
2789
+ export function every(value, callback) {
2790
+ const duration = timerDuration(value, "every", true);
2791
+ if (typeof callback !== "function") throw new TypeError("every requires a callback");
2792
+ let active = true;
2793
+ let timer = null;
2794
+ const schedule = () => {
2795
+ if (!active) return;
2796
+ timer = __velarBrowserCallCaptured(__velarBrowserSetTimeout, __velarBrowserWindow, [async () => {
2797
+ if (!active) return;
2798
+ await invokeTimer(callback, "every");
2799
+ schedule();
2800
+ }, duration], "setTimeout");
2801
+ };
2802
+ schedule();
2803
+ return () => { active = false; if (timer !== null) __velarBrowserCallCaptured(__velarBrowserClearTimeout, __velarBrowserWindow, [timer], "clearTimeout"); return null; };
2804
+ }
2805
+
2806
+ export function location() {
2807
+ const value = __velarBrowserLocation;
2808
+ return Object.freeze({
2809
+ href: browserText(__velarBrowserField(value, "href", __velarBrowserLocationHref, __velarBrowserLocationConstructor), "Browser location URL", 2 * 1024 * 1024),
2810
+ origin: browserText(__velarBrowserField(value, "origin", __velarBrowserLocationOrigin, __velarBrowserLocationConstructor), "Browser location origin", 2 * 1024 * 1024),
2811
+ path: browserText(__velarBrowserField(value, "pathname", __velarBrowserLocationPathname, __velarBrowserLocationConstructor), "Browser location path", 2 * 1024 * 1024),
2812
+ query: browserQuery(__velarBrowserField(value, "search", __velarBrowserLocationSearch, __velarBrowserLocationConstructor)),
2813
+ hash: browserText(__velarBrowserField(value, "hash", __velarBrowserLocationHash, __velarBrowserLocationConstructor), "Browser location hash", 2 * 1024 * 1024),
2814
+ });
2815
+ }
2816
+
2817
+ export function environment() {
2818
+ const navigatorValue = __velarBrowserNavigator;
2819
+ const language = browserText(__velarBrowserField(navigatorValue, "language", __velarBrowserNavigatorLanguage, __velarBrowserNavigatorConstructor), "Browser language", 256);
2820
+ const languages = browserLanguages(__velarBrowserField(navigatorValue, "languages", __velarBrowserNavigatorLanguages, __velarBrowserNavigatorConstructor));
2821
+ const online = __velarBrowserField(navigatorValue, "onLine", __velarBrowserNavigatorOnline, __velarBrowserNavigatorConstructor);
2822
+ const touchPoints = __velarBrowserField(navigatorValue, "maxTouchPoints", __velarBrowserNavigatorTouchPoints, __velarBrowserNavigatorConstructor);
2823
+ if (typeof online !== "boolean") throw new TypeError("Browser online state must be bool");
2824
+ const visibility = __velarBrowserField(__velarBrowserDocument, "visibilityState", __velarBrowserDocumentVisibility, __velarBrowserDocumentConstructor);
2825
+ if (visibility !== "visible" && visibility !== "hidden") throw new TypeError("Browser visibility state is invalid");
2826
+ const darkMatcher = __velarBrowserCallCaptured(__velarBrowserMatchMedia, __velarBrowserWindow, ["(prefers-color-scheme: dark)"], "matchMedia");
2827
+ const reducedMatcher = __velarBrowserCallCaptured(__velarBrowserMatchMedia, __velarBrowserWindow, ["(prefers-reduced-motion: reduce)"], "matchMedia");
2828
+ const dark = __velarBrowserField(darkMatcher, "matches", __velarBrowserMediaMatches, __velarBrowserMediaQueryListConstructor);
2829
+ const reduced = __velarBrowserField(reducedMatcher, "matches", __velarBrowserMediaMatches, __velarBrowserMediaQueryListConstructor);
2830
+ if (typeof dark !== "boolean" || typeof reduced !== "boolean") throw new TypeError("Browser media preferences must be bool");
2831
+ if (!Number.isSafeInteger(touchPoints) || touchPoints < 0 || touchPoints > 1000) throw new RangeError("Browser touch points are outside VelarScript limits");
2832
+ return Object.freeze({
2833
+ language,
2834
+ languages,
2835
+ online,
2836
+ visible: visibility === "visible",
2837
+ colorScheme: dark ? "dark" : "light",
2838
+ reducedMotion: reduced,
2839
+ touch: touchPoints > 0,
2840
+ });
2841
+ }
2842
+
2843
+ function clipboard() {
2844
+ const value = __velarBrowserClipboard;
2845
+ if (__velarBrowserSecureContext !== true || !__velarBrowserNativeInstance(value, __velarBrowserClipboardConstructor)
2846
+ || typeof __velarBrowserClipboardWrite !== "function" || typeof __velarBrowserClipboardRead !== "function") {
2847
+ throw new Error("Clipboard access requires a secure browser context");
2848
+ }
2849
+ return value;
2850
+ }
2851
+
2852
+ export async function copyText(value) { value = browserText(value, "Clipboard text", 16 * 1024 * 1024); await __velarBrowserCallCaptured(__velarBrowserClipboardWrite, clipboard(), [value], "Clipboard.writeText"); return null; }
2853
+ export async function readClipboardText() { return browserText(await __velarBrowserCallCaptured(__velarBrowserClipboardRead, clipboard(), [], "Clipboard.readText"), "Clipboard text", 16 * 1024 * 1024); }
2854
+ export function open(url, target = "_blank") { url = browserText(url, "Browser URL", 2 * 1024 * 1024); target = browserText(target, "Browser target", 256); __velarBrowserCallCaptured(__velarBrowserOpen, __velarBrowserWindow, [url, target, target === "_blank" ? "noopener,noreferrer" : undefined], "open"); return null; }
2855
+ export function scrollTo(x, y, behavior = "auto") { __velarBrowserCallCaptured(__velarBrowserScrollTo, __velarBrowserWindow, [{ left: browserNumber(x, "Scroll x"), top: browserNumber(y, "Scroll y"), behavior: scrollBehavior(behavior) }], "scrollTo"); return null; }
2856
+ export function scrollIntoView(element, behavior = "smooth") { element = requireElement(element); __velarBrowserCallCaptured(__velarBrowserElementScrollIntoView, element, [{ behavior: scrollBehavior(behavior), block: "nearest" }], "Element.scrollIntoView"); return null; }
2857
+ export function scrollMetrics(element) {
2858
+ element = requireElement(element);
2859
+ const x = browserNumber(__velarBrowserField(element, "scrollLeft", __velarBrowserElementScrollLeft, __velarBrowserElementConstructor), "Element scroll x");
2860
+ const y = browserNumber(__velarBrowserField(element, "scrollTop", __velarBrowserElementScrollTop, __velarBrowserElementConstructor), "Element scroll y");
2861
+ const viewportWidth = browserNumber(__velarBrowserField(element, "clientWidth", __velarBrowserElementClientWidth, __velarBrowserElementConstructor), "Element viewport width");
2862
+ const viewportHeight = browserNumber(__velarBrowserField(element, "clientHeight", __velarBrowserElementClientHeight, __velarBrowserElementConstructor), "Element viewport height");
2863
+ const contentWidth = browserNumber(__velarBrowserField(element, "scrollWidth", __velarBrowserElementScrollWidth, __velarBrowserElementConstructor), "Element content width");
2864
+ const contentHeight = browserNumber(__velarBrowserField(element, "scrollHeight", __velarBrowserElementScrollHeight, __velarBrowserElementConstructor), "Element content height");
2865
+ if (viewportWidth < 0 || viewportHeight < 0 || contentWidth < 0 || contentHeight < 0) throw new RangeError("Element scroll dimensions cannot be negative");
2866
+ return Object.freeze({ x, y, viewportWidth, viewportHeight, contentWidth, contentHeight });
2867
+ }
2868
+ export function scrollElementTo(element, x, y, behavior = "auto") {
2869
+ element = requireElement(element);
2870
+ __velarBrowserCallCaptured(__velarBrowserElementScrollTo, element, [{ left: browserNumber(x, "Element scroll x"), top: browserNumber(y, "Element scroll y"), behavior: scrollBehavior(behavior) }], "Element.scrollTo");
2871
+ return null;
2872
+ }
2873
+ function pointerId(value) {
2874
+ if (!Number.isSafeInteger(value) || value < 0 || value > 2147483647) throw new RangeError("Pointer ID must be an integer from 0 through 2147483647");
2875
+ return value;
2876
+ }
2877
+ export function capturePointer(element, id) {
2878
+ element = requireElement(element);
2879
+ __velarBrowserCallCaptured(__velarBrowserElementSetPointerCapture, element, [pointerId(id)], "Element.setPointerCapture");
2880
+ return null;
2881
+ }
2882
+ export function releasePointer(element, id) {
2883
+ element = requireElement(element);
2884
+ __velarBrowserCallCaptured(__velarBrowserElementReleasePointerCapture, element, [pointerId(id)], "Element.releasePointerCapture");
2885
+ return null;
2886
+ }
2887
+ export function focus(element, preventScroll = false) {
2888
+ element = requireFocusableElement(element);
2889
+ preventScroll = __velarBool(preventScroll, "Focus preventScroll");
2890
+ __velarBrowserCallCaptured(__velarBrowserElementFocus, element, [{ preventScroll }], "HTMLElement.focus");
2891
+ return null;
2892
+ }
2893
+ export function blur(element) {
2894
+ element = requireFocusableElement(element);
2895
+ __velarBrowserCallCaptured(__velarBrowserElementBlur, element, [], "HTMLElement.blur");
2896
+ return null;
2897
+ }
2898
+ export function measure(element) {
2899
+ element = requireElement(element);
2900
+ const value = __velarBrowserCallCaptured(__velarBrowserElementMeasure, element, [], "Element.getBoundingClientRect");
2901
+ return Object.freeze({
2902
+ x: browserNumber(__velarBrowserField(value, "x", __velarBrowserRectX, __velarBrowserDomRectConstructor), "Element x"),
2903
+ y: browserNumber(__velarBrowserField(value, "y", __velarBrowserRectY, __velarBrowserDomRectConstructor), "Element y"),
2904
+ width: browserNumber(__velarBrowserField(value, "width", __velarBrowserRectWidth, __velarBrowserDomRectConstructor), "Element width"),
2905
+ height: browserNumber(__velarBrowserField(value, "height", __velarBrowserRectHeight, __velarBrowserDomRectConstructor), "Element height"),
2906
+ top: browserNumber(__velarBrowserField(value, "top", __velarBrowserRectTop, __velarBrowserDomRectReadOnlyConstructor), "Element top"),
2907
+ right: browserNumber(__velarBrowserField(value, "right", __velarBrowserRectRight, __velarBrowserDomRectReadOnlyConstructor), "Element right"),
2908
+ bottom: browserNumber(__velarBrowserField(value, "bottom", __velarBrowserRectBottom, __velarBrowserDomRectReadOnlyConstructor), "Element bottom"),
2909
+ left: browserNumber(__velarBrowserField(value, "left", __velarBrowserRectLeft, __velarBrowserDomRectReadOnlyConstructor), "Element left"),
2910
+ });
2911
+ }
2912
+ function requireTextArea(value) {
2913
+ if (!__velarBrowserNativeInstance(value, __velarBrowserTextAreaConstructor)
2914
+ || typeof __velarBrowserTextAreaValue !== "function"
2915
+ || typeof __velarBrowserTextAreaSelectionStart !== "function"
2916
+ || typeof __velarBrowserTextAreaSelectionEnd !== "function"
2917
+ || typeof __velarBrowserTextAreaSelectionDirection !== "function"
2918
+ || typeof __velarBrowserTextAreaSetSelectionRange !== "function") {
2919
+ throw new TypeError("Text selection helpers require a <textarea> element");
2920
+ }
2921
+ return value;
2922
+ }
2923
+ function textAreaValue(element) {
2924
+ const value = __velarBrowserField(element, "value", __velarBrowserTextAreaValue, __velarBrowserTextAreaConstructor);
2925
+ if (typeof value !== "string" || value.length > __velarMaxTextCodeUnits) throw new TypeError("Textarea value is outside VelarScript text bounds");
2926
+ return value;
2927
+ }
2928
+ function selectionDirection(value) {
2929
+ if (value !== "forward" && value !== "backward" && value !== "none") throw new TypeError("Text selection direction must be forward, backward, or none");
2930
+ return value;
2931
+ }
2932
+ export function textSelection(element) {
2933
+ element = requireTextArea(element);
2934
+ const value = textAreaValue(element);
2935
+ const unitStart = __velarBrowserField(element, "selectionStart", __velarBrowserTextAreaSelectionStart, __velarBrowserTextAreaConstructor);
2936
+ const unitEnd = __velarBrowserField(element, "selectionEnd", __velarBrowserTextAreaSelectionEnd, __velarBrowserTextAreaConstructor);
2937
+ const direction = selectionDirection(__velarBrowserField(element, "selectionDirection", __velarBrowserTextAreaSelectionDirection, __velarBrowserTextAreaConstructor));
2938
+ if (!Number.isSafeInteger(unitStart) || !Number.isSafeInteger(unitEnd) || unitStart < 0 || unitEnd < unitStart || unitEnd > value.length) {
2939
+ throw new TypeError("Textarea selection is outside its value");
2940
+ }
2941
+ const start = __velarTextCodePointIndex(value, unitStart);
2942
+ const end = __velarTextCodePointIndex(value, unitEnd);
2943
+ if (start === null || end === null) throw new TypeError("Textarea selection cannot split a Unicode code point");
2944
+ return Object.freeze({ start, end, direction });
2945
+ }
2946
+ export function setTextSelection(element, start, end, direction = "none") {
2947
+ element = requireTextArea(element);
2948
+ const value = textAreaValue(element);
2949
+ const size = __velarTextCodePointLength(value);
2950
+ if (!Number.isSafeInteger(start) || !Number.isSafeInteger(end) || start < 0 || end < start || end > size) {
2951
+ throw new RangeError("Text selection must be an ordered code-point range inside the textarea value");
2952
+ }
2953
+ direction = selectionDirection(direction);
2954
+ __velarBrowserCallCaptured(__velarBrowserTextAreaSetSelectionRange, element, [
2955
+ __velarTextCodeUnitOffset(value, start),
2956
+ __velarTextCodeUnitOffset(value, end),
2957
+ direction,
2958
+ ], "HTMLTextAreaElement.setSelectionRange");
2959
+ return null;
2960
+ }
2961
+ function clipboardData(event) {
2962
+ if (!__velarBrowserNativeInstance(event, __velarBrowserClipboardEventConstructor)) throw new TypeError("Clipboard helpers require a ClipboardEvent");
2963
+ const data = __velarBrowserField(event, "clipboardData", __velarBrowserClipboardEventData, __velarBrowserClipboardEventConstructor);
2964
+ if (!__velarBrowserNativeInstance(data, __velarBrowserDataTransferConstructor)) throw new TypeError("ClipboardEvent does not expose native clipboard data");
2965
+ return data;
2966
+ }
2967
+ export function clipboardText(event) {
2968
+ const data = clipboardData(event);
2969
+ return browserText(__velarBrowserCallCaptured(__velarBrowserDataTransferGetData, data, ["text/plain"], "DataTransfer.getData"), "Clipboard event text", 16 * 1024 * 1024);
2970
+ }
2971
+ export function setClipboardText(event, value) {
2972
+ value = browserText(value, "Clipboard event text", 16 * 1024 * 1024);
2973
+ const data = clipboardData(event);
2974
+ __velarBrowserCallCaptured(__velarBrowserDataTransferSetData, data, ["text/plain", value], "DataTransfer.setData");
2975
+ return null;
2976
+ }
2977
+ export function media(query) { const matcher = __velarBrowserCallCaptured(__velarBrowserMatchMedia, __velarBrowserWindow, [browserText(query, "Media query", 4096)], "matchMedia"); return browserBool(__velarBrowserField(matcher, "matches", __velarBrowserMediaMatches, __velarBrowserMediaQueryListConstructor), "Media query result"); }
2978
+ export function watchMedia(query, callback) {
2979
+ if (typeof callback !== "function") throw new TypeError("watchMedia requires a callback");
2980
+ const matcher = __velarBrowserCallCaptured(__velarBrowserMatchMedia, __velarBrowserWindow, [browserText(query, "Media query", 4096)], "matchMedia");
2981
+ const changed = (event) => __velarInvokeOwnedRead(() => browserBool(browserMediaEventField(event), "Media watcher result"), callback, "observer", "media");
2982
+ const remove = __velarBrowserListen(matcher, "change", changed);
2983
+ return () => { remove(); return null; };
2984
+ }
2985
+ export function watchOnline(callback) {
2986
+ if (typeof callback !== "function") throw new TypeError("watchOnline requires a callback");
2987
+ const changed = () => __velarInvokeOwnedRead(() => browserBool(__velarBrowserField(__velarBrowserNavigator, "onLine", __velarBrowserNavigatorOnline, __velarBrowserNavigatorConstructor), "Browser online state"), callback, "observer", "online");
2988
+ const removeOnline = __velarBrowserListenGlobal("online", changed);
2989
+ const removeOffline = __velarBrowserListenGlobal("offline", changed);
2990
+ return () => { removeOnline(); removeOffline(); return null; };
2991
+ }
2992
+ export function watchVisibility(callback) {
2993
+ if (typeof callback !== "function") throw new TypeError("watchVisibility requires a callback");
2994
+ const changed = () => __velarInvokeOwnedRead(() => {
2995
+ const visibility = __velarBrowserField(__velarBrowserDocument, "visibilityState", __velarBrowserDocumentVisibility, __velarBrowserDocumentConstructor);
2996
+ if (visibility !== "visible" && visibility !== "hidden") throw new TypeError("Browser visibility state is invalid");
2997
+ return visibility === "visible";
2998
+ }, callback, "observer", "visibility");
2999
+ const remove = __velarBrowserListen(__velarBrowserDocument, "visibilitychange", changed);
3000
+ return () => { remove(); return null; };
3001
+ }
3002
+ export function showDialog(dialog) {
3003
+ requireDialog(dialog);
3004
+ const connected = __velarBrowserField(dialog, "isConnected", __velarBrowserNodeConnected, __velarBrowserNodeConstructor);
3005
+ const open = __velarBrowserField(dialog, "open", __velarBrowserDialogOpen, __velarBrowserDialogConstructor);
3006
+ if (connected !== true) throw new Error("A dialog must be mounted before it can be shown");
3007
+ if (typeof open !== "boolean") throw new TypeError("Dialog open state must be bool");
3008
+ if (!open) __velarBrowserCallCaptured(__velarBrowserDialogShowModal, dialog, [], "HTMLDialogElement.showModal");
3009
+ return null;
3010
+ }
3011
+ export function closeDialog(dialog, result = "") {
3012
+ requireDialog(dialog);
3013
+ result = browserText(result, "Dialog result", 65536);
3014
+ const open = __velarBrowserField(dialog, "open", __velarBrowserDialogOpen, __velarBrowserDialogConstructor);
3015
+ if (typeof open !== "boolean") throw new TypeError("Dialog open state must be bool");
3016
+ if (open) __velarBrowserCallCaptured(__velarBrowserDialogClose, dialog, [result], "HTMLDialogElement.close");
3017
+ return null;
3018
+ }
3019
+ export function dialogResult(dialog) { requireDialog(dialog); return browserText(__velarBrowserField(dialog, "returnValue", __velarBrowserDialogResult, __velarBrowserDialogConstructor), "Dialog result", 65536); }
3020
+ export function frame() { return new Promise((resolve, reject) => __velarBrowserCallCaptured(__velarBrowserAnimationFrame, __velarBrowserWindow, [(value) => { try { resolve(browserNumber(value, "Animation frame timestamp")); } catch (error) { reject(error); } }], "requestAnimationFrame")); }
3021
+ function requireElement(value) { if (!__velarBrowserNativeInstance(value, __velarBrowserElementConstructor)) throw new TypeError("Browser element helpers require an Element"); return value; }
3022
+ function requireFocusableElement(value) {
3023
+ requireElement(value);
3024
+ if (!__velarBrowserNativeInstance(value, __velarBrowserHtmlElementConstructor)) throw new TypeError("Focus helpers require an HTML element");
3025
+ return value;
3026
+ }
3027
+ function requireDialog(value) {
3028
+ if (!__velarBrowserNativeInstance(value, __velarBrowserDialogConstructor)
3029
+ || typeof __velarBrowserDialogShowModal !== "function" || typeof __velarBrowserDialogClose !== "function") {
3030
+ throw new TypeError("Dialog helpers require a <dialog> element");
3031
+ }
3032
+ }
3033
+ `.trimStart()],
3034
+ ["velar/files", String.raw `
3035
+ ${optionsRuntime}
3036
+ ${fileRegistryRuntime}
3037
+ const defaultFileReadBytes = 16 * 1024 * 1024;
3038
+ const maxFileReadBytes = 64 * 1024 * 1024;
3039
+ const nativeFileListLength = typeof FileList === "function" ? Object.getOwnPropertyDescriptor(FileList.prototype, "length")?.get : null;
3040
+ const nativeFileListItem = typeof FileList === "function" ? Object.getOwnPropertyDescriptor(FileList.prototype, "item")?.value : null;
3041
+ function readLimit(value) {
3042
+ if (!Number.isSafeInteger(value) || value < 1 || value > maxFileReadBytes) throw new RangeError("File maxBytes must be an integer from 1 through 67108864");
3043
+ return value;
3044
+ }
3045
+ function fileText(value, name, maximum) { value = __velarString(value, name); if (value.length > maximum) throw new RangeError(name + " is too long"); return value; }
3046
+ function nativePickerField(operation, files, index = null) {
3047
+ if (typeof operation !== "function") throw new TypeError("The browser does not expose the required native FileList API");
3048
+ try { return index === null ? operation.call(files) : operation.call(files, index); }
3049
+ catch { throw new TypeError("A file picker returned an invalid native FileList"); }
3050
+ }
3051
+ function wrap(file) {
3052
+ const name = fileText(__velarReadNativeFileField(__velarNativeFileName, file), "Selected file name", 4096);
3053
+ const type = fileText(__velarReadNativeFileField(__velarNativeBlobType, file), "Selected file MIME type", 1024);
3054
+ const size = __velarReadNativeFileField(__velarNativeBlobSize, file);
3055
+ const modified = __velarReadNativeFileField(__velarNativeFileModified, file);
3056
+ if (!Number.isSafeInteger(size) || size < 0) throw new TypeError("Selected file size must be a non-negative safe integer");
3057
+ if (!Number.isFinite(modified) || modified < 0) throw new TypeError("Selected file modified time must be a non-negative finite number");
3058
+ const value = { name, size, type, modified };
3059
+ Object.freeze(value);
3060
+ WeakMap.prototype.set.call(nativeFiles, value, file);
3061
+ return value;
3062
+ }
3063
+ function native(file) { return __velarNativeFile(file, "Expected a file returned by velar/files"); }
3064
+ export function pick(options = {}) {
3065
+ options = __velarOptions(options, "File picker options", __velarOptionFields(["accept", "multiple"]));
3066
+ const accept = options.accept == null ? "" : __velarString(options.accept, "File accept filter");
3067
+ if (accept.length > 4096) throw new RangeError("File accept filters cannot exceed 4096 characters");
3068
+ const multiple = options.multiple == null ? false : __velarBool(options.multiple, "File picker multiple");
3069
+ return new Promise((resolve, reject) => {
3070
+ const input = document.createElement("input");
3071
+ input.type = "file";
3072
+ input.accept = accept;
3073
+ input.multiple = multiple;
3074
+ input.hidden = true;
3075
+ document.body.append(input);
3076
+ let finished = false;
3077
+ const finish = () => {
3078
+ if (finished) return;
3079
+ finished = true;
3080
+ globalThis.removeEventListener("focus", focused);
3081
+ try {
3082
+ const selected = input.files;
3083
+ if (!selected || typeof selected !== "object") throw new TypeError("A file picker returned an invalid file list");
3084
+ const count = nativePickerField(nativeFileListLength, selected);
3085
+ if (!Number.isSafeInteger(count) || count < 0) throw new TypeError("A file picker returned an invalid file list length");
3086
+ if (count > 10000) {
3087
+ input.remove();
3088
+ reject(new RangeError("A file picker cannot return more than 10000 files"));
3089
+ return;
3090
+ }
3091
+ const files = [];
3092
+ for (let index = 0; index < count; index += 1) {
3093
+ const file = nativePickerField(nativeFileListItem, selected, index);
3094
+ if (file === null) throw new TypeError("A file picker returned an incomplete native FileList");
3095
+ files.push(wrap(file));
3096
+ }
3097
+ input.remove();
3098
+ resolve(files);
3099
+ } catch (error) {
3100
+ input.remove();
3101
+ reject(error);
3102
+ }
3103
+ };
3104
+ input.addEventListener("change", finish, { once: true });
3105
+ input.addEventListener("cancel", finish, { once: true });
3106
+ const focused = () => setTimeout(finish, 0);
3107
+ globalThis.addEventListener("focus", focused, { once: true });
3108
+ input.click();
3109
+ });
3110
+ }
3111
+ export function readText(file, maxBytes = defaultFileReadBytes) {
3112
+ const value = native(file);
3113
+ maxBytes = readLimit(maxBytes);
3114
+ if (__velarReadNativeFileField(__velarNativeBlobSize, value) > maxBytes) throw new RangeError("File exceeds maxBytes");
3115
+ if (typeof __velarNativeBlobText !== "function") throw new TypeError("The browser does not expose native Blob text reading");
3116
+ return Promise.resolve(__velarNativeBlobText.call(value)).then((result) => {
3117
+ if (typeof result !== "string") throw new TypeError("File text result was not a string");
3118
+ if (result.length > maxBytes) throw new RangeError("File text result exceeds maxBytes");
3119
+ return result;
3120
+ });
3121
+ }
3122
+ export function readDataUrl(file, maxBytes = defaultFileReadBytes) {
3123
+ const value = native(file);
3124
+ maxBytes = readLimit(maxBytes);
3125
+ if (__velarReadNativeFileField(__velarNativeBlobSize, value) > maxBytes) throw new RangeError("File exceeds maxBytes");
3126
+ return new Promise((resolve, reject) => {
3127
+ const reader = new FileReader();
3128
+ reader.onload = () => {
3129
+ if (typeof reader.result !== "string") { reject(new TypeError("File data URL result was not text")); return; }
3130
+ if (reader.result.length > Math.ceil(maxBytes * 4 / 3) + 4096) { reject(new RangeError("File data URL result exceeds maxBytes expansion")); return; }
3131
+ resolve(reader.result);
3132
+ };
3133
+ reader.onerror = () => reject(__velarIsError(reader.error) ? reader.error : new __velarErrorNativeError("File reading failed"));
3134
+ reader.readAsDataURL(value);
3135
+ });
3136
+ }
3137
+ export function download(name, data, mime = "text/plain;charset=utf-8") {
3138
+ name = __velarString(name, "Download name");
3139
+ data = __velarString(data, "Download data");
3140
+ mime = __velarString(mime, "Download MIME type");
3141
+ if (!name || name.length > 4096) throw new RangeError("Download names must contain 1 through 4096 characters");
3142
+ if (data.length > maxFileReadBytes) throw new RangeError("Download text cannot exceed 64 MiB");
3143
+ if (!mime || mime.length > 1024) throw new RangeError("Download MIME types must contain 1 through 1024 characters");
3144
+ const url = URL.createObjectURL(new Blob([data], { type: mime }));
3145
+ const link = document.createElement("a");
3146
+ link.href = url;
3147
+ link.download = name;
3148
+ link.hidden = true;
3149
+ document.body.append(link);
3150
+ link.click();
3151
+ link.remove();
3152
+ setTimeout(() => URL.revokeObjectURL(url), 0);
3153
+ return null;
3154
+ }
3155
+ `.trimStart()],
3156
+ ["velar/realtime", String.raw `
3157
+ ${ownedCallbackRuntime}
3158
+ ${optionsRuntime}
3159
+ ${VELAR_STRICT_JSON_RUNTIME}
3160
+ const maxRealtimeTextCodeUnits = 16 * 1024 * 1024;
3161
+ const maxRealtimeUrlCodeUnits = 2 * 1024 * 1024;
3162
+ const realtimeMissingField = Object.freeze({});
3163
+ const realtimeReflectApply = Object.getOwnPropertyDescriptor(Reflect, "apply")?.value;
3164
+ function realtimeGlobalConstructor(name) {
3165
+ const descriptor = Object.getOwnPropertyDescriptor(globalThis, name);
3166
+ return descriptor && "value" in descriptor && typeof descriptor.value === "function" ? descriptor.value : null;
3167
+ }
3168
+ function realtimePrototype(value) {
3169
+ return typeof value === "function" ? Object.getOwnPropertyDescriptor(value, "prototype")?.value : null;
3170
+ }
3171
+ function realtimePrototypeMember(prototype, name, kind) {
3172
+ while (prototype && prototype !== Object.prototype) {
3173
+ const descriptor = Object.getOwnPropertyDescriptor(prototype, name);
3174
+ if (descriptor) {
3175
+ const member = kind === "get" ? descriptor.get : "value" in descriptor ? descriptor.value : null;
3176
+ return typeof member === "function" ? member : null;
3177
+ }
3178
+ prototype = Object.getPrototypeOf(prototype);
3179
+ }
3180
+ return null;
3181
+ }
3182
+ const RealtimeWebSocket = realtimeGlobalConstructor("WebSocket");
3183
+ const realtimeWebSocketPrototype = realtimePrototype(RealtimeWebSocket);
3184
+ const realtimeWebSocketAddEventListener = realtimePrototypeMember(realtimeWebSocketPrototype, "addEventListener", "value");
3185
+ const realtimeWebSocketSend = realtimePrototypeMember(realtimeWebSocketPrototype, "send", "value");
3186
+ const realtimeWebSocketClose = realtimePrototypeMember(realtimeWebSocketPrototype, "close", "value");
3187
+ const realtimeWebSocketUrl = realtimePrototypeMember(realtimeWebSocketPrototype, "url", "get");
3188
+ const realtimeWebSocketReadyState = realtimePrototypeMember(realtimeWebSocketPrototype, "readyState", "get");
3189
+ const RealtimeEventSource = realtimeGlobalConstructor("EventSource");
3190
+ const realtimeEventSourcePrototype = realtimePrototype(RealtimeEventSource);
3191
+ const realtimeEventSourceAddEventListener = realtimePrototypeMember(realtimeEventSourcePrototype, "addEventListener", "value");
3192
+ const realtimeEventSourceClose = realtimePrototypeMember(realtimeEventSourcePrototype, "close", "value");
3193
+ const realtimeEventSourceUrl = realtimePrototypeMember(realtimeEventSourcePrototype, "url", "get");
3194
+ const realtimeEventSourceReadyState = realtimePrototypeMember(realtimeEventSourcePrototype, "readyState", "get");
3195
+ const realtimeMessageEventPrototype = realtimePrototype(realtimeGlobalConstructor("MessageEvent"));
3196
+ const realtimeMessageEventData = realtimePrototypeMember(realtimeMessageEventPrototype, "data", "get");
3197
+ const realtimeMessageEventLastEventId = realtimePrototypeMember(realtimeMessageEventPrototype, "lastEventId", "get");
3198
+ const realtimeCloseEventPrototype = realtimePrototype(realtimeGlobalConstructor("CloseEvent"));
3199
+ const realtimeCloseEventCode = realtimePrototypeMember(realtimeCloseEventPrototype, "code", "get");
3200
+ const realtimeCloseEventReason = realtimePrototypeMember(realtimeCloseEventPrototype, "reason", "get");
3201
+ function realtimeOwnDataField(value, name) {
3202
+ if (value === null || (typeof value !== "object" && typeof value !== "function")) return realtimeMissingField;
3203
+ const descriptor = Object.getOwnPropertyDescriptor(value, name);
3204
+ return descriptor?.enumerable && "value" in descriptor ? descriptor.value : realtimeMissingField;
3205
+ }
3206
+ function realtimeHostField(value, name, nativeGetter) {
3207
+ if (typeof nativeGetter === "function" && typeof realtimeReflectApply === "function") {
3208
+ try { return realtimeReflectApply(nativeGetter, value, []); } catch {}
3209
+ }
3210
+ return realtimeOwnDataField(value, name);
3211
+ }
3212
+ function realtimeCall(operation, receiver, arguments_, name) {
3213
+ if (typeof operation !== "function" || typeof realtimeReflectApply !== "function") throw new TypeError("The browser does not expose native " + name);
3214
+ return realtimeReflectApply(operation, receiver, arguments_);
3215
+ }
3216
+ function realtimeUtf8Length(value) {
3217
+ let bytes = 0;
3218
+ for (let index = 0; index < value.length; index += 1) {
3219
+ const code = value.charCodeAt(index);
3220
+ if (code <= 0x7F) bytes += 1;
3221
+ else if (code <= 0x7FF) bytes += 2;
3222
+ else if (code >= 0xD800 && code <= 0xDBFF && index + 1 < value.length) {
3223
+ const next = value.charCodeAt(index + 1);
3224
+ if (next >= 0xDC00 && next <= 0xDFFF) { bytes += 4; index += 1; }
3225
+ else bytes += 3;
3226
+ } else bytes += 3;
3227
+ }
3228
+ return bytes;
3229
+ }
3230
+ function realtimeUrl(value, name) {
3231
+ value = __velarString(value, name);
3232
+ if (value.length > maxRealtimeUrlCodeUnits) throw new RangeError(name + " cannot exceed 2 MiB");
3233
+ return value;
3234
+ }
3235
+ function realtimeMessage(value, name) {
3236
+ value = __velarString(value, name);
3237
+ if (value.length > maxRealtimeTextCodeUnits) throw new RangeError(name + " cannot exceed 16 MiB");
3238
+ return value;
3239
+ }
3240
+ function handler(value, allowed) {
3241
+ value = __velarOptions(value, "Realtime handlers", allowed);
3242
+ for (const name of Object.getOwnPropertyNames(value)) {
3243
+ const callback = Object.getOwnPropertyDescriptor(value, name).value;
3244
+ if (callback != null && typeof callback !== "function") throw new TypeError("Realtime handler '" + name + "' must be callable");
3245
+ }
3246
+ return value;
3247
+ }
3248
+ function webSocketState(value) {
3249
+ const readyState = realtimeHostField(value, "readyState", realtimeWebSocketReadyState);
3250
+ if (readyState === 0) return "connecting";
3251
+ if (readyState === 1) return "open";
3252
+ if (readyState === 2) return "closing";
3253
+ if (readyState === 3) return "closed";
3254
+ throw new TypeError("WebSocket returned an invalid state");
3255
+ }
3256
+ function eventStreamState(value) {
3257
+ const readyState = realtimeHostField(value, "readyState", realtimeEventSourceReadyState);
3258
+ if (readyState === 0) return "connecting";
3259
+ if (readyState === 1) return "open";
3260
+ if (readyState === 2) return "closed";
3261
+ throw new TypeError("Event stream returned an invalid state");
3262
+ }
3263
+ export function socket(url, handlers = {}) {
3264
+ handlers = handler(handlers, __velarOptionFields(["open", "message", "error", "close"]));
3265
+ if (!RealtimeWebSocket) throw new TypeError("The browser does not expose native WebSocket");
3266
+ const value = new RealtimeWebSocket(realtimeUrl(url, "WebSocket URL"));
3267
+ let resolvedUrl;
3268
+ try {
3269
+ const hostUrl = realtimeHostField(value, "url", realtimeWebSocketUrl);
3270
+ if (hostUrl === realtimeMissingField) throw new TypeError("WebSocket returned an invalid resolved URL");
3271
+ resolvedUrl = realtimeUrl(hostUrl, "WebSocket resolved URL");
3272
+ }
3273
+ catch (failure) { try { realtimeCall(realtimeWebSocketClose, value, [], "WebSocket close"); } catch {} throw failure; }
3274
+ const opened = () => __velarInvokeOwnedCallback(handlers.open, [], "realtime", "socket:open");
3275
+ const messaged = (event) => {
3276
+ const data = realtimeHostField(event, "data", realtimeMessageEventData);
3277
+ if (data === realtimeMissingField) {
3278
+ __velarReportOwnedCallback(new TypeError("WebSocket message event is invalid"), "realtime", "socket:message");
3279
+ try {
3280
+ const state = webSocketState(value);
3281
+ if (state === "connecting" || state === "open") realtimeCall(realtimeWebSocketClose, value, [1003, "Invalid message event"], "WebSocket close");
3282
+ } catch {}
3283
+ return;
3284
+ }
3285
+ if (typeof data !== "string") {
3286
+ __velarInvokeOwnedCallback(handlers.error, ["Binary WebSocket messages are not supported by VelarScript Web API 0.10"], "realtime", "socket:error");
3287
+ const state = webSocketState(value);
3288
+ if (state === "connecting" || state === "open") realtimeCall(realtimeWebSocketClose, value, [1003, "Text messages only"], "WebSocket close");
3289
+ return;
3290
+ }
3291
+ if (data.length > maxRealtimeTextCodeUnits) {
3292
+ __velarInvokeOwnedCallback(handlers.error, ["WebSocket message exceeded 16 MiB"], "realtime", "socket:error");
3293
+ const state = webSocketState(value);
3294
+ if (state === "connecting" || state === "open") realtimeCall(realtimeWebSocketClose, value, [1009, "Message too large"], "WebSocket close");
3295
+ return;
3296
+ }
3297
+ __velarInvokeOwnedCallback(handlers.message, [data], "realtime", "socket:message");
3298
+ };
3299
+ const failed = () => __velarInvokeOwnedCallback(handlers.error, ["WebSocket connection error"], "realtime", "socket:error");
3300
+ const closed = (event) => {
3301
+ try {
3302
+ const code = realtimeHostField(event, "code", realtimeCloseEventCode);
3303
+ const hostReason = realtimeHostField(event, "reason", realtimeCloseEventReason);
3304
+ if (code === realtimeMissingField || hostReason === realtimeMissingField) throw new TypeError("WebSocket close event is invalid");
3305
+ const reason = realtimeMessage(hostReason, "WebSocket close event reason");
3306
+ if (!Number.isSafeInteger(code) || code < 0 || code > 65535) throw new TypeError("WebSocket close event returned an invalid code");
3307
+ if (reason.length > 123 || realtimeUtf8Length(reason) > 123) throw new RangeError("WebSocket close event reason cannot exceed 123 UTF-8 bytes");
3308
+ __velarInvokeOwnedCallback(handlers.close, [code, reason], "realtime", "socket:close");
3309
+ } catch (failure) { __velarReportOwnedCallback(failure, "realtime", "socket:close"); }
3310
+ };
3311
+ try {
3312
+ realtimeCall(realtimeWebSocketAddEventListener, value, ["open", opened], "WebSocket event listener");
3313
+ realtimeCall(realtimeWebSocketAddEventListener, value, ["message", messaged], "WebSocket event listener");
3314
+ realtimeCall(realtimeWebSocketAddEventListener, value, ["error", failed], "WebSocket event listener");
3315
+ realtimeCall(realtimeWebSocketAddEventListener, value, ["close", closed], "WebSocket event listener");
3316
+ } catch (failure) {
3317
+ try { realtimeCall(realtimeWebSocketClose, value, [], "WebSocket close"); } catch {}
3318
+ throw failure;
3319
+ }
3320
+ return Object.freeze({
3321
+ url: resolvedUrl,
3322
+ state: () => webSocketState(value),
3323
+ send(data) { data = realtimeMessage(data, "WebSocket message"); if (webSocketState(value) !== "open") throw new Error("WebSocket is not open"); realtimeCall(realtimeWebSocketSend, value, [data], "WebSocket send"); return null; },
3324
+ sendJson(data) { const text = __velarJsonStringify(data); if (webSocketState(value) !== "open") throw new Error("WebSocket is not open"); realtimeCall(realtimeWebSocketSend, value, [text], "WebSocket send"); return null; },
3325
+ close(code = 1000, reason = "") {
3326
+ if (!Number.isSafeInteger(code) || (code !== 1000 && (code < 3000 || code > 4999))) throw new RangeError("WebSocket close code must be 1000 or from 3000 through 4999");
3327
+ reason = __velarString(reason, "WebSocket close reason");
3328
+ if (reason.length > 123 || realtimeUtf8Length(reason) > 123) throw new RangeError("WebSocket close reason cannot exceed 123 UTF-8 bytes");
3329
+ const state = webSocketState(value);
3330
+ if (state === "connecting" || state === "open") realtimeCall(realtimeWebSocketClose, value, [code, reason], "WebSocket close");
3331
+ return null;
3332
+ },
3333
+ });
3334
+ }
3335
+ export function eventStream(url, handlers = {}, credentials = false) {
3336
+ handlers = handler(handlers, __velarOptionFields(["open", "message", "error"]));
3337
+ credentials = __velarBool(credentials, "Event stream credentials");
3338
+ if (!RealtimeEventSource) throw new TypeError("The browser does not expose native EventSource");
3339
+ const value = new RealtimeEventSource(realtimeUrl(url, "Event stream URL"), { withCredentials: credentials });
3340
+ let resolvedUrl;
3341
+ try {
3342
+ const hostUrl = realtimeHostField(value, "url", realtimeEventSourceUrl);
3343
+ if (hostUrl === realtimeMissingField) throw new TypeError("Event stream returned an invalid resolved URL");
3344
+ resolvedUrl = realtimeUrl(hostUrl, "Event stream resolved URL");
3345
+ }
3346
+ catch (failure) { try { realtimeCall(realtimeEventSourceClose, value, [], "EventSource close"); } catch {} throw failure; }
3347
+ const opened = () => __velarInvokeOwnedCallback(handlers.open, [], "realtime", "event-stream:open");
3348
+ const messaged = (event) => {
3349
+ const data = realtimeHostField(event, "data", realtimeMessageEventData);
3350
+ const lastEventId = realtimeHostField(event, "lastEventId", realtimeMessageEventLastEventId);
3351
+ if (data === realtimeMissingField || lastEventId === realtimeMissingField) {
3352
+ __velarReportOwnedCallback(new TypeError("Event stream message event is invalid"), "realtime", "event-stream:message");
3353
+ try { realtimeCall(realtimeEventSourceClose, value, [], "EventSource close"); } catch {}
3354
+ return;
3355
+ }
3356
+ if (typeof data !== "string" || data.length > maxRealtimeTextCodeUnits || typeof lastEventId !== "string" || lastEventId.length > 65536) {
3357
+ __velarInvokeOwnedCallback(handlers.error, ["Event stream message or ID exceeded VelarScript limits"], "realtime", "event-stream:error");
3358
+ realtimeCall(realtimeEventSourceClose, value, [], "EventSource close");
3359
+ return;
3360
+ }
3361
+ __velarInvokeOwnedCallback(handlers.message, [data, lastEventId], "realtime", "event-stream:message");
3362
+ };
3363
+ const failed = () => __velarInvokeOwnedCallback(handlers.error, ["Event stream connection error"], "realtime", "event-stream:error");
3364
+ try {
3365
+ realtimeCall(realtimeEventSourceAddEventListener, value, ["open", opened], "EventSource event listener");
3366
+ realtimeCall(realtimeEventSourceAddEventListener, value, ["message", messaged], "EventSource event listener");
3367
+ realtimeCall(realtimeEventSourceAddEventListener, value, ["error", failed], "EventSource event listener");
3368
+ } catch (failure) {
3369
+ try { realtimeCall(realtimeEventSourceClose, value, [], "EventSource close"); } catch {}
3370
+ throw failure;
3371
+ }
3372
+ return Object.freeze({
3373
+ url: resolvedUrl,
3374
+ state: () => eventStreamState(value),
3375
+ close() { realtimeCall(realtimeEventSourceClose, value, [], "EventSource close"); return null; },
3376
+ });
3377
+ }
3378
+ `.trimStart()],
3379
+ ["velar/web-test", String.raw `
3380
+ const browserRuntimeKey = Symbol.for("velar.browser.test.v1");
3381
+ function browserRuntime() {
3382
+ const runtime = globalThis[browserRuntimeKey];
3383
+ if (!runtime) throw new Error("velar/web-test browser controls require 'velar test --browser'");
3384
+ return runtime;
3385
+ }
3386
+ export const browser = Object.freeze({
3387
+ open(path = "/") { return browserRuntime().open(path); },
3388
+ reload() { return browserRuntime().reload(); },
3389
+ click(selector) { return browserRuntime().click(selector); },
3390
+ fill(selector, value) { return browserRuntime().fill(selector, value); },
3391
+ select(selector, value) { return browserRuntime().select(selector, value); },
3392
+ press(selector, key) { return browserRuntime().press(selector, key); },
3393
+ scroll(selector, x, y) { return browserRuntime().scroll(selector, x, y); },
3394
+ text(selector) { return browserRuntime().text(selector); },
3395
+ attribute(selector, name) { return browserRuntime().attribute(selector, name); },
3396
+ box(selector) { return browserRuntime().box(selector); },
3397
+ style(selector, property) { return browserRuntime().style(selector, property); },
3398
+ namespace(selector) { return browserRuntime().namespace(selector); },
3399
+ count(selector) { return browserRuntime().count(selector); },
3400
+ visible(selector) { return browserRuntime().visible(selector); },
3401
+ waitFor(selector, state = "visible") { return browserRuntime().waitFor(selector, state); },
3402
+ waitForText(selector, text) { return browserRuntime().waitForText(selector, text); },
3403
+ currentPath() { return browserRuntime().currentPath(); },
3404
+ viewport(width, height) { return browserRuntime().viewport(width, height); },
3405
+ timings() { return browserRuntime().timings(); },
3406
+ animation(selector) { return browserRuntime().animation(selector); },
3407
+ measureClick(selector) { return browserRuntime().measureClick(selector); },
3408
+ measureFill(selector, value) { return browserRuntime().measureFill(selector, value); },
3409
+ measurePress(selector, key) { return browserRuntime().measurePress(selector, key); },
3410
+ });
3411
+ function storageRuntime(area) {
3412
+ return Object.freeze({
3413
+ get(key) { return browserRuntime().storageGet(area, key); },
3414
+ set(key, value) { return browserRuntime().storageSet(area, key, value); },
3415
+ remove(key) { return browserRuntime().storageRemove(area, key); },
3416
+ clear() { return browserRuntime().storageClear(area); },
3417
+ });
3418
+ }
3419
+ export const localStorage = storageRuntime("local");
3420
+ export const sessionStorage = storageRuntime("session");
3421
+ export const network = Object.freeze({
3422
+ respond(path, body, status = 200, contentType = "application/json; charset=utf-8", delayMs = 0) {
3423
+ return browserRuntime().networkRespond(path, body, status, contentType, delayMs);
3424
+ },
3425
+ clear() { return browserRuntime().networkClear(); },
3426
+ });
3427
+ `.trimStart()],
3428
+ ]);
3429
+ export function webModuleSource(source, web = { base: "/" }) {
3430
+ if (source === "velar/websocket")
3431
+ return VELAR_WEB_WEBSOCKET_RUNTIME;
3432
+ if (source === "velar/worker")
3433
+ return VELAR_WEB_WORKER_RUNTIME;
3434
+ const value = webModuleSources.get(source);
3435
+ if (!value)
3436
+ return null;
3437
+ if (source === "velar/web")
3438
+ return value.replace(JSON.stringify("__VELAR_WEB_BASE__"), JSON.stringify(web.base));
3439
+ if (source === "velar/config") {
3440
+ return value.replace(JSON.stringify("__VELAR_PUBLIC_CONFIG__"), JSON.stringify(web.publicConfig ?? {}));
3441
+ }
3442
+ return value;
3443
+ }
3444
+ //# sourceMappingURL=runtime.js.map