@esposter/shared 4.3.1 → 4.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +0 -414
- package/dist/index.js +130 -260
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -3,47 +3,42 @@ import { ResultAsync, fromThrowable } from "neverthrow";
|
|
|
3
3
|
import { parse } from "node-html-parser";
|
|
4
4
|
import mimeDatabase from "mime-db/db.json" with { type: "json" };
|
|
5
5
|
import { defaultTreeAdapter, html as html$1, parseFragment } from "parse5";
|
|
6
|
-
|
|
6
|
+
// src/models/error/ForbiddenError.ts
|
|
7
7
|
var ForbiddenError = class extends Error {
|
|
8
8
|
constructor(message) {
|
|
9
9
|
super(message);
|
|
10
10
|
this.name = "ForbiddenError";
|
|
11
11
|
}
|
|
12
12
|
};
|
|
13
|
-
|
|
14
|
-
//#region src/models/error/InvalidOperationError.ts
|
|
13
|
+
// src/models/error/InvalidOperationError.ts
|
|
15
14
|
var InvalidOperationError = class extends Error {
|
|
16
15
|
constructor(operation, name, message) {
|
|
17
16
|
super(`Invalid operation: ${operation}, name: ${name}, ${message}`);
|
|
18
17
|
this.name = "InvalidOperationError";
|
|
19
18
|
}
|
|
20
19
|
};
|
|
21
|
-
|
|
22
|
-
//#region src/models/error/NotFoundError.ts
|
|
20
|
+
// src/models/error/NotFoundError.ts
|
|
23
21
|
var NotFoundError = class extends Error {
|
|
24
22
|
constructor(name, id) {
|
|
25
23
|
super(`${name} is not found for id: ${id}`);
|
|
26
24
|
this.name = "NotFoundError";
|
|
27
25
|
}
|
|
28
26
|
};
|
|
29
|
-
|
|
30
|
-
//#region src/models/error/NotInitializedError.ts
|
|
27
|
+
// src/models/error/NotInitializedError.ts
|
|
31
28
|
var NotInitializedError = class extends Error {
|
|
32
29
|
constructor(name) {
|
|
33
30
|
super(`${name} is not initialized`);
|
|
34
31
|
this.name = "NotInitializedError";
|
|
35
32
|
}
|
|
36
33
|
};
|
|
37
|
-
|
|
38
|
-
//#region src/models/error/WordFilteredError.ts
|
|
34
|
+
// src/models/error/WordFilteredError.ts
|
|
39
35
|
var WordFilteredError = class extends Error {
|
|
40
36
|
constructor(message) {
|
|
41
37
|
super(message);
|
|
42
38
|
this.name = "WordFilteredError";
|
|
43
39
|
}
|
|
44
40
|
};
|
|
45
|
-
|
|
46
|
-
//#region src/models/shared/Operation.ts
|
|
41
|
+
// src/models/shared/Operation.ts
|
|
47
42
|
let Operation = /* @__PURE__ */ function(Operation) {
|
|
48
43
|
Operation["Create"] = "Create";
|
|
49
44
|
Operation["Delete"] = "Delete";
|
|
@@ -53,8 +48,7 @@ let Operation = /* @__PURE__ */ function(Operation) {
|
|
|
53
48
|
Operation["Update"] = "Update";
|
|
54
49
|
return Operation;
|
|
55
50
|
}({});
|
|
56
|
-
|
|
57
|
-
//#region src/models/eventEmitter/TypedEventEmitter.ts
|
|
51
|
+
// src/models/eventEmitter/TypedEventEmitter.ts
|
|
58
52
|
var TypedEventEmitter = class {
|
|
59
53
|
#entriesMap = /* @__PURE__ */ new Map();
|
|
60
54
|
emit(event, ...args) {
|
|
@@ -89,8 +83,7 @@ var TypedEventEmitter = class {
|
|
|
89
83
|
else this.#entriesMap.set(event, entries);
|
|
90
84
|
}
|
|
91
85
|
};
|
|
92
|
-
|
|
93
|
-
//#region src/models/jsonPatch/JsonPatchOperationType.ts
|
|
86
|
+
// src/models/jsonPatch/JsonPatchOperationType.ts
|
|
94
87
|
let JsonPatchOperationType = /* @__PURE__ */ function(JsonPatchOperationType) {
|
|
95
88
|
JsonPatchOperationType["Add"] = "add";
|
|
96
89
|
JsonPatchOperationType["Copy"] = "copy";
|
|
@@ -100,28 +93,24 @@ let JsonPatchOperationType = /* @__PURE__ */ function(JsonPatchOperationType) {
|
|
|
100
93
|
JsonPatchOperationType["Test"] = "test";
|
|
101
94
|
return JsonPatchOperationType;
|
|
102
95
|
}({});
|
|
103
|
-
|
|
104
|
-
//#region src/models/message/MentionType.ts
|
|
96
|
+
// src/models/message/MentionType.ts
|
|
105
97
|
let MentionType = /* @__PURE__ */ function(MentionType) {
|
|
106
98
|
MentionType["Role"] = "role";
|
|
107
99
|
MentionType["User"] = "user";
|
|
108
100
|
return MentionType;
|
|
109
101
|
}({});
|
|
110
|
-
|
|
111
|
-
//#region src/models/object/ObjectMethod.ts
|
|
102
|
+
// src/models/object/ObjectMethod.ts
|
|
112
103
|
let ObjectMethod = /* @__PURE__ */ function(ObjectMethod) {
|
|
113
104
|
ObjectMethod["ToString"] = "toString";
|
|
114
105
|
ObjectMethod["ValueOf"] = "valueOf";
|
|
115
106
|
return ObjectMethod;
|
|
116
107
|
}({});
|
|
117
|
-
|
|
118
|
-
//#region src/services/app/constants.ts
|
|
108
|
+
// src/services/app/constants.ts
|
|
119
109
|
const MAX_READ_LIMIT = 1e3;
|
|
120
110
|
const SITE_NAME = "Esposter";
|
|
121
111
|
const KIBIBYTE = 1024;
|
|
122
112
|
const GIBIBYTE = KIBIBYTE ** 2 * KIBIBYTE;
|
|
123
|
-
|
|
124
|
-
//#region src/models/router/RoutePath.ts
|
|
113
|
+
// src/models/router/RoutePath.ts
|
|
125
114
|
const RoutePath = {
|
|
126
115
|
About: "/about",
|
|
127
116
|
Achievements: "/achievements",
|
|
@@ -160,24 +149,20 @@ const RoutePath = {
|
|
|
160
149
|
UserSettings: "/user/settings",
|
|
161
150
|
View: (type, id) => `/view/${type}/${id}`
|
|
162
151
|
};
|
|
163
|
-
|
|
164
|
-
//#region src/models/shared/ItemEntityType.ts
|
|
152
|
+
// src/models/shared/ItemEntityType.ts
|
|
165
153
|
const createItemEntityTypeSchema = (schema) => z.object({ type: schema });
|
|
166
|
-
|
|
167
|
-
//#region src/models/shared/ItemMetadata.ts
|
|
154
|
+
// src/models/shared/ItemMetadata.ts
|
|
168
155
|
var ItemMetadata = class {
|
|
169
156
|
createdAt = /* @__PURE__ */ new Date();
|
|
170
157
|
deletedAt = null;
|
|
171
158
|
updatedAt = /* @__PURE__ */ new Date();
|
|
172
159
|
};
|
|
173
|
-
|
|
174
|
-
//#region src/util/reactivity/getRawData.ts
|
|
160
|
+
// src/util/reactivity/getRawData.ts
|
|
175
161
|
const getRawData = (data) => {
|
|
176
162
|
const raw = data && data.__v_raw;
|
|
177
163
|
return raw ? getRawData(raw) : data;
|
|
178
164
|
};
|
|
179
|
-
|
|
180
|
-
//#region src/util/reactivity/toRawDeep.ts
|
|
165
|
+
// src/util/reactivity/toRawDeep.ts
|
|
181
166
|
const toRawDeep = (data) => {
|
|
182
167
|
const rawData = getRawData(data);
|
|
183
168
|
for (const key in rawData) if (Object.hasOwn(rawData, key)) {
|
|
@@ -186,28 +171,23 @@ const toRawDeep = (data) => {
|
|
|
186
171
|
}
|
|
187
172
|
return rawData;
|
|
188
173
|
};
|
|
189
|
-
|
|
190
|
-
//#region src/models/shared/Serializable.ts
|
|
174
|
+
// src/models/shared/Serializable.ts
|
|
191
175
|
var Serializable = class {
|
|
192
176
|
toJSON() {
|
|
193
177
|
return structuredClone(toRawDeep(this));
|
|
194
178
|
}
|
|
195
179
|
};
|
|
196
|
-
|
|
197
|
-
//#region src/services/error/toAppError.ts
|
|
180
|
+
// src/services/error/toAppError.ts
|
|
198
181
|
const toAppError = (error) => {
|
|
199
182
|
if (error instanceof Error) return error;
|
|
200
183
|
else if (typeof error === "object" && error !== null && "message" in error && typeof error.message === "string") return new Error(error.message, { cause: error });
|
|
201
184
|
else return new Error(String(error), { cause: error });
|
|
202
185
|
};
|
|
203
|
-
|
|
204
|
-
//#region src/services/error/getResult.ts
|
|
186
|
+
// src/services/error/getResult.ts
|
|
205
187
|
const getResult = (callback) => fromThrowable(callback, toAppError)();
|
|
206
|
-
|
|
207
|
-
//#region src/services/error/getResultAsync.ts
|
|
188
|
+
// src/services/error/getResultAsync.ts
|
|
208
189
|
const getResultAsync = (callback) => ResultAsync.fromThrowable(callback, toAppError)();
|
|
209
|
-
|
|
210
|
-
//#region src/services/error/reportFinalizerError.ts
|
|
190
|
+
// src/services/error/reportFinalizerError.ts
|
|
211
191
|
const reportFinalizerError = (callbackResult, finalizerError) => {
|
|
212
192
|
callbackResult.match(() => {
|
|
213
193
|
throw finalizerError;
|
|
@@ -215,11 +195,9 @@ const reportFinalizerError = (callbackResult, finalizerError) => {
|
|
|
215
195
|
console.error(finalizerError);
|
|
216
196
|
});
|
|
217
197
|
};
|
|
218
|
-
|
|
219
|
-
//#region src/util/function/noop.ts
|
|
198
|
+
// src/util/function/noop.ts
|
|
220
199
|
const noop = () => {};
|
|
221
|
-
|
|
222
|
-
//#region src/services/error/withFinalizer.ts
|
|
200
|
+
// src/services/error/withFinalizer.ts
|
|
223
201
|
const withFinalizer = (callback, finalizer) => {
|
|
224
202
|
const callbackResult = getResult(callback);
|
|
225
203
|
if (finalizer) getResult(finalizer).match(noop, (error) => {
|
|
@@ -229,8 +207,7 @@ const withFinalizer = (callback, finalizer) => {
|
|
|
229
207
|
throw error;
|
|
230
208
|
});
|
|
231
209
|
};
|
|
232
|
-
|
|
233
|
-
//#region src/services/error/withFinalizerAsync.ts
|
|
210
|
+
// src/services/error/withFinalizerAsync.ts
|
|
234
211
|
const withFinalizerAsync = async (callback, finalizer) => {
|
|
235
212
|
const callbackResult = await getResultAsync(async () => callback());
|
|
236
213
|
if (finalizer) await getResultAsync(async () => finalizer()).match(noop, (error) => {
|
|
@@ -240,15 +217,13 @@ const withFinalizerAsync = async (callback, finalizer) => {
|
|
|
240
217
|
throw error;
|
|
241
218
|
});
|
|
242
219
|
};
|
|
243
|
-
|
|
244
|
-
//#region src/services/history/createHistory.ts
|
|
220
|
+
// src/services/history/createHistory.ts
|
|
245
221
|
const createHistory = (limit) => ({
|
|
246
222
|
future: [],
|
|
247
223
|
limit,
|
|
248
224
|
past: []
|
|
249
225
|
});
|
|
250
|
-
|
|
251
|
-
//#region src/services/history/pushHistory.ts
|
|
226
|
+
// src/services/history/pushHistory.ts
|
|
252
227
|
const pushHistory = (history, entry) => {
|
|
253
228
|
const past = [...history.past, entry];
|
|
254
229
|
return {
|
|
@@ -257,8 +232,7 @@ const pushHistory = (history, entry) => {
|
|
|
257
232
|
past: past.slice(Math.max(past.length - history.limit, 0))
|
|
258
233
|
};
|
|
259
234
|
};
|
|
260
|
-
|
|
261
|
-
//#region src/services/history/redoHistory.ts
|
|
235
|
+
// src/services/history/redoHistory.ts
|
|
262
236
|
const redoHistory = (history) => {
|
|
263
237
|
const [entry] = history.future;
|
|
264
238
|
if (entry === void 0) return { history };
|
|
@@ -270,8 +244,7 @@ const redoHistory = (history) => {
|
|
|
270
244
|
}
|
|
271
245
|
};
|
|
272
246
|
};
|
|
273
|
-
|
|
274
|
-
//#region src/services/history/undoHistory.ts
|
|
247
|
+
// src/services/history/undoHistory.ts
|
|
275
248
|
const undoHistory = (history) => {
|
|
276
249
|
const entry = history.past.at(-1);
|
|
277
250
|
if (entry === void 0) return { history };
|
|
@@ -284,11 +257,9 @@ const undoHistory = (history) => {
|
|
|
284
257
|
}
|
|
285
258
|
};
|
|
286
259
|
};
|
|
287
|
-
|
|
288
|
-
//#region src/services/indexedDb/getRequestError.ts
|
|
260
|
+
// src/services/indexedDb/getRequestError.ts
|
|
289
261
|
const getRequestError = (request) => request.error ?? new DOMException("The request failed without an error", "UnknownError");
|
|
290
|
-
|
|
291
|
-
//#region src/services/indexedDb/getTransactionDone.ts
|
|
262
|
+
// src/services/indexedDb/getTransactionDone.ts
|
|
292
263
|
const getTransactionDone = (transaction) => new Promise((resolve, reject) => {
|
|
293
264
|
transaction.addEventListener("complete", () => {
|
|
294
265
|
resolve();
|
|
@@ -297,8 +268,7 @@ const getTransactionDone = (transaction) => new Promise((resolve, reject) => {
|
|
|
297
268
|
reject(transaction.error ?? new DOMException("The transaction was aborted", "AbortError"));
|
|
298
269
|
});
|
|
299
270
|
});
|
|
300
|
-
|
|
301
|
-
//#region src/services/indexedDb/requestToPromise.ts
|
|
271
|
+
// src/services/indexedDb/requestToPromise.ts
|
|
302
272
|
const requestToPromise = (request) => new Promise((resolve, reject) => {
|
|
303
273
|
request.addEventListener("success", () => {
|
|
304
274
|
resolve(request.result);
|
|
@@ -307,14 +277,12 @@ const requestToPromise = (request) => new Promise((resolve, reject) => {
|
|
|
307
277
|
reject(getRequestError(request));
|
|
308
278
|
});
|
|
309
279
|
});
|
|
310
|
-
|
|
311
|
-
//#region src/services/indexedDb/wrapIndex.ts
|
|
280
|
+
// src/services/indexedDb/wrapIndex.ts
|
|
312
281
|
const wrapIndex = (index) => ({
|
|
313
282
|
getAll: (query, count) => requestToPromise(index.getAll(query, count)),
|
|
314
283
|
getAllKeys: (query, count) => requestToPromise(index.getAllKeys(query, count))
|
|
315
284
|
});
|
|
316
|
-
|
|
317
|
-
//#region src/services/indexedDb/wrapObjectStore.ts
|
|
285
|
+
// src/services/indexedDb/wrapObjectStore.ts
|
|
318
286
|
const wrapObjectStore = (objectStore) => {
|
|
319
287
|
const reader = {
|
|
320
288
|
get: (key) => requestToPromise(objectStore.get(key)),
|
|
@@ -335,17 +303,14 @@ const wrapObjectStore = (objectStore) => {
|
|
|
335
303
|
...creator
|
|
336
304
|
};
|
|
337
305
|
};
|
|
338
|
-
|
|
339
|
-
//#region src/services/indexedDb/getTransactionObjectStore.ts
|
|
306
|
+
// src/services/indexedDb/getTransactionObjectStore.ts
|
|
340
307
|
const getTransactionObjectStore = (transaction) => (name) => wrapObjectStore(transaction.objectStore(name));
|
|
341
|
-
|
|
342
|
-
//#region src/services/indexedDb/wrapTransaction.ts
|
|
308
|
+
// src/services/indexedDb/wrapTransaction.ts
|
|
343
309
|
const wrapTransaction = (transaction) => ({
|
|
344
310
|
done: getTransactionDone(transaction),
|
|
345
311
|
objectStore: getTransactionObjectStore(transaction)
|
|
346
312
|
});
|
|
347
|
-
|
|
348
|
-
//#region src/services/indexedDb/wrapDatabase.ts
|
|
313
|
+
// src/services/indexedDb/wrapDatabase.ts
|
|
349
314
|
const wrapDatabase = (database) => {
|
|
350
315
|
const getReadonlyObjectStore = (storeName) => wrapObjectStore(database.transaction(storeName, "readonly").objectStore(storeName));
|
|
351
316
|
const getReadwriteObjectStore = (storeName) => wrapObjectStore(database.transaction(storeName, "readwrite").objectStore(storeName));
|
|
@@ -366,14 +331,12 @@ const wrapDatabase = (database) => {
|
|
|
366
331
|
transaction
|
|
367
332
|
};
|
|
368
333
|
};
|
|
369
|
-
|
|
370
|
-
//#region src/services/indexedDb/wrapUpgradeDatabase.ts
|
|
334
|
+
// src/services/indexedDb/wrapUpgradeDatabase.ts
|
|
371
335
|
const wrapUpgradeDatabase = (database) => ({
|
|
372
336
|
...wrapDatabase(database),
|
|
373
337
|
createObjectStore: (name, options) => wrapObjectStore(database.createObjectStore(name, options))
|
|
374
338
|
});
|
|
375
|
-
|
|
376
|
-
//#region src/services/indexedDb/wrapUpgradeTransaction.ts
|
|
339
|
+
// src/services/indexedDb/wrapUpgradeTransaction.ts
|
|
377
340
|
const wrapUpgradeTransaction = (transaction) => {
|
|
378
341
|
const done = getTransactionDone(transaction);
|
|
379
342
|
getResultAsync(() => done).match(noop, (error) => {
|
|
@@ -386,8 +349,7 @@ const wrapUpgradeTransaction = (transaction) => {
|
|
|
386
349
|
objectStore: getTransactionObjectStore(transaction)
|
|
387
350
|
};
|
|
388
351
|
};
|
|
389
|
-
|
|
390
|
-
//#region src/services/indexedDb/openDatabase.ts
|
|
352
|
+
// src/services/indexedDb/openDatabase.ts
|
|
391
353
|
const openDatabase = (name, version, options = {}) => new Promise((resolve, reject) => {
|
|
392
354
|
const request = indexedDB.open(name, version);
|
|
393
355
|
request.addEventListener("blocked", (event) => {
|
|
@@ -415,36 +377,30 @@ const openDatabase = (name, version, options = {}) => new Promise((resolve, reje
|
|
|
415
377
|
reject(getRequestError(request));
|
|
416
378
|
});
|
|
417
379
|
});
|
|
418
|
-
|
|
419
|
-
//#region src/services/jsonPatch/constants.ts
|
|
380
|
+
// src/services/jsonPatch/constants.ts
|
|
420
381
|
const APPEND_SEGMENT = "-";
|
|
421
382
|
const JSON_POINTER_REGEX = /^(?:\/(?:[^/~]|~[01])*)*$/u;
|
|
422
|
-
|
|
423
|
-
//#region src/services/jsonPatch/parseArrayIndex.ts
|
|
383
|
+
// src/services/jsonPatch/parseArrayIndex.ts
|
|
424
384
|
const ARRAY_INDEX_REGEX = /^(?:0|[1-9]\d*)$/u;
|
|
425
385
|
const parseArrayIndex = (segment, maxIndex) => {
|
|
426
386
|
const index = Number(segment);
|
|
427
387
|
return ARRAY_INDEX_REGEX.test(segment) && index <= maxIndex ? index : void 0;
|
|
428
388
|
};
|
|
429
|
-
|
|
430
|
-
//#region src/services/jsonPatch/parseJsonPointer.ts
|
|
389
|
+
// src/services/jsonPatch/parseJsonPointer.ts
|
|
431
390
|
const parseJsonPointer = (pointer) => {
|
|
432
391
|
if (pointer === "") return [];
|
|
433
392
|
else if (!JSON_POINTER_REGEX.test(pointer)) throw new InvalidOperationError("Read", pointer, "not a JSON Pointer");
|
|
434
393
|
return pointer.slice(1).split("/").map((segment) => segment.replaceAll("~1", "/").replaceAll("~0", "~"));
|
|
435
394
|
};
|
|
436
|
-
|
|
437
|
-
//#region src/services/jsonPatch/toJsonPointer.ts
|
|
395
|
+
// src/services/jsonPatch/toJsonPointer.ts
|
|
438
396
|
const toJsonPointer = (segments) => segments.map((segment) => `/${segment.replaceAll("~", "~0").replaceAll("/", "~1")}`).join("");
|
|
439
|
-
|
|
440
|
-
//#region src/util/object/checkIsPlainObject.ts
|
|
397
|
+
// src/util/object/checkIsPlainObject.ts
|
|
441
398
|
const checkIsPlainObject = (data) => {
|
|
442
399
|
if (typeof data !== "object" || data === null) return false;
|
|
443
400
|
const prototype = Object.getPrototypeOf(data);
|
|
444
401
|
return prototype === null || prototype === Object.prototype;
|
|
445
402
|
};
|
|
446
|
-
|
|
447
|
-
//#region src/services/jsonPatch/readJsonValue.ts
|
|
403
|
+
// src/services/jsonPatch/readJsonValue.ts
|
|
448
404
|
const readJsonValue = (document, segments) => {
|
|
449
405
|
let value = document;
|
|
450
406
|
for (const segment of segments) {
|
|
@@ -455,8 +411,7 @@ const readJsonValue = (document, segments) => {
|
|
|
455
411
|
}
|
|
456
412
|
return value;
|
|
457
413
|
};
|
|
458
|
-
|
|
459
|
-
//#region src/services/jsonPatch/updateJsonValue.ts
|
|
414
|
+
// src/services/jsonPatch/updateJsonValue.ts
|
|
460
415
|
const updateJsonValue = (document, segments, update) => {
|
|
461
416
|
const [segment, ...restSegments] = segments;
|
|
462
417
|
if (segment === void 0) return update(document);
|
|
@@ -468,8 +423,7 @@ const updateJsonValue = (document, segments, update) => {
|
|
|
468
423
|
};
|
|
469
424
|
else throw new InvalidOperationError("Update", toJsonPointer(segments), "no such member");
|
|
470
425
|
};
|
|
471
|
-
|
|
472
|
-
//#region src/services/jsonPatch/addJsonValue.ts
|
|
426
|
+
// src/services/jsonPatch/addJsonValue.ts
|
|
473
427
|
const addJsonValue = (document, path, value) => {
|
|
474
428
|
const segments = parseJsonPointer(path);
|
|
475
429
|
const parentSegments = segments.slice(0, -1);
|
|
@@ -509,8 +463,7 @@ const addJsonValue = (document, path, value) => {
|
|
|
509
463
|
};
|
|
510
464
|
else throw new InvalidOperationError("Update", path, "its parent holds no members");
|
|
511
465
|
};
|
|
512
|
-
|
|
513
|
-
//#region src/services/jsonPatch/removeJsonValue.ts
|
|
466
|
+
// src/services/jsonPatch/removeJsonValue.ts
|
|
514
467
|
const removeJsonValue = (document, path) => {
|
|
515
468
|
const segments = parseJsonPointer(path);
|
|
516
469
|
const parentSegments = segments.slice(0, -1);
|
|
@@ -538,28 +491,23 @@ const removeJsonValue = (document, path) => {
|
|
|
538
491
|
};
|
|
539
492
|
} else throw new InvalidOperationError("Delete", path, "no such member");
|
|
540
493
|
};
|
|
541
|
-
|
|
542
|
-
//#region src/util/object/checkIsCustomMethod.ts
|
|
494
|
+
// src/util/object/checkIsCustomMethod.ts
|
|
543
495
|
const checkIsCustomMethod = (value, methodName) => {
|
|
544
496
|
const method = Reflect.get(value, methodName);
|
|
545
497
|
return typeof method === "function" && method !== Object.prototype[methodName];
|
|
546
498
|
};
|
|
547
|
-
|
|
548
|
-
//#region src/util/object/checkIsSameBytes.ts
|
|
499
|
+
// src/util/object/checkIsSameBytes.ts
|
|
549
500
|
const toBytes = (view) => ArrayBuffer.isView(view) ? new Uint8Array(view.buffer, view.byteOffset, view.byteLength) : new Uint8Array(view);
|
|
550
501
|
const checkIsSameBytes = (first, second) => {
|
|
551
502
|
const firstBytes = toBytes(first);
|
|
552
503
|
const secondBytes = toBytes(second);
|
|
553
504
|
return firstBytes.length === secondBytes.length && firstBytes.every((byte, index) => byte === secondBytes[index]);
|
|
554
505
|
};
|
|
555
|
-
|
|
556
|
-
//#region src/util/object/checkIsSameValueZero.ts
|
|
506
|
+
// src/util/object/checkIsSameValueZero.ts
|
|
557
507
|
const checkIsSameValueZero = (first, second) => first === second || Number.isNaN(first) && Number.isNaN(second);
|
|
558
|
-
|
|
559
|
-
//#region src/util/object/getEnumerableKeys.ts
|
|
508
|
+
// src/util/object/getEnumerableKeys.ts
|
|
560
509
|
const getEnumerableKeys = (value) => Reflect.ownKeys(value).filter((key) => Object.prototype.propertyIsEnumerable.call(value, key));
|
|
561
|
-
|
|
562
|
-
//#region src/util/object/checkIsDeepEqual.ts
|
|
510
|
+
// src/util/object/checkIsDeepEqual.ts
|
|
563
511
|
const checkIsBinary = (value) => ArrayBuffer.isView(value) || value instanceof ArrayBuffer || typeof SharedArrayBuffer !== "undefined" && value instanceof SharedArrayBuffer;
|
|
564
512
|
const checkIsDeepEqual = (first, second) => {
|
|
565
513
|
if (first === second) return true;
|
|
@@ -589,13 +537,11 @@ const checkIsDeepEqual = (first, second) => {
|
|
|
589
537
|
if (firstKeys.length !== getEnumerableKeys(second).length) return false;
|
|
590
538
|
return firstKeys.every((key) => Object.prototype.propertyIsEnumerable.call(second, key) && checkIsDeepEqual(Reflect.get(first, key), Reflect.get(second, key)));
|
|
591
539
|
};
|
|
592
|
-
|
|
593
|
-
//#region src/util/validation/exhaustiveGuard.ts
|
|
540
|
+
// src/util/validation/exhaustiveGuard.ts
|
|
594
541
|
const exhaustiveGuard = (value) => {
|
|
595
542
|
throw new InvalidOperationError("Read", exhaustiveGuard.name, JSON.stringify(value));
|
|
596
543
|
};
|
|
597
|
-
|
|
598
|
-
//#region src/services/jsonPatch/applyPatch.ts
|
|
544
|
+
// src/services/jsonPatch/applyPatch.ts
|
|
599
545
|
const applyPatch = (document, operation) => {
|
|
600
546
|
switch (operation.op) {
|
|
601
547
|
case "add": return addJsonValue(document, operation.path, operation.value);
|
|
@@ -637,8 +583,7 @@ const applyPatch = (document, operation) => {
|
|
|
637
583
|
default: return exhaustiveGuard(operation);
|
|
638
584
|
}
|
|
639
585
|
};
|
|
640
|
-
|
|
641
|
-
//#region src/services/jsonPatch/applyPatches.ts
|
|
586
|
+
// src/services/jsonPatch/applyPatches.ts
|
|
642
587
|
const applyPatches = (document, operations) => {
|
|
643
588
|
let patchedDocument = document;
|
|
644
589
|
const inverseGroups = [];
|
|
@@ -652,8 +597,7 @@ const applyPatches = (document, operations) => {
|
|
|
652
597
|
inverses: inverseGroups.toReversed().flat()
|
|
653
598
|
};
|
|
654
599
|
};
|
|
655
|
-
|
|
656
|
-
//#region src/services/message/constants.ts
|
|
600
|
+
// src/services/message/constants.ts
|
|
657
601
|
const MENTION_ID_ATTRIBUTE = "data-id";
|
|
658
602
|
const MENTION_ITEM_TYPE_ATTRIBUTE = "data-mention-type";
|
|
659
603
|
const MENTION_LABEL_ATTRIBUTE = "data-label";
|
|
@@ -666,11 +610,9 @@ const CUSTOM_EMOJI_ID_ATTRIBUTE = "data-custom-emoji-id";
|
|
|
666
610
|
const CUSTOM_EMOJI_NAME_ATTRIBUTE = "data-custom-emoji-name";
|
|
667
611
|
const SPOILER_ATTRIBUTE = "data-spoiler";
|
|
668
612
|
const SPOILER_SELECTOR = `span[${SPOILER_ATTRIBUTE}]`;
|
|
669
|
-
|
|
670
|
-
//#region src/services/message/getMentions.ts
|
|
613
|
+
// src/services/message/getMentions.ts
|
|
671
614
|
const getMentions = (message) => parse(message).querySelectorAll(MENTION_SELECTOR);
|
|
672
|
-
|
|
673
|
-
//#region src/services/mime/constants.ts
|
|
615
|
+
// src/services/mime/constants.ts
|
|
674
616
|
const MEDIA_TYPE_REGEX = /^\s*(?<mediaType>[^;\s]*)(?:;|\s|$)/u;
|
|
675
617
|
const PATH_SEPARATOR_REGEX = /[/\\]/u;
|
|
676
618
|
const TEXT_MEDIA_TYPE_REGEX = /^text\//iu;
|
|
@@ -696,26 +638,22 @@ const TypeScoreMap = /* @__PURE__ */ new Map([
|
|
|
696
638
|
["video", 3]
|
|
697
639
|
]);
|
|
698
640
|
const DEFAULT_TYPE_SCORE = 0;
|
|
699
|
-
|
|
700
|
-
//#region src/services/mime/getMediaType.ts
|
|
641
|
+
// src/services/mime/getMediaType.ts
|
|
701
642
|
const getMediaType = (value) => MEDIA_TYPE_REGEX.exec(value)?.groups?.mediaType ?? "";
|
|
702
|
-
|
|
703
|
-
//#region src/services/mime/getMimeTypeEntryMap.ts
|
|
643
|
+
// src/services/mime/getMimeTypeEntryMap.ts
|
|
704
644
|
let mimeTypeEntryMap;
|
|
705
645
|
const getMimeTypeEntryMap = () => {
|
|
706
646
|
mimeTypeEntryMap ??= new Map(Object.entries(mimeDatabase));
|
|
707
647
|
return mimeTypeEntryMap;
|
|
708
648
|
};
|
|
709
|
-
|
|
710
|
-
//#region src/services/mime/charset.ts
|
|
649
|
+
// src/services/mime/charset.ts
|
|
711
650
|
const charset = (type) => {
|
|
712
651
|
const mediaType = getMediaType(type);
|
|
713
652
|
const dataCharset = getMimeTypeEntryMap().get(mediaType.toLowerCase())?.charset;
|
|
714
653
|
if (dataCharset) return dataCharset;
|
|
715
654
|
return TEXT_MEDIA_TYPE_REGEX.test(mediaType) ? DEFAULT_TEXT_CHARSET : false;
|
|
716
655
|
};
|
|
717
|
-
|
|
718
|
-
//#region src/services/mime/getMimeScore.ts
|
|
656
|
+
// src/services/mime/getMimeScore.ts
|
|
719
657
|
const getMimeScore = (mimeType, source = "") => {
|
|
720
658
|
if (mimeType === "application/octet-stream") return 0;
|
|
721
659
|
const [type = "", subtype = ""] = mimeType.split("/");
|
|
@@ -726,8 +664,7 @@ const getMimeScore = (mimeType, source = "") => {
|
|
|
726
664
|
const lengthScore = 1 - mimeType.length / 100;
|
|
727
665
|
return facetScore + sourceScore + typeScore + lengthScore;
|
|
728
666
|
};
|
|
729
|
-
|
|
730
|
-
//#region src/services/mime/getExtensionMimeTypeMap.ts
|
|
667
|
+
// src/services/mime/getExtensionMimeTypeMap.ts
|
|
731
668
|
let extensionMimeTypeMap;
|
|
732
669
|
const getPreferredMimeType = (currentMimeType, candidateMimeType) => {
|
|
733
670
|
if (currentMimeType === void 0) return candidateMimeType;
|
|
@@ -742,8 +679,7 @@ const getExtensionMimeTypeMap = () => {
|
|
|
742
679
|
}
|
|
743
680
|
return extensionMimeTypeMap;
|
|
744
681
|
};
|
|
745
|
-
|
|
746
|
-
//#region src/services/mime/lookup.ts
|
|
682
|
+
// src/services/mime/lookup.ts
|
|
747
683
|
const getExtension = (path) => {
|
|
748
684
|
const name = path.split(PATH_SEPARATOR_REGEX).at(-1) ?? "";
|
|
749
685
|
const dotIndex = name.lastIndexOf(".");
|
|
@@ -755,8 +691,7 @@ const lookup = (path) => {
|
|
|
755
691
|
if (!extension) return false;
|
|
756
692
|
return getExtensionMimeTypeMap().get(extension) ?? false;
|
|
757
693
|
};
|
|
758
|
-
|
|
759
|
-
//#region src/services/mime/contentType.ts
|
|
694
|
+
// src/services/mime/contentType.ts
|
|
760
695
|
const contentType = (value) => {
|
|
761
696
|
const mediaType = value.includes("/") ? value : lookup(value);
|
|
762
697
|
if (!mediaType) return false;
|
|
@@ -764,17 +699,13 @@ const contentType = (value) => {
|
|
|
764
699
|
const mediaCharset = charset(mediaType);
|
|
765
700
|
return mediaCharset ? `${mediaType}; charset=${mediaCharset.toLowerCase()}` : mediaType;
|
|
766
701
|
};
|
|
767
|
-
|
|
768
|
-
//#region src/services/mime/extension.ts
|
|
702
|
+
// src/services/mime/extension.ts
|
|
769
703
|
const extension = (type) => getMimeTypeEntryMap().get(getMediaType(type).toLowerCase())?.extensions?.[0] ?? false;
|
|
770
|
-
|
|
771
|
-
//#region src/services/prettier/css.ts
|
|
704
|
+
// src/services/prettier/css.ts
|
|
772
705
|
const css = String.raw;
|
|
773
|
-
|
|
774
|
-
//#region src/services/prettier/html.ts
|
|
706
|
+
// src/services/prettier/html.ts
|
|
775
707
|
const html = String.raw;
|
|
776
|
-
|
|
777
|
-
//#region src/services/profanity/englishProfaneWords.ts
|
|
708
|
+
// src/services/profanity/englishProfaneWords.ts
|
|
778
709
|
const englishProfaneWords = [
|
|
779
710
|
"4r5e",
|
|
780
711
|
"5h1t",
|
|
@@ -1226,8 +1157,7 @@ const englishProfaneWords = [
|
|
|
1226
1157
|
"willies",
|
|
1227
1158
|
"willy"
|
|
1228
1159
|
];
|
|
1229
|
-
|
|
1230
|
-
//#region src/services/profanity/checkContainsProfanity.ts
|
|
1160
|
+
// src/services/profanity/checkContainsProfanity.ts
|
|
1231
1161
|
const WORD_CHARACTER_CLASS = String.raw`\p{L}\p{N}\p{M}`;
|
|
1232
1162
|
const PROFANE_WORD_ALTERNATION = englishProfaneWords.map((word) => word.replaceAll(/[.*+?^${}()|[\]\\]/gu, String.raw`\$&`)).join("|");
|
|
1233
1163
|
const WHOLE_WORD_PROFANITY_REGEX = new RegExp(`(?<![${WORD_CHARACTER_CLASS}])(?:${PROFANE_WORD_ALTERNATION})(?![${WORD_CHARACTER_CLASS}])`, "iu");
|
|
@@ -1236,11 +1166,9 @@ const checkContainsProfanity = (text, { isWholeWord = true } = {}) => {
|
|
|
1236
1166
|
if (typeof text !== "string") return false;
|
|
1237
1167
|
return (isWholeWord ? WHOLE_WORD_PROFANITY_REGEX : SUBSTRING_PROFANITY_REGEX).test(text);
|
|
1238
1168
|
};
|
|
1239
|
-
|
|
1240
|
-
//#region src/services/sanitizeHtml/checkIsWhitespaceCharacter.ts
|
|
1169
|
+
// src/services/sanitizeHtml/checkIsWhitespaceCharacter.ts
|
|
1241
1170
|
const checkIsWhitespaceCharacter = (character) => character.trim() === "";
|
|
1242
|
-
|
|
1243
|
-
//#region src/services/sanitizeHtml/checkIsUnsafeUrlCharacter.ts
|
|
1171
|
+
// src/services/sanitizeHtml/checkIsUnsafeUrlCharacter.ts
|
|
1244
1172
|
const FIRST_PRINTABLE_CODE_POINT = 32;
|
|
1245
1173
|
const DELETE_CODE_POINT = 127;
|
|
1246
1174
|
const LAST_C1_CONTROL_CODE_POINT = 159;
|
|
@@ -1249,13 +1177,11 @@ const checkIsUnsafeUrlCharacter = (character) => {
|
|
|
1249
1177
|
const codePoint = character.codePointAt(0) ?? 0;
|
|
1250
1178
|
return checkIsWhitespaceCharacter(character) || codePoint < FIRST_PRINTABLE_CODE_POINT || codePoint >= DELETE_CODE_POINT && codePoint <= LAST_C1_CONTROL_CODE_POINT || character === GRAVE_ACCENT;
|
|
1251
1179
|
};
|
|
1252
|
-
|
|
1253
|
-
//#region src/util/array/takeOne.ts
|
|
1180
|
+
// src/util/array/takeOne.ts
|
|
1254
1181
|
const takeOne = (values, index = 0) => {
|
|
1255
1182
|
return values[index];
|
|
1256
1183
|
};
|
|
1257
|
-
|
|
1258
|
-
//#region src/services/sanitizeHtml/checkIsAllowedUrl.ts
|
|
1184
|
+
// src/services/sanitizeHtml/checkIsAllowedUrl.ts
|
|
1259
1185
|
const PATH_DELIMITER_REGEX = /[/?#]/u;
|
|
1260
1186
|
const NON_SCHEME_CHARACTERS_REGEX = /[^a-z\d+.-]/giu;
|
|
1261
1187
|
const SCHEME_SEPARATOR = ":";
|
|
@@ -1267,8 +1193,7 @@ const checkIsAllowedUrl = (url, allowedSchemes) => {
|
|
|
1267
1193
|
const scheme = beforePath.slice(0, separatorIndex).replaceAll(NON_SCHEME_CHARACTERS_REGEX, "").toLowerCase();
|
|
1268
1194
|
return allowedSchemes.includes(scheme);
|
|
1269
1195
|
};
|
|
1270
|
-
|
|
1271
|
-
//#region src/services/sanitizeHtml/constants.ts
|
|
1196
|
+
// src/services/sanitizeHtml/constants.ts
|
|
1272
1197
|
const HTML_NAMESPACE = html$1.NS.HTML;
|
|
1273
1198
|
const DEFAULT_ALLOWED_TAGS = [
|
|
1274
1199
|
"address",
|
|
@@ -1403,22 +1328,18 @@ const SRCSET_DESCRIPTOR_REGEX = /^(?:\d+w|\d*\.?\d+x|\d+h)$/u;
|
|
|
1403
1328
|
const ESCAPED_TEXT_CHARACTERS_REGEX = /[&<>]/gu;
|
|
1404
1329
|
const ESCAPED_ATTRIBUTE_CHARACTERS_REGEX = /[&"<>]/gu;
|
|
1405
1330
|
const SANITIZER_ADVISORY_WATCH_SINCE = "2026-10-21";
|
|
1406
|
-
|
|
1407
|
-
//#region src/services/sanitizeHtml/getChildNodes.ts
|
|
1331
|
+
// src/services/sanitizeHtml/getChildNodes.ts
|
|
1408
1332
|
const getChildNodes = (element) => "content" in element ? element.content.childNodes : element.childNodes;
|
|
1409
|
-
|
|
1410
|
-
//#region src/services/sanitizeHtml/collectText.ts
|
|
1333
|
+
// src/services/sanitizeHtml/collectText.ts
|
|
1411
1334
|
const collectText = (nodes, depth) => depth > 256 ? "" : nodes.map((node) => {
|
|
1412
1335
|
if ("value" in node) return node.value;
|
|
1413
1336
|
if (!("tagName" in node) || NON_TEXT_TAGS.includes(node.tagName)) return "";
|
|
1414
1337
|
return collectText(getChildNodes(node), depth + 1);
|
|
1415
1338
|
}).join("");
|
|
1416
|
-
|
|
1417
|
-
//#region src/services/sanitizeHtml/escapeCharacters.ts
|
|
1339
|
+
// src/services/sanitizeHtml/escapeCharacters.ts
|
|
1418
1340
|
const NON_BREAKING_SPACE = String.fromCodePoint(160);
|
|
1419
1341
|
const escapeCharacters = (value, charactersRegex, entities) => value.replace(charactersRegex, (character) => entities[character] ?? character).replaceAll(NON_BREAKING_SPACE, " ");
|
|
1420
|
-
|
|
1421
|
-
//#region src/services/sanitizeHtml/escapeAttribute.ts
|
|
1342
|
+
// src/services/sanitizeHtml/escapeAttribute.ts
|
|
1422
1343
|
const ESCAPED_ATTRIBUTE_CHARACTERS = {
|
|
1423
1344
|
"\"": """,
|
|
1424
1345
|
"&": "&",
|
|
@@ -1426,26 +1347,22 @@ const ESCAPED_ATTRIBUTE_CHARACTERS = {
|
|
|
1426
1347
|
">": ">"
|
|
1427
1348
|
};
|
|
1428
1349
|
const escapeAttribute = (value) => escapeCharacters(value, ESCAPED_ATTRIBUTE_CHARACTERS_REGEX, ESCAPED_ATTRIBUTE_CHARACTERS);
|
|
1429
|
-
|
|
1430
|
-
//#region src/services/sanitizeHtml/escapeText.ts
|
|
1350
|
+
// src/services/sanitizeHtml/escapeText.ts
|
|
1431
1351
|
const ESCAPED_TEXT_CHARACTERS = {
|
|
1432
1352
|
"&": "&",
|
|
1433
1353
|
"<": "<",
|
|
1434
1354
|
">": ">"
|
|
1435
1355
|
};
|
|
1436
1356
|
const escapeText = (text) => escapeCharacters(text, ESCAPED_TEXT_CHARACTERS_REGEX, ESCAPED_TEXT_CHARACTERS);
|
|
1437
|
-
|
|
1438
|
-
//#region src/services/sanitizeHtml/matchesClassPattern.ts
|
|
1357
|
+
// src/services/sanitizeHtml/matchesClassPattern.ts
|
|
1439
1358
|
const matchesClassPattern = (className, pattern) => pattern.endsWith("*") ? className.startsWith(pattern.slice(0, -1)) : className === pattern;
|
|
1440
|
-
|
|
1441
|
-
//#region src/services/sanitizeHtml/filterClasses.ts
|
|
1359
|
+
// src/services/sanitizeHtml/filterClasses.ts
|
|
1442
1360
|
const filterClasses = (value, patterns) => {
|
|
1443
1361
|
if (!patterns) return void 0;
|
|
1444
1362
|
const classNames = value.split(/\s+/u).filter((className) => className && patterns.some((pattern) => matchesClassPattern(className, pattern)));
|
|
1445
1363
|
return classNames.length > 0 ? classNames.join(" ") : void 0;
|
|
1446
1364
|
};
|
|
1447
|
-
|
|
1448
|
-
//#region src/services/sanitizeHtml/filterSrcset.ts
|
|
1365
|
+
// src/services/sanitizeHtml/filterSrcset.ts
|
|
1449
1366
|
const COMMA = ",";
|
|
1450
1367
|
const OPENING_PARENTHESIS = "(";
|
|
1451
1368
|
const CLOSING_PARENTHESIS = ")";
|
|
@@ -1477,8 +1394,7 @@ const filterSrcset = (value, allowedSchemes) => {
|
|
|
1477
1394
|
}
|
|
1478
1395
|
return candidates.length > 0 ? candidates.join(", ") : void 0;
|
|
1479
1396
|
};
|
|
1480
|
-
|
|
1481
|
-
//#region src/services/sanitizeHtml/filterStyle.ts
|
|
1397
|
+
// src/services/sanitizeHtml/filterStyle.ts
|
|
1482
1398
|
const DECLARATION_SEPARATOR = ";";
|
|
1483
1399
|
const PROPERTY_SEPARATOR = ":";
|
|
1484
1400
|
const IMPORTANT_SUFFIX = "!important";
|
|
@@ -1503,8 +1419,7 @@ const filterStyle = (value, rules) => {
|
|
|
1503
1419
|
if (declarations.size === 0) return void 0;
|
|
1504
1420
|
return Array.from(declarations, ([property, { important, propertyValue }]) => `${property}${PROPERTY_SEPARATOR}${propertyValue}${important ? IMPORTANT_SUFFIX : ""}`).join(DECLARATION_SEPARATOR);
|
|
1505
1421
|
};
|
|
1506
|
-
|
|
1507
|
-
//#region src/services/sanitizeHtml/filterAttributes.ts
|
|
1422
|
+
// src/services/sanitizeHtml/filterAttributes.ts
|
|
1508
1423
|
const getTagPolicy = (tagPolicies, tagName) => Object.hasOwn(tagPolicies, tagName) ? tagPolicies[tagName] : void 0;
|
|
1509
1424
|
const checkIsMetaRefresh = (tagName, attributes) => tagName === "meta" && attributes["http-equiv"]?.trim().toLowerCase() === "refresh";
|
|
1510
1425
|
const filterAttributes = (element, policy) => {
|
|
@@ -1530,8 +1445,7 @@ const filterValue = (tagName, name, value, policy) => {
|
|
|
1530
1445
|
if (URL_ATTRIBUTES.includes(name)) return checkIsAllowedUrl(value, policy.allowedSchemes) ? value : void 0;
|
|
1531
1446
|
return value;
|
|
1532
1447
|
};
|
|
1533
|
-
|
|
1534
|
-
//#region src/services/sanitizeHtml/renderNode.ts
|
|
1448
|
+
// src/services/sanitizeHtml/renderNode.ts
|
|
1535
1449
|
const renderNode = (node, policy, depth) => {
|
|
1536
1450
|
if (node.nodeName === "#text") return escapeText(node.value);
|
|
1537
1451
|
if (!("tagName" in node) || depth > 256) return "";
|
|
@@ -1542,16 +1456,14 @@ const renderNode = (node, policy, depth) => {
|
|
|
1542
1456
|
const opening = `<${element.tagName}${attributes}>`;
|
|
1543
1457
|
return VOID_TAGS.includes(element.tagName) ? opening : `${opening}${children}</${element.tagName}>`;
|
|
1544
1458
|
};
|
|
1545
|
-
|
|
1546
|
-
//#region src/services/sanitizeHtml/filterHtml.ts
|
|
1459
|
+
// src/services/sanitizeHtml/filterHtml.ts
|
|
1547
1460
|
const filterHtml = (html, policy) => {
|
|
1548
1461
|
const context = defaultTreeAdapter.createElement("body", HTML_NAMESPACE, []);
|
|
1549
1462
|
const childNodes = parseFragment(context, html, {}).childNodes;
|
|
1550
1463
|
const output = childNodes.map((node) => renderNode(node, policy, 0)).join("");
|
|
1551
1464
|
return parseFragment(context, output, {}).childNodes.map((node) => renderNode(node, policy, 0)).join("") === output ? output : escapeText(collectText(childNodes, 0));
|
|
1552
1465
|
};
|
|
1553
|
-
|
|
1554
|
-
//#region src/services/sanitizeHtml/sanitizeHtml.ts
|
|
1466
|
+
// src/services/sanitizeHtml/sanitizeHtml.ts
|
|
1555
1467
|
const appendStyle = (style, declarations) => style ? `${style}; ${declarations}` : declarations;
|
|
1556
1468
|
const transformCellAlign = ({ align, ...attributes }) => align ? {
|
|
1557
1469
|
...attributes,
|
|
@@ -1603,8 +1515,7 @@ const sanitizeHtml = (html, options) => filterHtml(html, {
|
|
|
1603
1515
|
th: transformCellAlign
|
|
1604
1516
|
}
|
|
1605
1517
|
});
|
|
1606
|
-
|
|
1607
|
-
//#region src/services/sanitizeHtml/sanitizeTextHtml.ts
|
|
1518
|
+
// src/services/sanitizeHtml/sanitizeTextHtml.ts
|
|
1608
1519
|
const COLOR_REGEXES = [
|
|
1609
1520
|
/^#[\da-fA-F]{3,8}$/u,
|
|
1610
1521
|
/^rgba?\(\d{1,3},\s*\d{1,3},\s*\d{1,3}(?:,\s*[\d.]+)?\)$/u,
|
|
@@ -1651,39 +1562,31 @@ const sanitizeTextHtml = (html) => sanitizeHtml(html, {
|
|
|
1651
1562
|
type: "checkbox"
|
|
1652
1563
|
}) }
|
|
1653
1564
|
});
|
|
1654
|
-
|
|
1655
|
-
//#region src/services/shared/applyItemMetadataMixin.ts
|
|
1565
|
+
// src/services/shared/applyItemMetadataMixin.ts
|
|
1656
1566
|
const applyItemMetadataMixin = (Base) => class ItemWithMetadata extends Base {
|
|
1657
1567
|
createdAt = /* @__PURE__ */ new Date();
|
|
1658
1568
|
deletedAt = null;
|
|
1659
1569
|
updatedAt = /* @__PURE__ */ new Date();
|
|
1660
1570
|
};
|
|
1661
|
-
|
|
1662
|
-
//#region src/util/text/normalizeString.ts
|
|
1571
|
+
// src/util/text/normalizeString.ts
|
|
1663
1572
|
const normalizeString = (value) => value?.trim() ?? "";
|
|
1664
|
-
|
|
1665
|
-
//#region src/services/zod/createNormalizedStringSchema.ts
|
|
1573
|
+
// src/services/zod/createNormalizedStringSchema.ts
|
|
1666
1574
|
const createNormalizedStringSchema = (maxLength, schema = z.string()) => schema.transform(normalizeString).pipe(z.string().max(maxLength));
|
|
1667
|
-
|
|
1668
|
-
//#region src/util/id/constants.ts
|
|
1575
|
+
// src/util/id/constants.ts
|
|
1669
1576
|
const ID_SEPARATOR = "|";
|
|
1670
|
-
|
|
1671
|
-
//#region src/services/zod/createUniqueArraySchema.ts
|
|
1577
|
+
// src/services/zod/createUniqueArraySchema.ts
|
|
1672
1578
|
const getItemKey = (item, key) => {
|
|
1673
1579
|
const record = item;
|
|
1674
1580
|
return typeof key === "string" ? record[key] : key.map((part) => record[part]).join("|");
|
|
1675
1581
|
};
|
|
1676
1582
|
const createUniqueArraySchema = (schema, key) => schema.array().refine((array) => new Set(key === void 0 ? array : array.map((item) => getItemKey(item, key))).size === array.length, { error: "Array items must be unique" });
|
|
1677
|
-
|
|
1678
|
-
//#region src/services/zstd/constants.ts
|
|
1583
|
+
// src/services/zstd/constants.ts
|
|
1679
1584
|
const DEFAULT_COMPRESSION_LEVEL = 12;
|
|
1680
1585
|
const MIN_WINDOW_LOG = 10;
|
|
1681
1586
|
const MAX_WINDOW_LOG = 27;
|
|
1682
|
-
|
|
1683
|
-
//#region src/services/zstd/getWindowLog.ts
|
|
1587
|
+
// src/services/zstd/getWindowLog.ts
|
|
1684
1588
|
const getWindowLog = (dictionaryByteCount, inputByteCount) => Math.min(27, Math.max(10, Math.ceil(Math.log2(dictionaryByteCount + inputByteCount + 1))));
|
|
1685
|
-
|
|
1686
|
-
//#region src/test/constants.ts
|
|
1589
|
+
// src/test/constants.ts
|
|
1687
1590
|
const ALL_SPECIAL_VALUES = [
|
|
1688
1591
|
{
|
|
1689
1592
|
isPlainObject: true,
|
|
@@ -1730,15 +1633,13 @@ const ALL_SPECIAL_VALUES = [
|
|
|
1730
1633
|
value: /(?:)/u
|
|
1731
1634
|
}
|
|
1732
1635
|
];
|
|
1733
|
-
|
|
1734
|
-
//#region src/util/array/chunk.ts
|
|
1636
|
+
// src/util/array/chunk.ts
|
|
1735
1637
|
const chunk = (array, size) => {
|
|
1736
1638
|
const chunks = [];
|
|
1737
1639
|
for (let index = 0; index < array.length; index += size) chunks.push(array.slice(index, index + size));
|
|
1738
1640
|
return chunks;
|
|
1739
1641
|
};
|
|
1740
|
-
|
|
1741
|
-
//#region src/util/array/chunkBySerializedSize.ts
|
|
1642
|
+
// src/util/array/chunkBySerializedSize.ts
|
|
1742
1643
|
const ARRAY_SERIALIZATION_BYTES = 1;
|
|
1743
1644
|
const chunkBySerializedSize = (items, maxBytes, maxCount) => {
|
|
1744
1645
|
const textEncoder = new TextEncoder();
|
|
@@ -1758,17 +1659,13 @@ const chunkBySerializedSize = (items, maxBytes, maxCount) => {
|
|
|
1758
1659
|
if (currentChunk.length > 0) chunks.push(currentChunk);
|
|
1759
1660
|
return chunks;
|
|
1760
1661
|
};
|
|
1761
|
-
|
|
1762
|
-
//#region src/util/array/takeRandom.ts
|
|
1662
|
+
// src/util/array/takeRandom.ts
|
|
1763
1663
|
const takeRandom = (values, random) => takeOne(values, Math.floor(random() * values.length));
|
|
1764
|
-
|
|
1765
|
-
//#region src/util/date/getZonedDateTime.ts
|
|
1664
|
+
// src/util/date/getZonedDateTime.ts
|
|
1766
1665
|
const getZonedDateTime = (date) => Temporal.Instant.fromEpochMilliseconds(date.getTime()).toZonedDateTimeISO(Temporal.Now.timeZoneId());
|
|
1767
|
-
|
|
1768
|
-
//#region src/util/date/getEndOfDay.ts
|
|
1666
|
+
// src/util/date/getEndOfDay.ts
|
|
1769
1667
|
const getEndOfDay = (date) => /* @__PURE__ */ new Date(getZonedDateTime(date).startOfDay().add({ days: 1 }).epochMilliseconds - 1);
|
|
1770
|
-
|
|
1771
|
-
//#region src/util/dom/checkIsNestedControl.ts
|
|
1668
|
+
// src/util/dom/checkIsNestedControl.ts
|
|
1772
1669
|
const NESTED_INTERACTION_SELECTOR = [
|
|
1773
1670
|
"a[href]",
|
|
1774
1671
|
"button",
|
|
@@ -1798,19 +1695,16 @@ const checkIsNestedControl = (event) => {
|
|
|
1798
1695
|
const interactiveElement = target.closest(NESTED_INTERACTION_SELECTOR);
|
|
1799
1696
|
return Boolean(interactiveElement && interactiveElement !== currentTarget && currentTarget.contains(interactiveElement));
|
|
1800
1697
|
};
|
|
1801
|
-
|
|
1802
|
-
//#region src/util/dom/checkIsNestedInteraction.ts
|
|
1698
|
+
// src/util/dom/checkIsNestedInteraction.ts
|
|
1803
1699
|
const checkIsNestedInteraction = (event) => checkIsNestedControl(event) || Boolean(window.getSelection()?.toString());
|
|
1804
|
-
|
|
1805
|
-
//#region src/util/dom/downloadUrl.ts
|
|
1700
|
+
// src/util/dom/downloadUrl.ts
|
|
1806
1701
|
const downloadUrl = (url, filename) => {
|
|
1807
1702
|
const anchor = window.document.createElement("a");
|
|
1808
1703
|
anchor.href = url;
|
|
1809
1704
|
anchor.download = filename;
|
|
1810
1705
|
anchor.click();
|
|
1811
1706
|
};
|
|
1812
|
-
|
|
1813
|
-
//#region src/util/dom/downloadFile.ts
|
|
1707
|
+
// src/util/dom/downloadFile.ts
|
|
1814
1708
|
const downloadFile = (filename, blobPart, type) => {
|
|
1815
1709
|
const url = URL.createObjectURL(new Blob([blobPart], { type }));
|
|
1816
1710
|
downloadUrl(url, filename);
|
|
@@ -1818,11 +1712,9 @@ const downloadFile = (filename, blobPart, type) => {
|
|
|
1818
1712
|
URL.revokeObjectURL(url);
|
|
1819
1713
|
}, 0);
|
|
1820
1714
|
};
|
|
1821
|
-
|
|
1822
|
-
//#region src/util/environment/checkIsServer.ts
|
|
1715
|
+
// src/util/environment/checkIsServer.ts
|
|
1823
1716
|
const checkIsServer = () => typeof window === "undefined";
|
|
1824
|
-
|
|
1825
|
-
//#region src/util/function/getSynchronizedFunction.ts
|
|
1717
|
+
// src/util/function/getSynchronizedFunction.ts
|
|
1826
1718
|
const pendingPromises = /* @__PURE__ */ new Set();
|
|
1827
1719
|
const getSynchronizedFunction = (asyncFunction) => (...args) => {
|
|
1828
1720
|
const promise = asyncFunction(...args).finally(() => {
|
|
@@ -1833,19 +1725,16 @@ const getSynchronizedFunction = (asyncFunction) => (...args) => {
|
|
|
1833
1725
|
const waitForSynchronizedFunctions = async () => {
|
|
1834
1726
|
await Promise.allSettled(pendingPromises);
|
|
1835
1727
|
};
|
|
1836
|
-
|
|
1837
|
-
//#region src/util/id/uuid/constants.ts
|
|
1728
|
+
// src/util/id/uuid/constants.ts
|
|
1838
1729
|
const UUIDV4_REGEX = /^[0-9A-F]{8}-[0-9A-F]{4}-[4][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/iu;
|
|
1839
|
-
|
|
1840
|
-
//#region src/util/map/getOrCreate.ts
|
|
1730
|
+
// src/util/map/getOrCreate.ts
|
|
1841
1731
|
const getOrCreate = (map, key, create) => {
|
|
1842
1732
|
if (map.has(key)) return map.get(key);
|
|
1843
1733
|
const value = create();
|
|
1844
1734
|
map.set(key, value);
|
|
1845
1735
|
return value;
|
|
1846
1736
|
};
|
|
1847
|
-
|
|
1848
|
-
//#region src/util/object/clonePlainDeep.ts
|
|
1737
|
+
// src/util/object/clonePlainDeep.ts
|
|
1849
1738
|
const clone = (data, copies) => {
|
|
1850
1739
|
if (!Array.isArray(data) && !checkIsPlainObject(data)) return data;
|
|
1851
1740
|
else if (copies.has(data)) return copies.get(data);
|
|
@@ -1862,11 +1751,9 @@ const clone = (data, copies) => {
|
|
|
1862
1751
|
}
|
|
1863
1752
|
};
|
|
1864
1753
|
const clonePlainDeep = (data) => clone(data, /* @__PURE__ */ new WeakMap());
|
|
1865
|
-
|
|
1866
|
-
//#region src/util/object/getPropertyNames.ts
|
|
1754
|
+
// src/util/object/getPropertyNames.ts
|
|
1867
1755
|
const getPropertyNames = () => new Proxy({}, { get: (_target, property) => property });
|
|
1868
|
-
|
|
1869
|
-
//#region src/util/object/jsonDateParse.ts
|
|
1756
|
+
// src/util/object/jsonDateParse.ts
|
|
1870
1757
|
const ISO_DATE_REGEX = /^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})T(?<hours>\d{2}):(?<minutes>\d{2}):(?<seconds>\d{2}(?:\.{0,1}\d*))(?:Z|(?<sign>\+|-)(?<offset>[\d|:]*))?$/u;
|
|
1871
1758
|
const MS_AJAX_DATE_REGEX = /^\/Date\((?<timestamp>-?\d+(?:[-+]\d+)?)\)[/\\]$/u;
|
|
1872
1759
|
const jsonDateParse = (text) => JSON.parse(text, (_key, value) => {
|
|
@@ -1877,11 +1764,9 @@ const jsonDateParse = (text) => JSON.parse(text, (_key, value) => {
|
|
|
1877
1764
|
const timestampParts = takeOne(msAjaxDateMatch, 1).split(/[-+,.]/u);
|
|
1878
1765
|
return new Date(timestampParts[0] ? Number(timestampParts[0]) : 0 - Number(timestampParts[1]));
|
|
1879
1766
|
});
|
|
1880
|
-
|
|
1881
|
-
//#region src/util/object/mergeObjectsStrict.ts
|
|
1767
|
+
// src/util/object/mergeObjectsStrict.ts
|
|
1882
1768
|
const mergeObjectsStrict = (...objects) => Object.assign({}, ...objects);
|
|
1883
|
-
|
|
1884
|
-
//#region src/util/object/omitDeep.ts
|
|
1769
|
+
// src/util/object/omitDeep.ts
|
|
1885
1770
|
const checkIsWalkable = (value) => Object.prototype.toString.call(value) === "[object Object]";
|
|
1886
1771
|
const omitValue = (value, omittedKeys) => {
|
|
1887
1772
|
if (Array.isArray(value)) return value.map((element) => omitValue(element, omittedKeys));
|
|
@@ -1891,8 +1776,7 @@ const omitValue = (value, omittedKeys) => {
|
|
|
1891
1776
|
return omittedValue;
|
|
1892
1777
|
};
|
|
1893
1778
|
const omitDeep = (value, ...keys) => omitValue(value, new Set(keys));
|
|
1894
|
-
|
|
1895
|
-
//#region src/util/promise/createEvictingPromiseCache.ts
|
|
1779
|
+
// src/util/promise/createEvictingPromiseCache.ts
|
|
1896
1780
|
const createEvictingPromiseCache = (getKey, load) => {
|
|
1897
1781
|
const promiseMap = /* @__PURE__ */ new Map();
|
|
1898
1782
|
return (...args) => {
|
|
@@ -1905,8 +1789,7 @@ const createEvictingPromiseCache = (getKey, load) => {
|
|
|
1905
1789
|
});
|
|
1906
1790
|
};
|
|
1907
1791
|
};
|
|
1908
|
-
|
|
1909
|
-
//#region src/util/promise/settleAll.ts
|
|
1792
|
+
// src/util/promise/settleAll.ts
|
|
1910
1793
|
const settleAll = async (tasks, concurrencyLimit = tasks.length) => {
|
|
1911
1794
|
if (tasks.length === 0) return [];
|
|
1912
1795
|
const values = [];
|
|
@@ -1920,11 +1803,9 @@ const settleAll = async (tasks, concurrencyLimit = tasks.length) => {
|
|
|
1920
1803
|
}
|
|
1921
1804
|
return values;
|
|
1922
1805
|
};
|
|
1923
|
-
|
|
1924
|
-
//#region src/util/text/capitalize.ts
|
|
1806
|
+
// src/util/text/capitalize.ts
|
|
1925
1807
|
const capitalize = (string) => `${string.charAt(0).toUpperCase()}${string.slice(1)}`;
|
|
1926
|
-
|
|
1927
|
-
//#region src/util/text/dedent.ts
|
|
1808
|
+
// src/util/text/dedent.ts
|
|
1928
1809
|
const ESCAPE_CHARACTER = "\\";
|
|
1929
1810
|
const LINE_FEED = "\n";
|
|
1930
1811
|
const LINE_FEED_CHARACTER = {
|
|
@@ -2123,8 +2004,7 @@ const createDedent = (options) => {
|
|
|
2123
2004
|
return dedent;
|
|
2124
2005
|
};
|
|
2125
2006
|
const dedent = createDedent({});
|
|
2126
|
-
|
|
2127
|
-
//#region src/util/text/encodeUrlSubDelimiters.ts
|
|
2007
|
+
// src/util/text/encodeUrlSubDelimiters.ts
|
|
2128
2008
|
const EncodedSubDelimiterMap = {
|
|
2129
2009
|
"!": "%21",
|
|
2130
2010
|
"'": "%27",
|
|
@@ -2133,36 +2013,29 @@ const EncodedSubDelimiterMap = {
|
|
|
2133
2013
|
"*": "%2A"
|
|
2134
2014
|
};
|
|
2135
2015
|
const encodeUrlSubDelimiters = (value) => Object.entries(EncodedSubDelimiterMap).reduce((encoded, [subDelimiter, encodedSubDelimiter]) => encoded.replaceAll(subDelimiter, encodedSubDelimiter), value);
|
|
2136
|
-
|
|
2137
|
-
//#region src/util/text/getDecodedUriComponent.ts
|
|
2016
|
+
// src/util/text/getDecodedUriComponent.ts
|
|
2138
2017
|
const getDecodedUriComponent = (value, fallback) => getResult(() => decodeURIComponent(value)).unwrapOr(fallback);
|
|
2139
|
-
|
|
2140
|
-
//#region src/util/text/streamToText.ts
|
|
2018
|
+
// src/util/text/streamToText.ts
|
|
2141
2019
|
const streamToText = async (readable) => {
|
|
2142
2020
|
readable.setEncoding("utf8");
|
|
2143
2021
|
let data = "";
|
|
2144
2022
|
for await (const chunk of readable) data += chunk.toString();
|
|
2145
2023
|
return data;
|
|
2146
2024
|
};
|
|
2147
|
-
|
|
2148
|
-
//#region src/util/text/toKebabCase.ts
|
|
2025
|
+
// src/util/text/toKebabCase.ts
|
|
2149
2026
|
const toKebabCase = (string) => string.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/gu)?.map((x) => x.toLowerCase()).join("-") ?? "";
|
|
2150
|
-
|
|
2151
|
-
//#region src/util/text/truncate.ts
|
|
2027
|
+
// src/util/text/truncate.ts
|
|
2152
2028
|
const SUFFIX = "...";
|
|
2153
2029
|
const truncate = (string, length) => {
|
|
2154
2030
|
if (string.length <= length) return string;
|
|
2155
2031
|
else if (length < 3) return string.slice(0, length);
|
|
2156
2032
|
else return `${string.slice(0, length - 3)}${SUFFIX}`;
|
|
2157
2033
|
};
|
|
2158
|
-
|
|
2159
|
-
//#region src/util/text/uncapitalize.ts
|
|
2034
|
+
// src/util/text/uncapitalize.ts
|
|
2160
2035
|
const uncapitalize = (string) => `${string.charAt(0).toLowerCase()}${string.slice(1)}`;
|
|
2161
|
-
|
|
2162
|
-
//#region src/util/time/constants.ts
|
|
2036
|
+
// src/util/time/constants.ts
|
|
2163
2037
|
const MILLISECONDS_PER_SECOND = 1e3;
|
|
2164
|
-
|
|
2165
|
-
//#region src/util/time/hrtime.ts
|
|
2038
|
+
// src/util/time/hrtime.ts
|
|
2166
2039
|
const hrtime = (previousHrTime) => {
|
|
2167
2040
|
if (checkIsServer()) return process.hrtime(previousHrTime);
|
|
2168
2041
|
const clocktime = performance.now() * .001;
|
|
@@ -2178,20 +2051,17 @@ const hrtime = (previousHrTime) => {
|
|
|
2178
2051
|
}
|
|
2179
2052
|
return [seconds, nanoseconds];
|
|
2180
2053
|
};
|
|
2181
|
-
|
|
2182
|
-
//#region src/util/time/now.ts
|
|
2054
|
+
// src/util/time/now.ts
|
|
2183
2055
|
const loadNanoseconds = hrtime();
|
|
2184
2056
|
const loadMilliseconds = Date.now();
|
|
2185
2057
|
const now = () => {
|
|
2186
2058
|
const [seconds, nanoseconds] = hrtime(loadNanoseconds);
|
|
2187
2059
|
return (BigInt(loadMilliseconds) * 10n ** 6n + (BigInt(seconds) * 10n ** 9n + BigInt(nanoseconds))).toString();
|
|
2188
2060
|
};
|
|
2189
|
-
|
|
2190
|
-
//#region src/util/time/sleep.ts
|
|
2061
|
+
// src/util/time/sleep.ts
|
|
2191
2062
|
const sleep = (durationMs) => new Promise((resolve) => {
|
|
2192
2063
|
setTimeout(() => {
|
|
2193
2064
|
resolve();
|
|
2194
2065
|
}, durationMs);
|
|
2195
2066
|
});
|
|
2196
|
-
//#endregion
|
|
2197
2067
|
export { ALL_SPECIAL_VALUES, APPEND_SEGMENT, CHARSET_PARAMETER_REGEX, CUSTOM_EMOJI_ID_ATTRIBUTE, CUSTOM_EMOJI_NAME_ATTRIBUTE, DEFAULT_ALLOWED_ATTRIBUTES, DEFAULT_ALLOWED_SCHEMES, DEFAULT_ALLOWED_TAGS, DEFAULT_COMPRESSION_LEVEL, DEFAULT_FACET_SCORE, DEFAULT_LINK_ATTRIBUTES, DEFAULT_SOURCE_SCORE, DEFAULT_TEXT_CHARSET, DEFAULT_TYPE_SCORE, ESCAPED_ATTRIBUTE_CHARACTERS_REGEX, ESCAPED_TEXT_CHARACTERS_REGEX, FacetScoreMap, ForbiddenError, GIBIBYTE, HTML_NAMESPACE, ID_SEPARATOR, IMPORTANT_REGEX, InvalidOperationError, ItemMetadata, JSON_POINTER_REGEX, JsonPatchOperationType, KIBIBYTE, MAX_NESTING_DEPTH, MAX_READ_LIMIT, MAX_WINDOW_LOG, MEDIA_TYPE_REGEX, MENTION_EVERYONE_ID, MENTION_HERE_ID, MENTION_ID_ATTRIBUTE, MENTION_ITEM_TYPE_ATTRIBUTE, MENTION_LABEL_ATTRIBUTE, MENTION_SELECTOR, MENTION_TYPE, MENTION_TYPE_ATTRIBUTE, MILLISECONDS_PER_SECOND, MIN_WINDOW_LOG, MentionType, NON_TEXT_TAGS, NotFoundError, NotInitializedError, ObjectMethod, Operation, PATH_SEPARATOR_REGEX, RoutePath, SANITIZER_ADVISORY_WATCH_SINCE, SITE_NAME, SPOILER_ATTRIBUTE, SPOILER_SELECTOR, SRCSET_ATTRIBUTE, SRCSET_DESCRIPTOR_REGEX, Serializable, SourceScoreMap, TEXT_MEDIA_TYPE_REGEX, TypeScoreMap, TypedEventEmitter, URL_ATTRIBUTES, UUIDV4_REGEX, VOID_TAGS, WordFilteredError, addJsonValue, applyItemMetadataMixin, applyPatch, applyPatches, capitalize, charset, checkContainsProfanity, checkIsAllowedUrl, checkIsCustomMethod, checkIsDeepEqual, checkIsNestedControl, checkIsNestedInteraction, checkIsPlainObject, checkIsSameBytes, checkIsSameValueZero, checkIsServer, checkIsUnsafeUrlCharacter, checkIsWhitespaceCharacter, chunk, chunkBySerializedSize, clonePlainDeep, collectText, contentType, createEvictingPromiseCache, createHistory, createItemEntityTypeSchema, createNormalizedStringSchema, createUniqueArraySchema, css, dedent, downloadFile, downloadUrl, encodeUrlSubDelimiters, englishProfaneWords, escapeAttribute, escapeCharacters, escapeText, exhaustiveGuard, extension, filterAttributes, filterClasses, filterHtml, filterSrcset, filterStyle, getChildNodes, getDecodedUriComponent, getEndOfDay, getEnumerableKeys, getExtensionMimeTypeMap, getMediaType, getMentions, getMimeScore, getMimeTypeEntryMap, getOrCreate, getPropertyNames, getRawData, getRequestError, getResult, getResultAsync, getSynchronizedFunction, getTransactionDone, getTransactionObjectStore, getWindowLog, getZonedDateTime, hrtime, html, jsonDateParse, lookup, matchesClassPattern, mergeObjectsStrict, noop, normalizeString, now, omitDeep, openDatabase, parseArrayIndex, parseJsonPointer, pushHistory, readJsonValue, redoHistory, removeJsonValue, renderNode, reportFinalizerError, requestToPromise, sanitizeHtml, sanitizeTextHtml, settleAll, sleep, streamToText, takeOne, takeRandom, toAppError, toJsonPointer, toKebabCase, toRawDeep, truncate, uncapitalize, undoHistory, updateJsonValue, waitForSynchronizedFunctions, withFinalizer, withFinalizerAsync, wrapDatabase, wrapIndex, wrapObjectStore, wrapTransaction, wrapUpgradeDatabase, wrapUpgradeTransaction };
|