@yunfie/search-js 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +1 -0
- package/dist/cache/memory.d.ts +18 -0
- package/dist/cache/memory.d.ts.map +1 -0
- package/dist/cache/memory.js +79 -0
- package/dist/cache/memory.js.map +1 -0
- package/dist/cache/persistent.d.ts +5 -0
- package/dist/cache/persistent.d.ts.map +1 -0
- package/dist/cache/persistent.js +105 -0
- package/dist/cache/persistent.js.map +1 -0
- package/dist/config.d.ts +24 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +29 -0
- package/dist/config.js.map +1 -0
- package/dist/events.d.ts +18 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +32 -0
- package/dist/events.js.map +1 -0
- package/dist/history.d.ts +16 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +61 -0
- package/dist/history.js.map +1 -0
- package/dist/index.d.ts +61 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +231 -0
- package/dist/index.js.map +1 -0
- package/dist/memory.d.ts +6 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +79 -0
- package/dist/memory.js.map +1 -0
- package/dist/offline.d.ts +7 -0
- package/dist/offline.d.ts.map +1 -0
- package/dist/offline.js +39 -0
- package/dist/offline.js.map +1 -0
- package/dist/parser.d.ts +36 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +118 -0
- package/dist/parser.js.map +1 -0
- package/dist/request/queue.d.ts +11 -0
- package/dist/request/queue.d.ts.map +1 -0
- package/dist/request/queue.js +31 -0
- package/dist/request/queue.js.map +1 -0
- package/dist/request/retry.d.ts +14 -0
- package/dist/request/retry.d.ts.map +1 -0
- package/dist/request/retry.js +155 -0
- package/dist/request/retry.js.map +1 -0
- package/dist/suggest.d.ts +14 -0
- package/dist/suggest.d.ts.map +1 -0
- package/dist/suggest.js +159 -0
- package/dist/suggest.js.map +1 -0
- package/dist/utils.d.ts +17 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +72 -0
- package/dist/utils.js.map +1 -0
- package/package.json +39 -0
- package/src/cache/memory.ts +79 -0
- package/src/cache/persistent.ts +106 -0
- package/src/config.ts +53 -0
- package/src/events.ts +57 -0
- package/src/history.ts +70 -0
- package/src/index.ts +307 -0
- package/src/memory.ts +101 -0
- package/src/offline.ts +44 -0
- package/src/parser.ts +138 -0
- package/src/request/queue.ts +38 -0
- package/src/request/retry.ts +162 -0
- package/src/suggest.ts +174 -0
- package/src/utils.ts +101 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { configure, type Config } from "./config.js";
|
|
2
|
+
import { type PriorityValue } from "./request/queue.js";
|
|
3
|
+
import { cancel as cancelRequest, cancelAll, type FetchResult } from "./request/retry.js";
|
|
4
|
+
import { debounce } from "./utils.js";
|
|
5
|
+
import { type ResultMeta, type ResultDetail, type ParsedResponse } from "./parser.js";
|
|
6
|
+
import { getSuggestDebounced, type SuggestItem, type SuggestResult } from "./suggest.js";
|
|
7
|
+
import { on, off, type SearchEventMap } from "./events.js";
|
|
8
|
+
import { addHistory, getHistory, removeHistory, clearHistory, mergeWithHistory, type HistoryEntry } from "./history.js";
|
|
9
|
+
import { getIsOnline } from "./offline.js";
|
|
10
|
+
export { configure, debounce, cancelRequest, cancelAll, getSuggestDebounced, on, off, addHistory, getHistory, removeHistory, clearHistory, mergeWithHistory, getIsOnline, };
|
|
11
|
+
export type { Config, FetchResult, ResultMeta, ResultDetail, ParsedResponse, SuggestItem, SuggestResult, SearchEventMap, HistoryEntry, };
|
|
12
|
+
export type SearchType = "web" | "image" | "video" | "news" | "panel";
|
|
13
|
+
export interface SearchOptions {
|
|
14
|
+
q: string;
|
|
15
|
+
page?: number;
|
|
16
|
+
type?: SearchType;
|
|
17
|
+
safesearch?: 0 | 1 | 2;
|
|
18
|
+
lang?: string;
|
|
19
|
+
enableStreaming?: boolean;
|
|
20
|
+
onChunk?: (chunk: unknown) => void;
|
|
21
|
+
usePersistentCache?: boolean;
|
|
22
|
+
metaOnly?: boolean;
|
|
23
|
+
signal?: AbortSignal;
|
|
24
|
+
}
|
|
25
|
+
export interface RequestOptions {
|
|
26
|
+
useCache?: boolean;
|
|
27
|
+
priority?: PriorityValue;
|
|
28
|
+
onChunk?: ((chunk: unknown) => void) | null;
|
|
29
|
+
usePersistentCache?: boolean;
|
|
30
|
+
signal?: AbortSignal;
|
|
31
|
+
}
|
|
32
|
+
export interface SearchStats {
|
|
33
|
+
memoryCacheSize: number;
|
|
34
|
+
memoryCacheMax: number;
|
|
35
|
+
isLowMemory: boolean;
|
|
36
|
+
isCriticalMemory: boolean;
|
|
37
|
+
inFlightCount: number;
|
|
38
|
+
isOnline: boolean;
|
|
39
|
+
}
|
|
40
|
+
export declare function getSearchStats(): SearchStats;
|
|
41
|
+
export declare function init(options?: Partial<Config>): void;
|
|
42
|
+
export declare function destroy(): Promise<void>;
|
|
43
|
+
export declare function search({ q, page, type, safesearch, lang, enableStreaming, onChunk, usePersistentCache, metaOnly, signal, }: SearchOptions): Promise<FetchResult>;
|
|
44
|
+
export declare function searchMeta(opts: Omit<SearchOptions, "metaOnly" | "enableStreaming" | "onChunk">): Promise<FetchResult>;
|
|
45
|
+
export declare function fetchDetail(opts: Omit<SearchOptions, "metaOnly" | "enableStreaming" | "onChunk">, idx: number): Promise<ResultDetail | null>;
|
|
46
|
+
export declare function getSuggest(q: string): Promise<SuggestResult>;
|
|
47
|
+
export interface Pager {
|
|
48
|
+
next(): Promise<FetchResult | null>;
|
|
49
|
+
prev(): Promise<FetchResult | null>;
|
|
50
|
+
readonly currentPage: number;
|
|
51
|
+
reset(): void;
|
|
52
|
+
}
|
|
53
|
+
export declare function createPager(opts: Omit<SearchOptions, "page">, maxPage?: number): Pager;
|
|
54
|
+
export type SearchAllResult = Partial<Record<SearchType, FetchResult>>;
|
|
55
|
+
export declare function searchAll(opts: Omit<SearchOptions, "type">, types?: SearchType[]): Promise<SearchAllResult>;
|
|
56
|
+
export declare const searchWeb: (q: string, page?: number, signal?: AbortSignal) => Promise<FetchResult>;
|
|
57
|
+
export declare const searchImage: (q: string, page?: number, signal?: AbortSignal) => Promise<FetchResult>;
|
|
58
|
+
export declare const searchVideo: (q: string, page?: number, signal?: AbortSignal) => Promise<FetchResult>;
|
|
59
|
+
export declare const searchNews: (q: string, page?: number, signal?: AbortSignal) => Promise<FetchResult>;
|
|
60
|
+
export declare const searchPanel: (q: string, signal?: AbortSignal) => Promise<FetchResult>;
|
|
61
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
import { configure, getConfig } from "./config.js";
|
|
3
|
+
import { store as memStore, clearStore, evictExpired, trimToHalf } from "./cache/memory.js";
|
|
4
|
+
import { getCacheKey, get as memGet, set as memSet } from "./cache/memory.js";
|
|
5
|
+
import { getP, setP, cleanup, destroyDB } from "./cache/persistent.js";
|
|
6
|
+
import { initMemoryMonitor, getIsLowMemory, getIsCriticalMemory, getCurrentCacheMax, destroyMemoryMonitor } from "./memory.js";
|
|
7
|
+
import { enqueue, Priority, clearQueues } from "./request/queue.js";
|
|
8
|
+
import { fetchWithRetry, cancel as cancelRequest, cancelAll } from "./request/retry.js";
|
|
9
|
+
import { debounce } from "./utils.js";
|
|
10
|
+
import { extractMeta, extractDetail, } from "./parser.js";
|
|
11
|
+
import { getSuggest as _getSuggest, getSuggestDebounced, clearSuggestCache, } from "./suggest.js";
|
|
12
|
+
import { on, off, emit, clearAllListeners } from "./events.js";
|
|
13
|
+
import { addHistory, getHistory, removeHistory, clearHistory, mergeWithHistory } from "./history.js";
|
|
14
|
+
import { initOfflineMonitor, destroyOfflineMonitor, getIsOnline, addRetryTask } from "./offline.js";
|
|
15
|
+
export { configure, debounce, cancelRequest, cancelAll, getSuggestDebounced, on, off, addHistory, getHistory, removeHistory, clearHistory, mergeWithHistory, getIsOnline, };
|
|
16
|
+
const HEAVY_TYPES = new Set(["image", "video"]);
|
|
17
|
+
export function getSearchStats() {
|
|
18
|
+
return {
|
|
19
|
+
memoryCacheSize: memStore.size,
|
|
20
|
+
memoryCacheMax: getCurrentCacheMax(),
|
|
21
|
+
isLowMemory: getIsLowMemory(),
|
|
22
|
+
isCriticalMemory: getIsCriticalMemory(),
|
|
23
|
+
inFlightCount: inFlight.size,
|
|
24
|
+
isOnline: getIsOnline(),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
let _cleanupTimer = null;
|
|
28
|
+
export function init(options = {}) {
|
|
29
|
+
configure(options);
|
|
30
|
+
initMemoryMonitor(memStore);
|
|
31
|
+
initOfflineMonitor();
|
|
32
|
+
if (_cleanupTimer !== null)
|
|
33
|
+
clearInterval(_cleanupTimer);
|
|
34
|
+
_cleanupTimer = setInterval(cleanup, getConfig().PERSISTENT_CLEANUP_INTERVAL);
|
|
35
|
+
}
|
|
36
|
+
export async function destroy() {
|
|
37
|
+
cancelAll();
|
|
38
|
+
clearQueues();
|
|
39
|
+
inFlight.clear();
|
|
40
|
+
clearStore();
|
|
41
|
+
clearSuggestCache();
|
|
42
|
+
clearAllListeners();
|
|
43
|
+
destroyOfflineMonitor();
|
|
44
|
+
await destroyDB();
|
|
45
|
+
destroyMemoryMonitor();
|
|
46
|
+
if (_cleanupTimer !== null) {
|
|
47
|
+
clearInterval(_cleanupTimer);
|
|
48
|
+
_cleanupTimer = null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const inFlight = new Map();
|
|
52
|
+
function _requestKey(endpoint, params) {
|
|
53
|
+
const p = params;
|
|
54
|
+
return endpoint + "\x00" + (p.q ?? "") + "\x00" + (p.page ?? 1) + "\x00" + (p.type ?? "web");
|
|
55
|
+
}
|
|
56
|
+
async function request(endpoint, params = {}, { useCache = true, priority = Priority.NORMAL, onChunk, usePersistentCache = false, signal, } = {}) {
|
|
57
|
+
const cfg = getConfig();
|
|
58
|
+
const lowMem = getIsLowMemory();
|
|
59
|
+
const offline = !getIsOnline();
|
|
60
|
+
if (getIsCriticalMemory()) {
|
|
61
|
+
evictExpired();
|
|
62
|
+
trimToHalf();
|
|
63
|
+
}
|
|
64
|
+
else if (lowMem) {
|
|
65
|
+
evictExpired();
|
|
66
|
+
}
|
|
67
|
+
const url = new URL(cfg.API_BASE + endpoint);
|
|
68
|
+
for (const k in params) {
|
|
69
|
+
const v = params[k];
|
|
70
|
+
if (v != null)
|
|
71
|
+
url.searchParams.append(k, String(v));
|
|
72
|
+
}
|
|
73
|
+
const cacheKey = getCacheKey(endpoint, params);
|
|
74
|
+
const reqKey = _requestKey(endpoint, params);
|
|
75
|
+
if (useCache) {
|
|
76
|
+
const hit = memGet(cacheKey);
|
|
77
|
+
if (hit) {
|
|
78
|
+
if (hit.expired && !lowMem && !offline) {
|
|
79
|
+
enqueue(async () => {
|
|
80
|
+
const r = await fetchWithRetry(url.toString(), _fetchOpts, reqKey);
|
|
81
|
+
if (r.ok) {
|
|
82
|
+
memSet(cacheKey, r.data);
|
|
83
|
+
if (usePersistentCache)
|
|
84
|
+
await setP(cacheKey, r.data);
|
|
85
|
+
emit("cacheRefreshed", { key: cacheKey });
|
|
86
|
+
}
|
|
87
|
+
}, priority);
|
|
88
|
+
}
|
|
89
|
+
return { ok: true, data: hit.data, cached: true, stale: hit.expired };
|
|
90
|
+
}
|
|
91
|
+
if (usePersistentCache) {
|
|
92
|
+
const pData = await getP(cacheKey);
|
|
93
|
+
if (pData) {
|
|
94
|
+
if (!lowMem)
|
|
95
|
+
memSet(cacheKey, pData);
|
|
96
|
+
return { ok: true, data: pData, cached: true, persistent: true };
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (offline)
|
|
101
|
+
return { ok: false, error: "offline" };
|
|
102
|
+
if (signal?.aborted)
|
|
103
|
+
return { ok: false, error: "cancelled" };
|
|
104
|
+
const existing = inFlight.get(reqKey);
|
|
105
|
+
if (existing)
|
|
106
|
+
return existing;
|
|
107
|
+
const fetchOpts = signal ? { ..._fetchOpts, signal } : _fetchOpts;
|
|
108
|
+
const promise = new Promise((resolve) => {
|
|
109
|
+
const onAbort = () => resolve({ ok: false, error: "cancelled" });
|
|
110
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
111
|
+
enqueue(async () => {
|
|
112
|
+
signal?.removeEventListener("abort", onAbort);
|
|
113
|
+
if (signal?.aborted) {
|
|
114
|
+
resolve({ ok: false, error: "cancelled" });
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
const result = await fetchWithRetry(url.toString(), fetchOpts, reqKey, onChunk ?? undefined);
|
|
119
|
+
if (result.ok && useCache && !result.streamed) {
|
|
120
|
+
if (!lowMem)
|
|
121
|
+
memSet(cacheKey, result.data);
|
|
122
|
+
if (usePersistentCache)
|
|
123
|
+
await setP(cacheKey, result.data);
|
|
124
|
+
}
|
|
125
|
+
if (!result.ok && result.error === "network_error") {
|
|
126
|
+
addRetryTask(async () => {
|
|
127
|
+
const r = await fetchWithRetry(url.toString(), _fetchOpts, reqKey);
|
|
128
|
+
if (r.ok) {
|
|
129
|
+
if (!lowMem)
|
|
130
|
+
memSet(cacheKey, r.data);
|
|
131
|
+
if (usePersistentCache)
|
|
132
|
+
await setP(cacheKey, r.data);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
resolve(result);
|
|
137
|
+
}
|
|
138
|
+
catch (e) {
|
|
139
|
+
resolve({ ok: false, error: e instanceof Error ? e.message : "unknown_error" });
|
|
140
|
+
}
|
|
141
|
+
finally {
|
|
142
|
+
inFlight.delete(reqKey);
|
|
143
|
+
}
|
|
144
|
+
}, priority);
|
|
145
|
+
});
|
|
146
|
+
inFlight.set(reqKey, promise);
|
|
147
|
+
return promise;
|
|
148
|
+
}
|
|
149
|
+
const _fetchOpts = Object.freeze({
|
|
150
|
+
method: "GET",
|
|
151
|
+
headers: Object.freeze({ Accept: "application/json" }),
|
|
152
|
+
});
|
|
153
|
+
function _prefetch(endpoint, params) {
|
|
154
|
+
if (getIsLowMemory() || !getIsOnline())
|
|
155
|
+
return;
|
|
156
|
+
const cacheKey = getCacheKey(endpoint, params);
|
|
157
|
+
const hit = memGet(cacheKey);
|
|
158
|
+
if (hit && !hit.expired)
|
|
159
|
+
return;
|
|
160
|
+
if (inFlight.has(_requestKey(endpoint, params)))
|
|
161
|
+
return;
|
|
162
|
+
request(endpoint, params, { priority: Priority.LOW }).catch(() => { });
|
|
163
|
+
}
|
|
164
|
+
export async function search({ q, page = 1, type = "web", safesearch = 0, lang = "ja", enableStreaming = false, onChunk, usePersistentCache = false, metaOnly = false, signal, }) {
|
|
165
|
+
if (!q?.trim())
|
|
166
|
+
return { ok: false, error: "empty_query" };
|
|
167
|
+
const lowMem = getIsLowMemory();
|
|
168
|
+
const isHeavy = HEAVY_TYPES.has(type);
|
|
169
|
+
const forceStream = isHeavy && lowMem;
|
|
170
|
+
const params = { q: q.trim(), page, type, safesearch, lang };
|
|
171
|
+
if (page < 10 && !lowMem)
|
|
172
|
+
_prefetch("/search", { ...params, page: page + 1 });
|
|
173
|
+
if (forceStream || (enableStreaming && onChunk)) {
|
|
174
|
+
return request("/search", params, { priority: Priority.NORMAL, onChunk: onChunk ?? undefined, usePersistentCache, signal });
|
|
175
|
+
}
|
|
176
|
+
const result = await request("/search", params, { priority: Priority.NORMAL, onChunk: null, usePersistentCache, signal });
|
|
177
|
+
if (!result.ok)
|
|
178
|
+
return result;
|
|
179
|
+
if (isHeavy || metaOnly || lowMem) {
|
|
180
|
+
return { ...result, data: extractMeta(result.data, type, lowMem) };
|
|
181
|
+
}
|
|
182
|
+
return result;
|
|
183
|
+
}
|
|
184
|
+
export function searchMeta(opts) {
|
|
185
|
+
return search({ ...opts, metaOnly: true });
|
|
186
|
+
}
|
|
187
|
+
export async function fetchDetail(opts, idx) {
|
|
188
|
+
const { q, page = 1, type = "web", safesearch = 0, lang = "ja", usePersistentCache = false } = opts;
|
|
189
|
+
if (!q?.trim())
|
|
190
|
+
return null;
|
|
191
|
+
const params = { q: q.trim(), page, type, safesearch, lang };
|
|
192
|
+
const cacheKey = getCacheKey("/search", params);
|
|
193
|
+
const hit = memGet(cacheKey);
|
|
194
|
+
if (hit)
|
|
195
|
+
return extractDetail(hit.data, idx);
|
|
196
|
+
if (usePersistentCache) {
|
|
197
|
+
const pData = await getP(cacheKey);
|
|
198
|
+
if (pData)
|
|
199
|
+
return extractDetail(pData, idx);
|
|
200
|
+
}
|
|
201
|
+
const result = await request("/search", params, { priority: Priority.NORMAL, usePersistentCache });
|
|
202
|
+
return result.ok ? extractDetail(result.data, idx) : null;
|
|
203
|
+
}
|
|
204
|
+
export function getSuggest(q) { return _getSuggest(q); }
|
|
205
|
+
export function createPager(opts, maxPage = 10) {
|
|
206
|
+
let _page = 0;
|
|
207
|
+
return {
|
|
208
|
+
get currentPage() { return _page; },
|
|
209
|
+
async next() { if (_page >= maxPage)
|
|
210
|
+
return null; _page++; return search({ ...opts, page: _page }); },
|
|
211
|
+
async prev() { if (_page <= 1)
|
|
212
|
+
return null; _page--; return search({ ...opts, page: _page }); },
|
|
213
|
+
reset() { _page = 0; },
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
export async function searchAll(opts, types = ["web", "news"]) {
|
|
217
|
+
const entries = await Promise.allSettled(types.map((type) => search({ ...opts, type })));
|
|
218
|
+
const result = {};
|
|
219
|
+
for (let i = 0; i < types.length; i++) {
|
|
220
|
+
const s = entries[i];
|
|
221
|
+
if (s.status === "fulfilled" && s.value.ok)
|
|
222
|
+
result[types[i]] = s.value;
|
|
223
|
+
}
|
|
224
|
+
return result;
|
|
225
|
+
}
|
|
226
|
+
export const searchWeb = (q, page = 1, signal) => search({ q, page, type: "web", signal });
|
|
227
|
+
export const searchImage = (q, page = 1, signal) => search({ q, page, type: "image", signal });
|
|
228
|
+
export const searchVideo = (q, page = 1, signal) => search({ q, page, type: "video", signal });
|
|
229
|
+
export const searchNews = (q, page = 1, signal) => search({ q, page, type: "news", signal });
|
|
230
|
+
export const searchPanel = (q, signal) => search({ q, type: "panel", signal });
|
|
231
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/memory.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const getIsLowMemory: () => boolean;
|
|
2
|
+
export declare const getIsCriticalMemory: () => boolean;
|
|
3
|
+
export declare const getCurrentCacheMax: () => number;
|
|
4
|
+
export declare function initMemoryMonitor(cacheRef: Map<unknown, unknown>): void;
|
|
5
|
+
export declare function destroyMemoryMonitor(): void;
|
|
6
|
+
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAuBA,eAAO,MAAM,cAAc,QAAO,OAAsB,CAAC;AACzD,eAAO,MAAM,mBAAmB,QAAO,OAA2B,CAAC;AACnE,eAAO,MAAM,kBAAkB,QAAO,MAAyB,CAAC;AAEhE,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,IAAI,CAevE;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAO3C"}
|
package/dist/memory.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// src/memory.ts
|
|
2
|
+
import { getConfig } from "./config.js";
|
|
3
|
+
import { emit } from "./events.js";
|
|
4
|
+
const capabilities = {
|
|
5
|
+
performanceMemory: typeof performance !== "undefined" &&
|
|
6
|
+
!!performance.memory,
|
|
7
|
+
deviceMemory: typeof navigator !== "undefined" &&
|
|
8
|
+
typeof navigator.deviceMemory === "number",
|
|
9
|
+
};
|
|
10
|
+
let isLowMemory = false;
|
|
11
|
+
let isCriticalMemory = false;
|
|
12
|
+
let currentCacheMax = 0;
|
|
13
|
+
let _monitorTimer = null;
|
|
14
|
+
export const getIsLowMemory = () => isLowMemory;
|
|
15
|
+
export const getIsCriticalMemory = () => isCriticalMemory;
|
|
16
|
+
export const getCurrentCacheMax = () => currentCacheMax;
|
|
17
|
+
export function initMemoryMonitor(cacheRef) {
|
|
18
|
+
if (_monitorTimer !== null) {
|
|
19
|
+
clearInterval(_monitorTimer);
|
|
20
|
+
_monitorTimer = null;
|
|
21
|
+
}
|
|
22
|
+
const cfg = getConfig();
|
|
23
|
+
currentCacheMax = cfg.CACHE_MAX;
|
|
24
|
+
const nav = navigator;
|
|
25
|
+
if (capabilities.deviceMemory && nav.deviceMemory !== undefined && nav.deviceMemory <= 2) {
|
|
26
|
+
currentCacheMax = cfg.CACHE_LOW_MEMORY;
|
|
27
|
+
}
|
|
28
|
+
_monitorTimer = setInterval(() => _check(cacheRef), cfg.MEMORY_CHECK_INTERVAL);
|
|
29
|
+
}
|
|
30
|
+
export function destroyMemoryMonitor() {
|
|
31
|
+
if (_monitorTimer !== null) {
|
|
32
|
+
clearInterval(_monitorTimer);
|
|
33
|
+
_monitorTimer = null;
|
|
34
|
+
}
|
|
35
|
+
isLowMemory = false;
|
|
36
|
+
isCriticalMemory = false;
|
|
37
|
+
}
|
|
38
|
+
function _check(cacheRef) {
|
|
39
|
+
const cfg = getConfig();
|
|
40
|
+
let pressure = 0;
|
|
41
|
+
if (capabilities.performanceMemory) {
|
|
42
|
+
const mem = performance.memory;
|
|
43
|
+
pressure = Math.max(pressure, (mem.usedJSHeapSize / mem.jsHeapSizeLimit) * 100);
|
|
44
|
+
}
|
|
45
|
+
if (cacheRef.size > currentCacheMax * 0.85) {
|
|
46
|
+
pressure = Math.max(pressure, 65);
|
|
47
|
+
}
|
|
48
|
+
const prevLow = isLowMemory;
|
|
49
|
+
const prevCritical = isCriticalMemory;
|
|
50
|
+
const normalThreshold = cfg.MEMORY_PRESSURE_NORMAL * 100;
|
|
51
|
+
const criticalThreshold = cfg.MEMORY_PRESSURE_CRITICAL * 100;
|
|
52
|
+
isCriticalMemory = pressure > criticalThreshold;
|
|
53
|
+
isLowMemory = pressure > normalThreshold;
|
|
54
|
+
if (isLowMemory !== prevLow || isCriticalMemory !== prevCritical) {
|
|
55
|
+
emit("memoryStateChange", { isLow: isLowMemory, isCritical: isCriticalMemory });
|
|
56
|
+
}
|
|
57
|
+
if (isLowMemory) {
|
|
58
|
+
const target = isCriticalMemory
|
|
59
|
+
? Math.ceil(cfg.CACHE_LOW_MEMORY * 0.5)
|
|
60
|
+
: cfg.CACHE_LOW_MEMORY;
|
|
61
|
+
if (currentCacheMax > target) {
|
|
62
|
+
_trimCache(cacheRef, target);
|
|
63
|
+
currentCacheMax = target;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else if (!isLowMemory && prevLow) {
|
|
67
|
+
currentCacheMax = Math.min(cfg.CACHE_MAX, Math.ceil(currentCacheMax * 1.5));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function _trimCache(cacheRef, maxSize) {
|
|
71
|
+
while (cacheRef.size > maxSize) {
|
|
72
|
+
const firstKey = cacheRef.keys().next().value;
|
|
73
|
+
if (firstKey !== undefined)
|
|
74
|
+
cacheRef.delete(firstKey);
|
|
75
|
+
else
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
type RetryTask = () => Promise<void>;
|
|
2
|
+
export declare function getIsOnline(): boolean;
|
|
3
|
+
export declare function initOfflineMonitor(): void;
|
|
4
|
+
export declare function destroyOfflineMonitor(): void;
|
|
5
|
+
export declare function addRetryTask(task: RetryTask): void;
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=offline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offline.d.ts","sourceRoot":"","sources":["../src/offline.ts"],"names":[],"mappings":"AAGA,KAAK,SAAS,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAMrC,wBAAgB,WAAW,IAAI,OAAO,CAAsB;AAE5D,wBAAgB,kBAAkB,IAAI,IAAI,CAMzC;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAQ5C;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAElD"}
|
package/dist/offline.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// src/offline.ts
|
|
2
|
+
import { emit } from "./events.js";
|
|
3
|
+
const _pendingRetries = [];
|
|
4
|
+
let _isOnline = true;
|
|
5
|
+
let _initialized = false;
|
|
6
|
+
export function getIsOnline() { return _isOnline; }
|
|
7
|
+
export function initOfflineMonitor() {
|
|
8
|
+
if (_initialized || typeof window === "undefined")
|
|
9
|
+
return;
|
|
10
|
+
_initialized = true;
|
|
11
|
+
_isOnline = navigator.onLine;
|
|
12
|
+
window.addEventListener("online", _handleOnline);
|
|
13
|
+
window.addEventListener("offline", _handleOffline);
|
|
14
|
+
}
|
|
15
|
+
export function destroyOfflineMonitor() {
|
|
16
|
+
if (typeof window !== "undefined") {
|
|
17
|
+
window.removeEventListener("online", _handleOnline);
|
|
18
|
+
window.removeEventListener("offline", _handleOffline);
|
|
19
|
+
}
|
|
20
|
+
_initialized = false;
|
|
21
|
+
_isOnline = true;
|
|
22
|
+
_pendingRetries.length = 0;
|
|
23
|
+
}
|
|
24
|
+
export function addRetryTask(task) {
|
|
25
|
+
if (_pendingRetries.length < 50)
|
|
26
|
+
_pendingRetries.push(task);
|
|
27
|
+
}
|
|
28
|
+
function _handleOnline() {
|
|
29
|
+
_isOnline = true;
|
|
30
|
+
emit("online");
|
|
31
|
+
const tasks = _pendingRetries.splice(0);
|
|
32
|
+
for (const task of tasks)
|
|
33
|
+
task().catch(() => { });
|
|
34
|
+
}
|
|
35
|
+
function _handleOffline() {
|
|
36
|
+
_isOnline = false;
|
|
37
|
+
emit("offline");
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=offline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offline.js","sourceRoot":"","sources":["../src/offline.ts"],"names":[],"mappings":"AAAA,iBAAiB;AACjB,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAInC,MAAM,eAAe,GAAgB,EAAE,CAAC;AACxC,IAAI,SAAS,GAAG,IAAI,CAAC;AACrB,IAAI,YAAY,GAAG,KAAK,CAAC;AAEzB,MAAM,UAAU,WAAW,KAAc,OAAO,SAAS,CAAC,CAAC,CAAC;AAE5D,MAAM,UAAU,kBAAkB;IAChC,IAAI,YAAY,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO;IAC1D,YAAY,GAAG,IAAI,CAAC;IACpB,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC;IAC7B,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAG,aAAa,CAAC,CAAC;IAClD,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAG,aAAa,CAAC,CAAC;QACrD,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACxD,CAAC;IACD,YAAY,GAAG,KAAK,CAAC;IACrB,SAAS,GAAG,IAAI,CAAC;IACjB,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAe;IAC1C,IAAI,eAAe,CAAC,MAAM,GAAG,EAAE;QAAE,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,aAAa;IACpB,SAAS,GAAG,IAAI,CAAC;IACjB,IAAI,CAAC,QAAQ,CAAC,CAAC;IACf,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,cAAc;IACrB,SAAS,GAAG,KAAK,CAAC;IAClB,IAAI,CAAC,SAAS,CAAC,CAAC;AAClB,CAAC"}
|
package/dist/parser.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { SearchType } from "./index.js";
|
|
2
|
+
export interface BaseMeta {
|
|
3
|
+
_idx: number;
|
|
4
|
+
title?: string;
|
|
5
|
+
url?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface WebMeta extends BaseMeta {
|
|
8
|
+
summary?: string;
|
|
9
|
+
favicon?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface ImageMeta extends BaseMeta {
|
|
12
|
+
thumbnail?: string;
|
|
13
|
+
domain?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface VideoMeta extends BaseMeta {
|
|
16
|
+
thumbnail?: string;
|
|
17
|
+
duration?: string;
|
|
18
|
+
publishedDate?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface NewsMeta extends BaseMeta {
|
|
21
|
+
summary?: string;
|
|
22
|
+
favicon?: string;
|
|
23
|
+
publishedDate?: string;
|
|
24
|
+
}
|
|
25
|
+
export type ResultMeta = WebMeta | ImageMeta | VideoMeta | NewsMeta | BaseMeta;
|
|
26
|
+
export type ResultDetail = ResultMeta & {
|
|
27
|
+
[key: string]: unknown;
|
|
28
|
+
};
|
|
29
|
+
export interface ParsedResponse {
|
|
30
|
+
meta: ResultMeta[];
|
|
31
|
+
raw: unknown;
|
|
32
|
+
}
|
|
33
|
+
export declare function extractMeta(data: unknown, type?: SearchType, lowMemory?: boolean): ResultMeta[];
|
|
34
|
+
export declare function extractDetail(data: unknown, idx: number): ResultDetail | null;
|
|
35
|
+
export declare function chunkToMeta(chunk: unknown, type?: SearchType, lowMemory?: boolean): ResultMeta | null;
|
|
36
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AACD,MAAM,WAAW,OAAQ,SAAQ,QAAQ;IAAG,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAAE;AACjF,MAAM,WAAW,SAAU,SAAQ,QAAQ;IAAG,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAAE;AACpF,MAAM,WAAW,SAAU,SAAQ,QAAQ;IAAG,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CAAE;AAC9G,MAAM,WAAW,QAAS,SAAQ,QAAQ;IAAG,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CAAE;AAC1G,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAC/E,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AACnE,MAAM,WAAW,cAAc;IAAG,IAAI,EAAE,UAAU,EAAE,CAAC;IAAC,GAAG,EAAE,OAAO,CAAC;CAAE;AAqBrE,wBAAgB,WAAW,CACzB,IAAI,EAAE,OAAO,EACb,IAAI,GAAE,UAAkB,EACxB,SAAS,UAAQ,GAChB,UAAU,EAAE,CAed;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAgB7E;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,OAAO,EACd,IAAI,GAAE,UAAkB,EACxB,SAAS,UAAQ,GAChB,UAAU,GAAG,IAAI,CAQnB"}
|
package/dist/parser.js
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
const META_FIELDS_BY_TYPE = {
|
|
2
|
+
web: ["title", "url", "summary", "favicon"],
|
|
3
|
+
news: ["title", "url", "summary", "favicon", "publishedDate"],
|
|
4
|
+
image: ["title", "url", "thumbnail", "domain"],
|
|
5
|
+
video: ["title", "url", "thumbnail", "duration", "publishedDate"],
|
|
6
|
+
};
|
|
7
|
+
const HEAVY_FIELDS = new Set(["summary"]);
|
|
8
|
+
const FIELD_ALIASES = {
|
|
9
|
+
url: ["url", "href", "link"],
|
|
10
|
+
thumbnail: ["thumbnail", "image", "img", "thumb"],
|
|
11
|
+
favicon: ["favicon", "icon"],
|
|
12
|
+
domain: ["domain", "source", "siteName"],
|
|
13
|
+
summary: ["summary", "description", "snippet", "desc", "content"],
|
|
14
|
+
publishedDate: ["publishedDate", "date", "published", "publishedAt"],
|
|
15
|
+
duration: ["duration", "length"],
|
|
16
|
+
};
|
|
17
|
+
export function extractMeta(data, type = "web", lowMemory = false) {
|
|
18
|
+
const fields = _fieldsForType(type, lowMemory);
|
|
19
|
+
const arr = _toArray(data);
|
|
20
|
+
const result = new Array(arr.length);
|
|
21
|
+
for (let i = 0; i < arr.length; i++) {
|
|
22
|
+
const obj = _safeObj(arr[i]);
|
|
23
|
+
const meta = { _idx: i };
|
|
24
|
+
for (const f of fields) {
|
|
25
|
+
const v = _resolve(obj, f);
|
|
26
|
+
if (v !== undefined)
|
|
27
|
+
meta[f] = v;
|
|
28
|
+
}
|
|
29
|
+
// _idx は必ず存在するので unknown 経由のキャストで型安全
|
|
30
|
+
result[i] = meta;
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
export function extractDetail(data, idx) {
|
|
35
|
+
const arr = _toArray(data);
|
|
36
|
+
if (idx < 0 || idx >= arr.length)
|
|
37
|
+
return null;
|
|
38
|
+
const obj = _safeObj(arr[idx]);
|
|
39
|
+
return {
|
|
40
|
+
_idx: idx,
|
|
41
|
+
title: _resolve(obj, "title"),
|
|
42
|
+
url: _resolve(obj, "url"),
|
|
43
|
+
thumbnail: _resolve(obj, "thumbnail"),
|
|
44
|
+
favicon: _resolve(obj, "favicon"),
|
|
45
|
+
domain: _resolve(obj, "domain"),
|
|
46
|
+
summary: _resolve(obj, "summary"),
|
|
47
|
+
duration: _resolve(obj, "duration"),
|
|
48
|
+
publishedDate: _resolve(obj, "publishedDate"),
|
|
49
|
+
...obj,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export function chunkToMeta(chunk, type = "web", lowMemory = false) {
|
|
53
|
+
if (!chunk)
|
|
54
|
+
return null;
|
|
55
|
+
const fields = _fieldsForType(type, lowMemory);
|
|
56
|
+
const tryObj = _safeObj(chunk);
|
|
57
|
+
if ("title" in tryObj || "url" in tryObj)
|
|
58
|
+
return _buildMeta(tryObj, fields);
|
|
59
|
+
const arr = _toArray(chunk);
|
|
60
|
+
if (arr.length > 0)
|
|
61
|
+
return chunkToMeta(arr[0], type, lowMemory);
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
function _fieldsForType(type, lowMemory) {
|
|
65
|
+
const base = META_FIELDS_BY_TYPE[type] ?? ["title", "url"];
|
|
66
|
+
if (!lowMemory)
|
|
67
|
+
return base;
|
|
68
|
+
return base.filter((f) => !HEAVY_FIELDS.has(f));
|
|
69
|
+
}
|
|
70
|
+
function _buildMeta(obj, fields) {
|
|
71
|
+
const meta = {
|
|
72
|
+
_idx: typeof obj._idx === "number" ? obj._idx : 0,
|
|
73
|
+
};
|
|
74
|
+
for (const f of fields) {
|
|
75
|
+
const v = _resolve(obj, f);
|
|
76
|
+
if (v !== undefined)
|
|
77
|
+
meta[f] = v;
|
|
78
|
+
}
|
|
79
|
+
return meta;
|
|
80
|
+
}
|
|
81
|
+
function _resolve(obj, field) {
|
|
82
|
+
const aliases = FIELD_ALIASES[field];
|
|
83
|
+
if (aliases) {
|
|
84
|
+
for (const key of aliases) {
|
|
85
|
+
const v = _str(obj[key]);
|
|
86
|
+
if (v !== undefined)
|
|
87
|
+
return v;
|
|
88
|
+
}
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
return _str(obj[field]);
|
|
92
|
+
}
|
|
93
|
+
function _safeObj(v) {
|
|
94
|
+
return v && typeof v === "object" ? v : {};
|
|
95
|
+
}
|
|
96
|
+
function _str(v) {
|
|
97
|
+
if (typeof v === "string") {
|
|
98
|
+
const s = v.trim();
|
|
99
|
+
return s.length > 0 ? s : undefined;
|
|
100
|
+
}
|
|
101
|
+
if (typeof v === "number")
|
|
102
|
+
return String(v);
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
function _toArray(data) {
|
|
106
|
+
if (Array.isArray(data))
|
|
107
|
+
return data;
|
|
108
|
+
if (data && typeof data === "object") {
|
|
109
|
+
const obj = data;
|
|
110
|
+
for (const key of ["results", "items", "data", "hits", "entries", "docs"]) {
|
|
111
|
+
const v = obj[key];
|
|
112
|
+
if (Array.isArray(v))
|
|
113
|
+
return v;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return [];
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAgBA,MAAM,mBAAmB,GAAsC;IAC7D,GAAG,EAAI,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC;IAC7C,IAAI,EAAG,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,CAAC;IAC9D,KAAK,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC;IAC9C,KAAK,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,CAAC;CAClE,CAAC;AAEF,MAAM,YAAY,GAAG,IAAI,GAAG,CAAS,CAAC,SAAS,CAAC,CAAC,CAAC;AAElD,MAAM,aAAa,GAAsC;IACvD,GAAG,EAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC;IACtC,SAAS,EAAM,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC;IACrD,OAAO,EAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAClC,MAAM,EAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC;IAC/C,OAAO,EAAQ,CAAC,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC;IACvE,aAAa,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,CAAC;IACpE,QAAQ,EAAO,CAAC,UAAU,EAAE,QAAQ,CAAC;CACtC,CAAC;AAEF,MAAM,UAAU,WAAW,CACzB,IAAa,EACb,OAAmB,KAAK,EACxB,SAAS,GAAG,KAAK;IAEjB,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAiB,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,IAAI,GAA4B,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAClD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC3B,IAAI,CAAC,KAAK,SAAS;gBAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACnC,CAAC;QACD,qCAAqC;QACrC,MAAM,CAAC,CAAC,CAAC,GAAG,IAA6B,CAAC;IAC5C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAa,EAAE,GAAW;IACtD,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAC9C,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,OAAO;QACL,IAAI,EAAE,GAAG;QACT,KAAK,EAAU,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;QACrC,GAAG,EAAY,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC;QACnC,SAAS,EAAM,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;QACzC,OAAO,EAAQ,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;QACvC,MAAM,EAAS,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC;QACtC,OAAO,EAAQ,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;QACvC,QAAQ,EAAO,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;QACxC,aAAa,EAAE,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC;QAC7C,GAAG,GAAG;KACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,KAAc,EACd,OAAmB,KAAK,EACxB,SAAS,GAAG,KAAK;IAEjB,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,OAAO,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM;QAAE,OAAO,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5E,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAChE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CAAC,IAAgB,EAAE,SAAkB;IAC1D,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC3D,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,UAAU,CAAC,GAA4B,EAAE,MAAyB;IACzE,MAAM,IAAI,GAA4B;QACpC,IAAI,EAAE,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KAClD,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK,SAAS;YAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,IAA6B,CAAC;AACvC,CAAC;AAED,SAAS,QAAQ,CAAC,GAA4B,EAAE,KAAa;IAC3D,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,SAAS;gBAAE,OAAO,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,QAAQ,CAAC,CAAU;IAC1B,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,CAA6B,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1E,CAAC;AAED,SAAS,IAAI,CAAC,CAAU;IACtB,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAAC,CAAC;IACvF,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IAC5C,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,QAAQ,CAAC,IAAa;IAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAA+B,CAAC;QAC5C,KAAK,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC;YAC1E,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YACnB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBAAE,OAAO,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
|