Initial Commit

This commit is contained in:
DrunkOatmeal 2023-07-13 13:28:59 +07:00
commit 7b31cd163b
16 changed files with 2823 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
node_modules
docs

12
README.md Normal file
View File

@ -0,0 +1,12 @@
## Old Twitter Image Search
An image search userscript designed specifically for [Old Twiter Layout Extension](https://github.com/dimdenGD/OldTwitter)
### Installation
Grab a compiled `otis.user.js` file from `/dist` and install it on your userscript manager.
### Special thanks
- [NTISAS](https://github.com/BrokenEagle/JavaScripts) for the original inspiration
- [Old Twiter Layout Extension](https://github.com/dimdenGD/OldTwitter) for lightweight twitter web app
- [vite-plugin-monkey](https://github.com/lisonge/vite-plugin-monkey) to make it possible to build userscript with modern framework
- [SolidJS](https://www.solidjs.com/) for a robust JS framework

1092
dist/otis.user.js vendored Normal file
View File

@ -0,0 +1,1092 @@
// ==UserScript==
// @name Old Twitter Image Search
// @namespace vite-plugin-monkey
// @version 1.0.0
// @author SoberOatmeal
// @description otis
// @license MIT
// @match https://twitter.com/*
// @connect donmai.us
// @connect saucenao.com
// @connect twimg.com
// @connect api.twitter.com
// @grant GM.getValue
// @grant GM.setValue
// @grant GM.xmlHttpRequest
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_xmlhttpRequest
// @run-at document-end
// ==/UserScript==
(t=>{const i=document.createElement("style");i.dataset.source="vite-plugin-monkey",i.textContent=t,document.head.append(i)})(" .otis-icon{width:16px;vertical-align:middle;margin-right:20px;margin-left:6px;margin-bottom:4px}.otis-icon:hover{opacity:.8}.otis-icon-loading{opacity:.6!important;animation-name:icon-spin;animation-duration:2s;animation-iteration-count:infinite;animation-timing-function:linear}.otis-icon-noresult{opacity:.3!important}.otis-danbo-icon{width:18px;vertical-align:middle;margin-bottom:2px}.danbo-text-link{color:var(--light-gray);font-weight:700;font-size:12px}.danbo-more-results{margin-left:250px}.danbo-item>img,.danbo-item>div{vertical-align:middle;display:inline-block}.danbo-item>div{margin-left:10px}@keyframes icon-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}} ");
(function () {
'use strict';
const equalFn = (a, b) => a === b;
const $TRACK = Symbol("solid-track");
const signalOptions = {
equals: equalFn
};
let runEffects = runQueue;
const STALE = 1;
const PENDING = 2;
const UNOWNED = {
owned: null,
cleanups: null,
context: null,
owner: null
};
var Owner = null;
let Transition = null;
let Listener = null;
let Updates = null;
let Effects = null;
let ExecCount = 0;
function createRoot(fn, detachedOwner) {
const listener = Listener, owner = Owner, unowned = fn.length === 0, root = unowned ? UNOWNED : {
owned: null,
cleanups: null,
context: null,
owner: detachedOwner === void 0 ? owner : detachedOwner
}, updateFn = unowned ? fn : () => fn(() => untrack(() => cleanNode(root)));
Owner = root;
Listener = null;
try {
return runUpdates(updateFn, true);
} finally {
Listener = listener;
Owner = owner;
}
}
function createSignal(value, options) {
options = options ? Object.assign({}, signalOptions, options) : signalOptions;
const s = {
value,
observers: null,
observerSlots: null,
comparator: options.equals || void 0
};
const setter = (value2) => {
if (typeof value2 === "function") {
value2 = value2(s.value);
}
return writeSignal(s, value2);
};
return [readSignal.bind(s), setter];
}
function createRenderEffect(fn, value, options) {
const c = createComputation(fn, value, false, STALE);
updateComputation(c);
}
function createMemo(fn, value, options) {
options = options ? Object.assign({}, signalOptions, options) : signalOptions;
const c = createComputation(fn, value, true, 0);
c.observers = null;
c.observerSlots = null;
c.comparator = options.equals || void 0;
updateComputation(c);
return readSignal.bind(c);
}
function untrack(fn) {
if (Listener === null)
return fn();
const listener = Listener;
Listener = null;
try {
return fn();
} finally {
Listener = listener;
}
}
function onCleanup(fn) {
if (Owner === null)
;
else if (Owner.cleanups === null)
Owner.cleanups = [fn];
else
Owner.cleanups.push(fn);
return fn;
}
function readSignal() {
if (this.sources && this.state) {
if (this.state === STALE)
updateComputation(this);
else {
const updates = Updates;
Updates = null;
runUpdates(() => lookUpstream(this), false);
Updates = updates;
}
}
if (Listener) {
const sSlot = this.observers ? this.observers.length : 0;
if (!Listener.sources) {
Listener.sources = [this];
Listener.sourceSlots = [sSlot];
} else {
Listener.sources.push(this);
Listener.sourceSlots.push(sSlot);
}
if (!this.observers) {
this.observers = [Listener];
this.observerSlots = [Listener.sources.length - 1];
} else {
this.observers.push(Listener);
this.observerSlots.push(Listener.sources.length - 1);
}
}
return this.value;
}
function writeSignal(node, value, isComp) {
let current = node.value;
if (!node.comparator || !node.comparator(current, value)) {
node.value = value;
if (node.observers && node.observers.length) {
runUpdates(() => {
for (let i = 0; i < node.observers.length; i += 1) {
const o = node.observers[i];
const TransitionRunning = Transition && Transition.running;
if (TransitionRunning && Transition.disposed.has(o))
;
if (TransitionRunning ? !o.tState : !o.state) {
if (o.pure)
Updates.push(o);
else
Effects.push(o);
if (o.observers)
markDownstream(o);
}
if (!TransitionRunning)
o.state = STALE;
}
if (Updates.length > 1e6) {
Updates = [];
if (false)
;
throw new Error();
}
}, false);
}
}
return value;
}
function updateComputation(node) {
if (!node.fn)
return;
cleanNode(node);
const owner = Owner, listener = Listener, time = ExecCount;
Listener = Owner = node;
runComputation(node, node.value, time);
Listener = listener;
Owner = owner;
}
function runComputation(node, value, time) {
let nextValue;
try {
nextValue = node.fn(value);
} catch (err) {
if (node.pure) {
{
node.state = STALE;
node.owned && node.owned.forEach(cleanNode);
node.owned = null;
}
}
node.updatedAt = time + 1;
return handleError(err);
}
if (!node.updatedAt || node.updatedAt <= time) {
if (node.updatedAt != null && "observers" in node) {
writeSignal(node, nextValue);
} else
node.value = nextValue;
node.updatedAt = time;
}
}
function createComputation(fn, init, pure, state = STALE, options) {
const c = {
fn,
state,
updatedAt: null,
owned: null,
sources: null,
sourceSlots: null,
cleanups: null,
value: init,
owner: Owner,
context: null,
pure
};
if (Owner === null)
;
else if (Owner !== UNOWNED) {
{
if (!Owner.owned)
Owner.owned = [c];
else
Owner.owned.push(c);
}
}
return c;
}
function runTop(node) {
if (node.state === 0)
return;
if (node.state === PENDING)
return lookUpstream(node);
if (node.suspense && untrack(node.suspense.inFallback))
return node.suspense.effects.push(node);
const ancestors = [node];
while ((node = node.owner) && (!node.updatedAt || node.updatedAt < ExecCount)) {
if (node.state)
ancestors.push(node);
}
for (let i = ancestors.length - 1; i >= 0; i--) {
node = ancestors[i];
if (node.state === STALE) {
updateComputation(node);
} else if (node.state === PENDING) {
const updates = Updates;
Updates = null;
runUpdates(() => lookUpstream(node, ancestors[0]), false);
Updates = updates;
}
}
}
function runUpdates(fn, init) {
if (Updates)
return fn();
let wait = false;
if (!init)
Updates = [];
if (Effects)
wait = true;
else
Effects = [];
ExecCount++;
try {
const res = fn();
completeUpdates(wait);
return res;
} catch (err) {
if (!wait)
Effects = null;
Updates = null;
handleError(err);
}
}
function completeUpdates(wait) {
if (Updates) {
runQueue(Updates);
Updates = null;
}
if (wait)
return;
const e = Effects;
Effects = null;
if (e.length)
runUpdates(() => runEffects(e), false);
}
function runQueue(queue) {
for (let i = 0; i < queue.length; i++)
runTop(queue[i]);
}
function lookUpstream(node, ignore) {
node.state = 0;
for (let i = 0; i < node.sources.length; i += 1) {
const source = node.sources[i];
if (source.sources) {
const state = source.state;
if (state === STALE) {
if (source !== ignore && (!source.updatedAt || source.updatedAt < ExecCount))
runTop(source);
} else if (state === PENDING)
lookUpstream(source, ignore);
}
}
}
function markDownstream(node) {
for (let i = 0; i < node.observers.length; i += 1) {
const o = node.observers[i];
if (!o.state) {
o.state = PENDING;
if (o.pure)
Updates.push(o);
else
Effects.push(o);
o.observers && markDownstream(o);
}
}
}
function cleanNode(node) {
let i;
if (node.sources) {
while (node.sources.length) {
const source = node.sources.pop(), index = node.sourceSlots.pop(), obs = source.observers;
if (obs && obs.length) {
const n = obs.pop(), s = source.observerSlots.pop();
if (index < obs.length) {
n.sourceSlots[s] = index;
obs[index] = n;
source.observerSlots[index] = s;
}
}
}
}
if (node.owned) {
for (i = node.owned.length - 1; i >= 0; i--)
cleanNode(node.owned[i]);
node.owned = null;
}
if (node.cleanups) {
for (i = node.cleanups.length - 1; i >= 0; i--)
node.cleanups[i]();
node.cleanups = null;
}
node.state = 0;
node.context = null;
}
function castError(err) {
if (err instanceof Error)
return err;
return new Error(typeof err === "string" ? err : "Unknown error", {
cause: err
});
}
function handleError(err, owner = Owner) {
const error = castError(err);
throw error;
}
const FALLBACK = Symbol("fallback");
function dispose(d) {
for (let i = 0; i < d.length; i++)
d[i]();
}
function mapArray(list, mapFn, options = {}) {
let items = [], mapped = [], disposers = [], len = 0, indexes = mapFn.length > 1 ? [] : null;
onCleanup(() => dispose(disposers));
return () => {
let newItems = list() || [], i, j;
newItems[$TRACK];
return untrack(() => {
let newLen = newItems.length, newIndices, newIndicesNext, temp, tempdisposers, tempIndexes, start, end, newEnd, item;
if (newLen === 0) {
if (len !== 0) {
dispose(disposers);
disposers = [];
items = [];
mapped = [];
len = 0;
indexes && (indexes = []);
}
if (options.fallback) {
items = [FALLBACK];
mapped[0] = createRoot((disposer) => {
disposers[0] = disposer;
return options.fallback();
});
len = 1;
}
} else if (len === 0) {
mapped = new Array(newLen);
for (j = 0; j < newLen; j++) {
items[j] = newItems[j];
mapped[j] = createRoot(mapper);
}
len = newLen;
} else {
temp = new Array(newLen);
tempdisposers = new Array(newLen);
indexes && (tempIndexes = new Array(newLen));
for (start = 0, end = Math.min(len, newLen); start < end && items[start] === newItems[start]; start++)
;
for (end = len - 1, newEnd = newLen - 1; end >= start && newEnd >= start && items[end] === newItems[newEnd]; end--, newEnd--) {
temp[newEnd] = mapped[end];
tempdisposers[newEnd] = disposers[end];
indexes && (tempIndexes[newEnd] = indexes[end]);
}
newIndices = /* @__PURE__ */ new Map();
newIndicesNext = new Array(newEnd + 1);
for (j = newEnd; j >= start; j--) {
item = newItems[j];
i = newIndices.get(item);
newIndicesNext[j] = i === void 0 ? -1 : i;
newIndices.set(item, j);
}
for (i = start; i <= end; i++) {
item = items[i];
j = newIndices.get(item);
if (j !== void 0 && j !== -1) {
temp[j] = mapped[i];
tempdisposers[j] = disposers[i];
indexes && (tempIndexes[j] = indexes[i]);
j = newIndicesNext[j];
newIndices.set(item, j);
} else
disposers[i]();
}
for (j = start; j < newLen; j++) {
if (j in temp) {
mapped[j] = temp[j];
disposers[j] = tempdisposers[j];
if (indexes) {
indexes[j] = tempIndexes[j];
indexes[j](j);
}
} else
mapped[j] = createRoot(mapper);
}
mapped = mapped.slice(0, len = newLen);
items = newItems.slice(0);
}
return mapped;
});
function mapper(disposer) {
disposers[j] = disposer;
if (indexes) {
const [s, set] = createSignal(j);
indexes[j] = set;
return mapFn(newItems[j], s);
}
return mapFn(newItems[j]);
}
};
}
function createComponent(Comp, props) {
return untrack(() => Comp(props || {}));
}
const narrowedError = (name) => `Stale read from <${name}>.`;
function For(props) {
const fallback = "fallback" in props && {
fallback: () => props.fallback
};
return createMemo(mapArray(() => props.each, props.children, fallback || void 0));
}
function Show(props) {
const keyed = props.keyed;
const condition = createMemo(() => props.when, void 0, {
equals: (a, b) => keyed ? a === b : !a === !b
});
return createMemo(() => {
const c = condition();
if (c) {
const child = props.children;
const fn = typeof child === "function" && child.length > 0;
return fn ? untrack(() => child(keyed ? c : () => {
if (!untrack(condition))
throw narrowedError("Show");
return props.when;
})) : child;
}
return props.fallback;
}, void 0, void 0);
}
function reconcileArrays(parentNode, a, b) {
let bLength = b.length, aEnd = a.length, bEnd = bLength, aStart = 0, bStart = 0, after = a[aEnd - 1].nextSibling, map = null;
while (aStart < aEnd || bStart < bEnd) {
if (a[aStart] === b[bStart]) {
aStart++;
bStart++;
continue;
}
while (a[aEnd - 1] === b[bEnd - 1]) {
aEnd--;
bEnd--;
}
if (aEnd === aStart) {
const node = bEnd < bLength ? bStart ? b[bStart - 1].nextSibling : b[bEnd - bStart] : after;
while (bStart < bEnd)
parentNode.insertBefore(b[bStart++], node);
} else if (bEnd === bStart) {
while (aStart < aEnd) {
if (!map || !map.has(a[aStart]))
a[aStart].remove();
aStart++;
}
} else if (a[aStart] === b[bEnd - 1] && b[bStart] === a[aEnd - 1]) {
const node = a[--aEnd].nextSibling;
parentNode.insertBefore(b[bStart++], a[aStart++].nextSibling);
parentNode.insertBefore(b[--bEnd], node);
a[aEnd] = b[bEnd];
} else {
if (!map) {
map = /* @__PURE__ */ new Map();
let i = bStart;
while (i < bEnd)
map.set(b[i], i++);
}
const index = map.get(a[aStart]);
if (index != null) {
if (bStart < index && index < bEnd) {
let i = aStart, sequence = 1, t;
while (++i < aEnd && i < bEnd) {
if ((t = map.get(a[i])) == null || t !== index + sequence)
break;
sequence++;
}
if (sequence > index - bStart) {
const node = a[aStart];
while (bStart < index)
parentNode.insertBefore(b[bStart++], node);
} else
parentNode.replaceChild(b[bStart++], a[aStart++]);
} else
aStart++;
} else
a[aStart++].remove();
}
}
}
const $$EVENTS = "_$DX_DELEGATE";
function template(html, isCE, isSVG) {
let node;
const create = () => {
const t = document.createElement("template");
t.innerHTML = html;
return isSVG ? t.content.firstChild.firstChild : t.content.firstChild;
};
const fn = isCE ? () => untrack(() => document.importNode(node || (node = create()), true)) : () => (node || (node = create())).cloneNode(true);
fn.cloneNode = fn;
return fn;
}
function delegateEvents(eventNames, document2 = window.document) {
const e = document2[$$EVENTS] || (document2[$$EVENTS] = /* @__PURE__ */ new Set());
for (let i = 0, l = eventNames.length; i < l; i++) {
const name = eventNames[i];
if (!e.has(name)) {
e.add(name);
document2.addEventListener(name, eventHandler);
}
}
}
function setAttribute(node, name, value) {
if (value == null)
node.removeAttribute(name);
else
node.setAttribute(name, value);
}
function addEventListener(node, name, handler, delegate) {
if (delegate) {
if (Array.isArray(handler)) {
node[`$$${name}`] = handler[0];
node[`$$${name}Data`] = handler[1];
} else
node[`$$${name}`] = handler;
} else if (Array.isArray(handler)) {
const handlerFn = handler[0];
node.addEventListener(name, handler[0] = (e) => handlerFn.call(node, handler[1], e));
} else
node.addEventListener(name, handler);
}
function use(fn, element2, arg) {
return untrack(() => fn(element2, arg));
}
function insert(parent, accessor, marker, initial) {
if (marker !== void 0 && !initial)
initial = [];
if (typeof accessor !== "function")
return insertExpression(parent, accessor, initial, marker);
createRenderEffect((current) => insertExpression(parent, accessor(), current, marker), initial);
}
function eventHandler(e) {
const key = `$$${e.type}`;
let node = e.composedPath && e.composedPath()[0] || e.target;
if (e.target !== node) {
Object.defineProperty(e, "target", {
configurable: true,
value: node
});
}
Object.defineProperty(e, "currentTarget", {
configurable: true,
get() {
return node || document;
}
});
while (node) {
const handler = node[key];
if (handler && !node.disabled) {
const data = node[`${key}Data`];
data !== void 0 ? handler.call(node, data, e) : handler.call(node, e);
if (e.cancelBubble)
return;
}
node = node._$host || node.parentNode || node.host;
}
}
function insertExpression(parent, value, current, marker, unwrapArray) {
while (typeof current === "function")
current = current();
if (value === current)
return current;
const t = typeof value, multi = marker !== void 0;
parent = multi && current[0] && current[0].parentNode || parent;
if (t === "string" || t === "number") {
if (t === "number")
value = value.toString();
if (multi) {
let node = current[0];
if (node && node.nodeType === 3) {
node.data = value;
} else
node = document.createTextNode(value);
current = cleanChildren(parent, current, marker, node);
} else {
if (current !== "" && typeof current === "string") {
current = parent.firstChild.data = value;
} else
current = parent.textContent = value;
}
} else if (value == null || t === "boolean") {
current = cleanChildren(parent, current, marker);
} else if (t === "function") {
createRenderEffect(() => {
let v = value();
while (typeof v === "function")
v = v();
current = insertExpression(parent, v, current, marker);
});
return () => current;
} else if (Array.isArray(value)) {
const array = [];
const currentArray = current && Array.isArray(current);
if (normalizeIncomingArray(array, value, current, unwrapArray)) {
createRenderEffect(() => current = insertExpression(parent, array, current, marker, true));
return () => current;
}
if (array.length === 0) {
current = cleanChildren(parent, current, marker);
if (multi)
return current;
} else if (currentArray) {
if (current.length === 0) {
appendNodes(parent, array, marker);
} else
reconcileArrays(parent, current, array);
} else {
current && cleanChildren(parent);
appendNodes(parent, array);
}
current = array;
} else if (value.nodeType) {
if (Array.isArray(current)) {
if (multi)
return current = cleanChildren(parent, current, marker, value);
cleanChildren(parent, current, null, value);
} else if (current == null || current === "" || !parent.firstChild) {
parent.appendChild(value);
} else
parent.replaceChild(value, parent.firstChild);
current = value;
} else
;
return current;
}
function normalizeIncomingArray(normalized, array, current, unwrap) {
let dynamic = false;
for (let i = 0, len = array.length; i < len; i++) {
let item = array[i], prev = current && current[i], t;
if (item == null || item === true || item === false)
;
else if ((t = typeof item) === "object" && item.nodeType) {
normalized.push(item);
} else if (Array.isArray(item)) {
dynamic = normalizeIncomingArray(normalized, item, prev) || dynamic;
} else if (t === "function") {
if (unwrap) {
while (typeof item === "function")
item = item();
dynamic = normalizeIncomingArray(normalized, Array.isArray(item) ? item : [item], Array.isArray(prev) ? prev : [prev]) || dynamic;
} else {
normalized.push(item);
dynamic = true;
}
} else {
const value = String(item);
if (prev && prev.nodeType === 3 && prev.data === value)
normalized.push(prev);
else
normalized.push(document.createTextNode(value));
}
}
return dynamic;
}
function appendNodes(parent, array, marker = null) {
for (let i = 0, len = array.length; i < len; i++)
parent.insertBefore(array[i], marker);
}
function cleanChildren(parent, current, marker, replacement) {
if (marker === void 0)
return parent.textContent = "";
const node = replacement || document.createTextNode("");
if (current.length) {
let inserted = false;
for (let i = current.length - 1; i >= 0; i--) {
const el = current[i];
if (node !== el) {
const isParent = el.parentNode === parent;
if (!inserted && !i)
isParent ? parent.replaceChild(node, el) : parent.insertBefore(node, marker);
else
isParent && el.remove();
} else
inserted = true;
}
} else
parent.insertBefore(node, marker);
return [node];
}
function click_out_directive(el, accessor) {
const onClick = (e) => {
var _a;
return !el.contains(e.target) && ((_a = accessor()) == null ? void 0 : _a());
};
document.body.addEventListener("click", onClick);
onCleanup(() => document.body.removeEventListener("click", onClick));
}
var _GM_getValue = /* @__PURE__ */ (() => typeof GM_getValue != "undefined" ? GM_getValue : void 0)();
var _GM_setValue = /* @__PURE__ */ (() => typeof GM_setValue != "undefined" ? GM_setValue : void 0)();
var _GM_xmlhttpRequest = /* @__PURE__ */ (() => typeof GM_xmlhttpRequest != "undefined" ? GM_xmlhttpRequest : void 0)();
const DANBOORU_API = "https://danbooru.donmai.us";
async function tweet_search(id, username) {
const posts_api = `${DANBOORU_API}/posts.json`;
const tweet_url = `https://twitter.com/${username}/status/${id}`;
const posts_url = new URL(posts_api);
posts_url.searchParams.append("tags", `status:any source:${tweet_url}`);
posts_url.searchParams.append("limit", `5`);
const booru_request = new Promise((res, rej) => {
_GM_xmlhttpRequest({
url: posts_url.toString(),
method: "GET",
responseType: "json",
anonymous: true,
onload: (response2) => res(response2.responseText),
onerror: (error) => rej(error)
});
});
const response = await booru_request;
const posts = JSON.parse(response);
const result = posts.map((post) => {
var _a;
const preview = (_a = post.media_asset.variants) == null ? void 0 : _a.find((v) => v.type == "preview" || v.type == "180x180");
const source_domain = new URL(post.source).hostname;
return {
id: post.id,
timestamp: post.created_at,
source_domain,
thumbnail: preview == null ? void 0 : preview.url,
img_width: post.image_width,
img_height: post.image_height
};
});
return result;
}
async function iqdb_search(media_url) {
const iqdb_api = `${DANBOORU_API}/iqdb_queries.json`;
const iqdb_url = new URL(iqdb_api);
iqdb_url.searchParams.append("url", media_url);
iqdb_url.searchParams.append("similarity", "80");
iqdb_url.searchParams.append("limit", "5");
const booru_request = new Promise((res, rej) => {
_GM_xmlhttpRequest({
url: iqdb_url.toString(),
method: "GET",
responseType: "json",
anonymous: true,
onload: (response2) => res(response2.responseText),
onerror: (error) => rej(error)
});
});
const response = await booru_request;
const iqdb_res = JSON.parse(response);
const result = iqdb_res.map((i) => {
var _a;
const post = i.post;
const preview = (_a = post.media_asset.variants) == null ? void 0 : _a.find((v) => v.type == "preview" || v.type == "180x180");
const source_domain = new URL(post.source).hostname;
return {
id: post.id,
timestamp: post.created_at,
source_domain,
thumbnail: preview == null ? void 0 : preview.url,
img_width: post.image_width,
img_height: post.image_height
};
});
return result;
}
async function saucenao_search(media_url) {
const saucenao_key = _GM_getValue("DunkOatmeal_SNKey", "");
if (!saucenao_key) {
alert("SauceNAO API required. \nGo to Profile Menu > Settings to add it.");
return [];
}
const danbo_bm = 512;
const bitmask = danbo_bm;
const min_similarity = 80;
const sauce_api = `http://saucenao.com/search.php`;
const sauce_url = new URL(sauce_api);
sauce_url.searchParams.append("numres", "5");
sauce_url.searchParams.append("output_type", "2");
sauce_url.searchParams.append("dbmask", String(bitmask));
sauce_url.searchParams.append("api_key", saucenao_key);
sauce_url.searchParams.append("url", media_url);
const booru_request = new Promise((res, rej) => {
_GM_xmlhttpRequest({
url: sauce_url.toString(),
method: "GET",
responseType: "json",
anonymous: true,
onload: (response2) => res(response2.responseText),
onerror: (error) => rej(error)
});
});
const response = await booru_request;
const sauce_res = JSON.parse(response);
const result = sauce_res.results.filter((x) => Number(x.header.similarity) >= min_similarity).map((s) => {
const danbo = s.data;
const preview = s.header.thumbnail;
const source_domain = new URL(danbo.source).hostname;
return {
id: danbo.danbooru_id,
timestamp: "",
source_domain,
thumbnail: preview,
img_width: -1,
img_height: -1
};
});
return result;
}
const _tmpl$$1 = /* @__PURE__ */ template(`<hr>`), _tmpl$2$1 = /* @__PURE__ */ template(`<h1>Old Twitter Image Search Settings`), _tmpl$3$1 = /* @__PURE__ */ template(`<br>`), _tmpl$4$1 = /* @__PURE__ */ template(`<span> Userscript made by SoberOatmeal `), _tmpl$5$1 = /* @__PURE__ */ template(`<span> SauceNAO API Key `), _tmpl$6$1 = /* @__PURE__ */ template(`<span>Can be acquired by signing up to SauceNAO then go to <b>Account > api </b> and then grab the generated api key.`), _tmpl$7$1 = /* @__PURE__ */ template(`<div class="setting"><input type="text" placeholder="Put SauceNAO API key here">`);
function OTISSettingsPage() {
const settingsElement = document.getElementById("settings");
const ot_settings = settingsElement.getElementsByTagName("hr").item(0);
const OTISSettings = () => {
const [SauceKey, setSauceKey] = createSignal(_GM_getValue("DunkOatmeal_SNKey", ""));
return [_tmpl$$1(), _tmpl$2$1(), _tmpl$3$1(), _tmpl$4$1(), _tmpl$3$1(), _tmpl$3$1(), _tmpl$5$1(), _tmpl$3$1(), _tmpl$6$1(), (() => {
const _el$10 = _tmpl$7$1(), _el$11 = _el$10.firstChild;
_el$11.$$input = (i) => _GM_setValue("DunkOatmeal_SNKey", i.target.value);
_el$11.style.setProperty("height", "25px");
_el$11.style.setProperty("width", "550px");
createRenderEffect(() => _el$11.value = SauceKey());
return _el$10;
})(), _tmpl$3$1()];
};
ot_settings.before(...createComponent(OTISSettings, {}));
}
delegateEvents(["input"]);
const iqdb_icon = "data:image/x-icon;base64,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NP+Nnaz/zeT+/8zj/f/K4P7/xdv9/7/U/P+ow/r/haj4/3uh9v99o/f/nrz6/77T9f9iW7X/enDs/4yI8P+YmfP/lpfy/4OUzv/J4f3/oLPL/7zT8v+AmcH/eJ3e/4my+f+Ls/n/i7T6/463+v87RU//REtd/05Sav84Y4n/R6X4/0Wl+P88g8L/MjtI/zI7SP81PUz/TVFu/3R8sf9fZY7/T1h5/zM4SP85SF7/O0hd/5G5+v+Tu/r/e4ud/42drv/N4/3/zeP9/8zi/f/I3/3/xNr8/77S/P+cufn/f6T3/3yi9/9/pPf/sMn7/8PZ/P+CjLP/dmzh/21j0v9lYbb/g4y5/8bb9v/M4v7/kqS6/3qZzP+LtPn/irP6/32i4v+Mtfr/jrb6/422+P9ASVb/U1dw/zg/S/8/e7D/Sab5/0el+P89hMH/MzxJ/zM8Sv9KT2n/XmSK/2dtmf9KUGv/TVV1/zI+VP8tNUL/bou6/5G5+v9zjbX/KjI7/7rQ7P/O4/7/zeT+/8zi/v/I3v7/w9j8/77S/P+xyPv/lLP4/5e1+f+sxPr/n7nk/8HX/P/F3Pv/nrHH/7HH3v/J4vz/yuP9/8vi/v/L4v7/h5/B/4+4+f+KtPr/eaDf/2SBtP+Otvr/j7f6/4Kq3/9TWHH/REpa/0hPY/9Ch8P/Sqb5/0mm+f8/hsX/ND1K/0RLYP9RVXL/Vlx8/05Sbv9bYYb/OkRZ/zE4Rv9RXnn/kLj6/3GPvv8tNUP/UF94/7XO8P/O4/7/zeP+/8zi/v/I3f3/wtj8/77T/P+5zvz/tcv7/7XL+/+wxvT/pLzn/8DV/P/E2v3/x9/+/8ri/v/K4/3/yuP9/8rj/f/K4/3/hZq1/5S7+v92m9f/LDpP/4Ot8f+Nt/r/hq/r/5S67v9YXHb/Vlp1/0dOYP9Dicf/S6f4/0un+P9Dj9L/OkJQ/1JWc/9NUmz/REpf/1FVcv9QV3T/O0hb/z1EV/+HqeP/aISx/y43RP87QVb/f5zK/3N/jf/O4/7/zuP+/8zi/v/J3v7/xNr8/8DV/P+70Pz/uM37/7jM+/+5zfv/ssr7/7DK+/+70/z/xdv8/8ff/v/L4f7/yuL+/8rj/f/L5P3/ZV1b/3KFn/8kLT//YH6u/4i0+/95ntv/kbjr/1Numf9bX3v/U1hw/0tSZv9Dhr//S6j3/0un+P9Ppu3/SExh/09Ubv87Q1P/UFVw/09UcP9FUGf/REhe/2iHvP9VbJL/LjdD/0BGXf9VY4L/YnSL/3F8jv/P5P7/zuP+/83j/v/K4P3/xt39/8PZ/P+/1Pz/u9H8/7rQ+/+60Pv/kbP5/4Wr+P+Zufn/wtj8/8Xc/f/H3/3/yuD+/8zj/v+/0+n/Pzk6/ycvQv9LXYL/gqrr/0Zcfv95ndf/aYi6/yYuQv9aXnn/U1lw/0RMW/9DfrH/Tan4/0uo9/9eu/v/QlJr/zpDUf9LUGj/U1d0/0tQaf9NUWv/UWOH/0BQaP8yO0j/Q0lg/0tQaf9VYnP/OT9S/6W2yv/P5f7/z+X+/83k/v/M4v7/yd/9/8bd/f/D2fz/wtT0/4eVrv99jKf/tMz6/5+++v+zzPv/wtj8/8Ta/f/G3f3/yN/+/9nq/v+Uoa//MThR/zM7U/9HXX7/KTJG/2SDtP9zls//JjBE/0JQcf9aX3n/VVpz/z5HVP9Fcpz/Tan4/06q+P9vzP3/PWGC/0hPY/9VWXb/VFh1/05Sa/9DUGj/P05j/zU8Sf9TWXj/TlJu/zA2Qv84QFD/XmZ6/8/l/v/P5f7/z+X+/8/l/v/N5P7/zOL9/83h+v+IkqD/JFFw/xmEv/87kL3/Q2F8/7LG5//C2Pz/w9n9/8Xb/f/G3f3/0eT+/+71/v9eaXn/JS8//ygwQv82PVj/aoi7/3me2f8pNEj/MjdS/2mJvf9dYnz/TFNl/1BXbP9UbYv/T6n4/1Sw+f920/7/TYSw/1dceP9WWnf/S1Bm/zQ7Rf88RFP/WmSG/2xyn/9XXHz/NjtK/zhAUP9MUGn/ssTZ/8/l/v/P5f7/z+X+/8/l/v/F2vH/h4aK/0hKUv8UIzb/E0Rn/x9IXP81iKP/OrXh/yVJYv+ru9X/0Njj/8bc+//N4f3/5Ov2/9DZ5P8rMkL/MTlP/yUrO/8tO0//JzNF/xoiLv82O1b/Iic3/xUbJf9eYn3/VFpv/11hfP9UWnH/V6/x/2zI/P930/7/YbLg/1JWbv9PVWz/TVNp/1NYcv9XW3r/foa8/4GJwv9FTGH/PURV/05Tbv+Fkab/xt/9/6vJ9v+myPz/zeP+/8/l/v9icIH/LzAz/5eaoP86QEn/FBoi/xMYIf8SGSP/isjg/0qby/9WY2//5Ojy/+Lm6v/s8/7/s7i+/1Vc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c/9YdIj/es71/3bO/f9sw/v/c8Tq/1lxiP9dYXv/XWF8/1VZcf9LUGL/UVhu/213nv9/h7j/VFhy/0RKWv9XX3z/YWmM/1VZdv8+RFP/PURU/0xRa/9MUWr/TlFs/zY8Sv87QlT/P0JW/z9Scf86erX/OYnP/zqM0/84hMj/M2uf/ztNaf9UYIP/WGWL/1dojf9keqL/dImp/2+NqP9pbYb/aGyF/2drhP9na4T/ZmqD/2Vpgv9laYL/ZGiB/2Rogf9jZ4D/X3OK/3bE6P950f3/Z7/7/3HJ+v9jmLT/VWF3/1pfeP9cYHz/W197/1ldef9eY4H/hIu//3yEtP9hZoj/TVFm/0lOYf9SV3H/VFh1/1RYdP9KTmb/QEVY/0NJX/82U3L/PH+8/0Oi9v9Co/f/QaP3/0Gj+P8/nvL/NoDB/2CHt/+Pt/b/iK3p/2+WzP9ak8n/O4G+/5240/9kaH3/am6H/2lthv9maoL/Z2uE/2drhP9maoP/ZWmC/2Rogf9gZHv/WV5x/1Jaav9ZhJ7/VZPB/0yEtv9NfaT/RWiJ/0BIUv9RVGf/ZmyN/3h+qv+Di77/c3mi/2hukv9pbpP/bXOa/3F3of9fZIX/Vlp2/1VZdv9MUmv/PFBq/zZtm/87gb3/PYjJ/zyIy/89is//OoXH/zyS2/83gL//OIXI/z2Q1v86icz/OpDc/z6g9/8/l+H/nbXO/87j/v90cHz/am6H/2puh/9hZ3z/aGyF/2drhP9na4T/ZmqD/2Vpgv9laIL/Y2eA/15jef9YXnH/U1pr/1FYaf9PVmf/UFZo/1JYbP9VWnD/UlVp/1VZcP9dYn7/aG6R/3F3oP98hLP/fIOy/2Noiv9OU2v/SV9//0t/q/9QpOX/U7D6/1Ot8v9Jmdn/P4rL/0OPzf9Kls3/SZbO/zh8t/9IqPX/UJ/Q/2PE/P9fw/z/Urb7/2DD/f9yobv/zuP+/87j/v+Yion/a2+I/2puh/9hZnr/ZmqC/2hshf9obIX/Z2uE/2drhP9maoP/ZWmC/2Rogf9kaIH/Y2eA/2Jmf/9hZYH/YWV//2Bkfv9fY37/XmJ+/1tfeP9RVGj/SExb/0tRY/9DSVf/OEBL/0Ruiv9JeJP/R36l/1ykzP9rveT/dNH9/3HP/v9pyPz/bs79/3DR/f9w0f7/ZMT8/0Sk+P9Lk8H/ZrPV/2q+5f9ryvj/asz6/12r0P+lv97/uNX8/8Pc/P/Suq//aGyC/2tviP9nbIP/XGNz/2puh/9pbYb/aGyF/2drhP9na4T/ZmqD/2Vpgv9kaIH/Y2eA/1xfdP9XWm7/Vlls/1JWZ/9MUV//RkxY/0RLVv9MWGr/XmyI/11og/9QV2z/Vlt1/0Z2o/9Mn+f/PnGd/0SIxP9HmN7/R5DL/1Cazf9Xos//Yq7U/5TY9v+l4v3/a8f8/0CLzP8zRVX/MjpG/zpAUv8/Q1j/Qkhf/0ZVbP9uh6z/j6nO/56/8P/Pysf/h4eS/2xwiP9rb4j/V19t/2lthf9qbof/aW2G/2hshf9na4T/Z2uE/2Zqg/9laYL/ZWmC/2Rogf9kaIH/YWV9/2Jmf/9iZYD/YWV//2Bkff9fY37/YGSB/2twk/9tc5j/Vl52/0dTZf9HhLv/T6f3/0SJxP9AeKn/Q4jD/0mh7f9Lp/j/S6X1/0eR0/9bnM7/UZrJ/z5mjf9ES2P/P0Za/zc/T/8wOEX/LDM9/0NRZ/9WaYj/bomw/42kx/+TlqH/0NHT/2tvhv9tcYn/X2Z3/15ldv9qbof/am6H/2puh/9ma4P/aGyF/2drhP9na4T/ZmqD/2Vpgv9kaIH/ZGiA/1xfdP9TVmb/S1Bd/0lPW/9HTVn/Q0pV/0FHUf9KVGP/X2uH/2l1mP9fZoT/SHCa/1u09f9WpNz/S42+/0KCuf9Disb/S6f4/0un+P9Lp/j/Sqb5/0im+f8/h8f/OEBP/0ZMYv9LT2n/SE1n/0lRa/9SW3v/OD5P/0NKWv9nbH3/5OXm/42Qmv9tcYr/aW6E/1NcZ/9obYT/a2+H/2puh/9kaX//X2V4/2hshf9na4T/Z2uE/2Zqg/9kaIH/XWF2/2NngP9kaIH/Y2eA/19je/9gZX//b3WY/4GItv95gKr/aG2O/1lddP9LT2D/PUJM/0dldP91z/n/d9P+/2Wx1f9Kh7P/QH6z/0qk8/9Lp/j/R5jf/0OIwP8/dqP/R01k/ztDU/8uNT7/YnaZ/4mXtf+Ej6j/f4uh/4mXrP9kaXX/m56p/+Dg4f9tcYb/bnKK/1xjcv9cY3L/bHCI/2tviP9qbof/WmBx/1ZaaP9maoP/aGyF/2drhP9qbon/aW6K/1xjd/9VXW7/WWF0/2VtiP9vdpf/Z22K/1VZbf9JTVv/QUZP/z5ETP8/Rk//QUhT/0hQYP9WeZD/d9P9/3fT/v920/3/Y6rN/0h3lP9Disj/RI3N/125+/83VXD/QEVW/09Tbv9JUmv/RFJm/5Oy4//I4P3/z+X+/87j/v+ztbj/cHeN/9fS0v+jlpb/b3OL/2puhP9VXmj/Zmt//2xwiP9rb4j/am6H/11jdf9PVV//Wl5v/2drg/9obIb/cXaV/3uBpv+BiLL/fYeu/2Vvif9TWmv/UVho/1BXZ/9PV2f/UVhp/1NZbP9YXXT/XWF8/11ifP9VWG//WYmg/3jT/v951P7/ktz+/4rY/f9Ro+L/V7P5/1GWw/8+Z43/P0VV/3CJsf9VXnn/YWqQ/z5JWv9+msb/vNj8/87j/v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
const sauce_icon = "data:image/x-icon;base64,Qk02AwAAAAAAADYAAAAoAAAAEAAAABAAAAABABgAAAAAAAADAADEDgAAxA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////AAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAA////AAAA////////AAAAAAAAAAAAAAAAAAAAAAAA////////AAAA////AAAAAAAAAAAAAAAA////////////AAAAAAAAAAAAAAAA////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////AAAAAAAA////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////AAAAAAAA////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////AAAAAAAAAAAAAAAA////////////AAAAAAAAAAAAAAAA////AAAA////////AAAAAAAAAAAAAAAAAAAAAAAA////////AAAA////AAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAA////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
const grape_icon = "data:image/png;base64,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";
const danbo_icon = "data:image/png;base64,UklGRkgDAABXRUJQVlA4WAoAAAAQAAAAXwAAXwAAQUxQSC4AAAABDzD/ERECTSSp+RkEIAnrSEIAJFUqrkoV0f8JEOl92ramqAuR9x9xQYQotI0TVlA4IPQCAAAwGwCdASpgAGAAAAAAJYwDQFcD+k/jNt2fd/xA/IDkwu++840v/Jfyc/ru8Af1X7RuEB+gH8r9rDpAP6r/APU8/nfWAfpX6Dv+w/0fwj+gb+jH/R1jTy7/Sfwi/RT+Kfk4mzhm4gHswfQB/AK//0/0Tn+k6uj+ifgnyAHwAIn56AK4Ax4C8Nbq5KG6JLjN2dCB0Cot5bIh0jB3mKg8kvOCrgVqWcXENUemgUKGhZOoChhuwKLDmT7JlieTrTsuQMWHg6B/dTygFoUUC6XJl4V5/IDLWcYcGB+fm5TBzQkXsnEAAP7/3t0Uf+HR//pd6v9U91+l/9HrPPdc3//OZoyGl2sChOzeKf//5wX6DVMWAanet5+MwFJaYpt/RRcjyP/3/0u9X/FaH+o5v2s98GQzdFhTjdoryChWWGMOC4/xD/X7vyb/6gyqLL3/6+BsJ8ehd8U/XB3DFl8RwTxpDSqzDIuPz+FZ1Xxyy/MwzLb9i+JRJNKUYM7xHyYlD+pnP2pZ9Et02TVVNaytC7Zf6lIzT/92e/93ZjDzY2HXLG83xZOxxmaJCZ5MFk1H/sXMBHecqL/jBpxDOMMLv1hmL4VsnBs6S8jgcdvKyl67v62fcarL2dAZD9A3/a5m41SpuVOrsxrhKXyGfkSd07RIOsKz+Pn19/3oIow6YbHgYXZWrXA6ke5ZROMD308wNO9oNwLdxxiBfGE30Ixfb3lxoeagTdGF2DMxpilpEjNWVqc103bGQgB02y6c1bzRFyROks+wde2zZSWG+9mRuwihJO2JXp/FuoA3ERDhqTeg9xm+y+iPM59Kmzoqw7LJ0D2CuXa9/1RnY/JN//8DlLO6YfJjj4j+aX3M//EyEYXIMn02hq2rcV7c93Y0DdS6go32KbGZroTe0X/6WnwfnOXiIWvPbIlcsoeIMeOxAyrE13hFvDNqctyEKjAR9kBgOmB2CrID/0tZohex6Ilc1SsqLhRh1v6fxNufEBtNLt6Vf/vlCAAAAAA=";
const _tmpl$ = /* @__PURE__ */ template(`<img class="otis-icon" title="Tweet Search">`), _tmpl$2 = /* @__PURE__ */ template(`<img class="otis-icon" title="Danbooru IQDB Search">`), _tmpl$3 = /* @__PURE__ */ template(`<img class="otis-icon" title="SauceNAO Search">`), _tmpl$4 = /* @__PURE__ */ template(`<img class="otis-danbo-icon">`), _tmpl$5 = /* @__PURE__ */ template(`<a rel="noopener" target="_blank" class="danbo-text-link">`), _tmpl$6 = /* @__PURE__ */ template(`<span>`), _tmpl$7 = /* @__PURE__ */ template(`<div class="dropdown-menu danbo-more-results">`), _tmpl$8 = /* @__PURE__ */ template(`<span class="danbo-item"><img width="80px"><div><div> #<!> </div><div> <!> </div><div> <!> `);
const clickOutside = click_out_directive;
const GrapeCatIcon = ({
onClick
}) => (() => {
const _el$ = _tmpl$();
addEventListener(_el$, "click", onClick, true);
setAttribute(_el$, "src", grape_icon);
_el$.style.setProperty("width", "20px");
_el$.style.setProperty("margin-bottom", "2px");
return _el$;
})();
const IqdbIcon = ({
onClick
}) => (() => {
const _el$2 = _tmpl$2();
addEventListener(_el$2, "click", onClick, true);
setAttribute(_el$2, "src", iqdb_icon);
return _el$2;
})();
const SauceIcon = ({
onClick
}) => (() => {
const _el$3 = _tmpl$3();
addEventListener(_el$3, "click", onClick, true);
setAttribute(_el$3, "src", sauce_icon);
_el$3.style.setProperty("margin-right", "unset");
return _el$3;
})();
const DanboIcon = ({
onClick
}) => (() => {
const _el$4 = _tmpl$4();
addEventListener(_el$4, "click", onClick, true);
setAttribute(_el$4, "src", danbo_icon);
return _el$4;
})();
async function main() {
const settings_page = document.URL.endsWith("/old/settings");
if (settings_page)
return OTISSettingsPage();
const GrapeSearch = ({
media_url,
id,
username
}) => {
const [showTooltip, setShowTooltip] = createSignal(false);
const [ShowDanboResult, setShowDanboResult] = createSignal(false);
createSignal(0);
const [posts, setPosts] = createSignal([]);
const booru_check = async (e) => {
const ico = e.target;
ico.classList.add("otis-icon-loading");
ico.classList.remove("otis-icon-noresult");
const res = await tweet_search(id, username);
ico.classList.remove("otis-icon-loading");
if (res.length == 0) {
ico.classList.add("otis-icon-noresult");
ico.title = "Can't find any post based on Tweet ID.";
return void 0;
}
setPosts(res);
if (res.length === 1)
setShowDanboResult(true);
else
setShowTooltip(true);
};
const iqdb_check = async (e) => {
const ico = e.target;
ico.classList.add("otis-icon-loading");
ico.classList.remove("otis-icon-noresult");
const res = await iqdb_search(media_url[0]);
ico.classList.remove("otis-icon-loading");
if (res.length == 0) {
ico.classList.add("otis-icon-noresult");
ico.title = "No relevant image search results from IQDB";
return void 0;
}
setPosts(res);
if (res.length === 1)
setShowDanboResult(true);
else
setShowTooltip(true);
};
const sauce_check = async (e) => {
const ico = e.target;
ico.classList.add("otis-icon-loading");
ico.classList.remove("otis-icon-noresult");
const res = await saucenao_search(media_url[0]);
ico.classList.remove("otis-icon-loading");
if (res.length == 0) {
ico.classList.add("otis-icon-noresult");
ico.title = "No relevant image search results from IQDB";
return void 0;
}
setPosts(res);
if (res.length === 1)
setShowDanboResult(true);
else
setShowTooltip(true);
};
const DanboPostsResult = () => [createComponent(DanboIcon, {}), (() => {
const _el$5 = _tmpl$5();
_el$5.$$mouseover = () => setShowTooltip(true);
insert(_el$5, () => {
var _a;
return `#${(_a = posts()[0]) == null ? void 0 : _a.id}`;
});
createRenderEffect(() => {
var _a;
return setAttribute(_el$5, "href", `${DANBOORU_API}/posts/${(_a = posts()[0]) == null ? void 0 : _a.id}`);
});
return _el$5;
})()];
return [(() => {
const _el$6 = _tmpl$6();
insert(_el$6, createComponent(Show, {
get when() {
return !ShowDanboResult();
},
get fallback() {
return createComponent(DanboPostsResult, {});
},
get children() {
return [createComponent(GrapeCatIcon, {
onClick: booru_check
}), createComponent(IqdbIcon, {
onClick: iqdb_check
}), createComponent(SauceIcon, {
onClick: sauce_check
})];
}
}));
return _el$6;
})(), (() => {
const _el$7 = _tmpl$7();
use(clickOutside, _el$7, () => () => setShowTooltip(false));
insert(_el$7, createComponent(For, {
get each() {
return posts();
},
children: (post) => (() => {
const _el$8 = _tmpl$8(), _el$9 = _el$8.firstChild, _el$10 = _el$9.nextSibling, _el$11 = _el$10.firstChild, _el$12 = _el$11.firstChild, _el$14 = _el$12.nextSibling;
_el$14.nextSibling;
const _el$15 = _el$11.nextSibling, _el$16 = _el$15.firstChild, _el$18 = _el$16.nextSibling;
_el$18.nextSibling;
const _el$19 = _el$15.nextSibling, _el$20 = _el$19.firstChild, _el$22 = _el$20.nextSibling;
_el$22.nextSibling;
_el$8.$$click = () => window.open(`${DANBOORU_API}/posts/${post.id}`, "_blank");
insert(_el$11, () => post.id, _el$14);
insert(_el$15, () => post.source_domain, _el$18);
insert(_el$19, () => post.img_width >= 0 ? `${post.img_width} x ${post.img_height}` : "", _el$22);
createRenderEffect(() => setAttribute(_el$9, "src", post.thumbnail));
return _el$8;
})()
}));
createRenderEffect(() => _el$7.hidden = !showTooltip());
return _el$7;
})()];
};
const callback = (mutationList, observer) => {
for (const mutation of mutationList) {
if (mutation.type !== "childList")
return;
mutation.addedNodes.forEach((node) => {
const tweet = node;
const media = tweet.getElementsByClassName("tweet-media").item(0);
if (!media)
return;
const imgs = media.getElementsByTagName("img");
if (!imgs)
return;
const twt_interact = tweet.getElementsByClassName("tweet-interact").item(0);
const twt_avatar = tweet.getElementsByClassName("tweet-avatar-link").item(0);
const twt_child_elipsis = twt_interact == null ? void 0 : twt_interact.getElementsByClassName("tweet-interact-more").item(0);
const tweet_id = tweet.dataset.tweetId || "0";
const tweet_user = twt_avatar.href.split("/").pop() || "*";
let img_urls = [];
for (const img of imgs) {
img_urls.push(img.src);
}
const grape = createComponent(GrapeSearch, {
media_url: img_urls,
id: tweet_id,
username: tweet_user
});
twt_child_elipsis == null ? void 0 : twt_child_elipsis.before(...grape);
});
}
};
const tweet_observer = new MutationObserver(callback);
const timeline = document.getElementById("timeline");
if (!timeline)
return;
const config = {
subtree: false,
childList: true,
attributes: false
};
tweet_observer.observe(timeline, config);
}
const element = document.getElementById("center-cell");
if (element) {
main();
}
delegateEvents(["click", "mouseover"]);
})();

21
package.json Normal file
View File

@ -0,0 +1,21 @@
{
"name": "otis",
"description": "Old Twitter Image Search",
"version": "1.0.0",
"type": "module",
"author": "SoberOatmeal",
"license": "MIT",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"devDependencies": {
"vite": "^4.4.1",
"vite-plugin-monkey": "^3.3.0",
"vite-plugin-solid": "^2.7.0"
},
"dependencies": {
"solid-js": "^1.7.7"
}
}

168
src/api.ts Normal file
View File

@ -0,0 +1,168 @@
import { GM_getValue, GM_xmlhttpRequest } from 'vite-plugin-monkey/dist/client';
export const DANBOORU_API = "https://danbooru.donmai.us"
const SAUCENAO_KEY = "debugging only"
export type booru_post = {
id: number,
timestamp: string,
source_domain: string,
thumbnail: string,
img_width: number,
img_height: number
}
export async function tweet_search(id:string,username:string) : Promise<Array<booru_post>> {
const posts_api = `${DANBOORU_API}/posts.json`
const tweet_url = `https://twitter.com/${username}/status/${id}`;
const posts_url = new URL(posts_api);
posts_url.searchParams.append('tags',`status:any source:${tweet_url}`);
posts_url.searchParams.append('limit',`5`);
const booru_request = new Promise<string>((res,rej) => {
GM_xmlhttpRequest({
url: posts_url.toString(),
method:'GET',
responseType: 'json',
anonymous:true,
onload: (response) => res(response.responseText),
onerror: (error) => rej(error)
})
})
const response = await booru_request
const posts:any[] = JSON.parse(response)
//console.debug({grape:posts})
const result = posts.map<booru_post>( post => {
const preview = post.media_asset.variants?.find( (v:any) => v.type=="preview" || v.type=="180x180")
const source_domain = new URL(post.source).hostname
return {
id: post.id,
timestamp: post.created_at,
source_domain: source_domain,
thumbnail: preview?.url,
img_width: post.image_width,
img_height: post.image_height
}
})
return result
}
export async function iqdb_search(media_url:string) : Promise<Array<booru_post>> {
const iqdb_api = `${DANBOORU_API}/iqdb_queries.json`
const iqdb_url = new URL(iqdb_api);
iqdb_url.searchParams.append('url',media_url);
iqdb_url.searchParams.append('similarity','80');
iqdb_url.searchParams.append('limit','5');
const booru_request = new Promise<string>((res,rej) => {
GM_xmlhttpRequest({
url: iqdb_url.toString(),
method:'GET',
responseType: 'json',
anonymous:true,
onload: (response) => res(response.responseText),
onerror: (error) => rej(error)
})
})
const response = await booru_request
const iqdb_res = JSON.parse(response) as any[]
const result = iqdb_res.map<booru_post>( i => {
const post = i.post;
const preview = post.media_asset.variants?.find( (v:any) => v.type=="preview" || v.type=="180x180")
const source_domain = new URL(post.source).hostname
return {
id: post.id,
timestamp: post.created_at,
source_domain: source_domain,
thumbnail: preview?.url,
img_width: post.image_width,
img_height: post.image_height
}
})
return result
}
type sauce_response = {
header: any,
results: sauce_item[]
}
type sauce_item = {
header: {
similarity : string,
thumbnail : string
},
data: {
danbooru_id: number,
source: string
}
}
export async function saucenao_search(media_url:string) {
const saucenao_key = GM_getValue('DunkOatmeal_SNKey','');
if ( !saucenao_key ) {
alert("SauceNAO API required. \nGo to Profile Menu > Settings to add it.")
return []
}
const danbo_bm = 0b1000000000;
//const pixiv_bm = 0b0000100000;
const bitmask = danbo_bm //| pixiv_bm;
const min_similarity = 80
const sauce_api = `http://saucenao.com/search.php`;
const sauce_url = new URL(sauce_api);
sauce_url.searchParams.append('numres','5');
sauce_url.searchParams.append('output_type','2');
sauce_url.searchParams.append('dbmask',String(bitmask));
sauce_url.searchParams.append('api_key',saucenao_key);
sauce_url.searchParams.append('url',media_url);
const booru_request = new Promise<string>((res,rej) => {
GM_xmlhttpRequest({
url: sauce_url.toString(),
method:'GET',
responseType: 'json',
anonymous:true,
onload: (response) => res(response.responseText),
onerror: (error) => rej(error)
})
})
const response = await booru_request
const sauce_res:sauce_response = JSON.parse(response)
console.debug({sauce:sauce_res})
const result = sauce_res.results
.filter(x => Number(x.header.similarity) >= min_similarity )
.map<booru_post>( s => {
const danbo = s.data;
const preview = s.header.thumbnail;
const source_domain = new URL(danbo.source).hostname
return {
id: danbo.danbooru_id,
timestamp: "",
source_domain: source_domain,
thumbnail: preview,
img_width: -1,
img_height: -1
}
})
return result;
}

BIN
src/assets/danbo.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 848 B

BIN
src/assets/grapecat.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
src/assets/iqdb.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

BIN
src/assets/saucenao.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 822 B

12
src/helper.ts Normal file
View File

@ -0,0 +1,12 @@
import { onCleanup } from "solid-js";
export function click_out_directive(el:any, accessor:any) {
const onClick = (e:any) => !el.contains(e.target) && accessor()?.();
document.body.addEventListener("click", onClick);
onCleanup(() => document.body.removeEventListener("click", onClick));
}
export const delay = (delayInms:number) => {
return new Promise(resolve => setTimeout(resolve, delayInms));
}

232
src/index.tsx Normal file
View File

@ -0,0 +1,232 @@
import { Component, createSignal, For, Show } from "solid-js";
import { click_out_directive } from "./helper";
import { DANBOORU_API, booru_post, iqdb_search, saucenao_search, tweet_search } from "./api";
import { OTISSettingsPage } from "./settings";
import iqdb_icon from "./assets/iqdb.ico";
import sauce_icon from './assets/saucenao.ico';
import grape_icon from './assets/grapecat.png';
import danbo_icon from './assets/danbo.png';
import "./style.css";
// Typescript strips this directive if we don't
// force call it in this module
const clickOutside = click_out_directive
type GrapeSearchParams = {
media_url:string[],
id:string,
username: string
}
const GrapeCatIcon = ({onClick}:any) => <img onClick={onClick} src={grape_icon} class={"otis-icon"} title="Tweet Search" style={{"width":"20px", "margin-bottom":"2px"}} />
const IqdbIcon = ({onClick}:any) => <img onClick={onClick} src={iqdb_icon } class={"otis-icon"} title="Danbooru IQDB Search" />
const SauceIcon = ({onClick}:any) => <img onClick={onClick} src={sauce_icon} class={"otis-icon"} title="SauceNAO Search" style={{"margin-right":"unset"}} />
const DanboIcon = ({onClick}:any) => <img onClick={onClick} src={danbo_icon} class={"otis-danbo-icon"} />
async function main() {
// check current page. Switch to Settings page instead
const settings_page = document.URL.endsWith("/old/settings");
if ( settings_page ) return OTISSettingsPage()
const GrapeSearch : Component<GrapeSearchParams> = ({media_url,id, username}) => {
const [showTooltip, setShowTooltip] = createSignal(false);
const [ShowDanboResult, setShowDanboResult] = createSignal(false);
const [danboPostID, setPostID ] = createSignal(0);
const [posts, setPosts] = createSignal<Array<booru_post>>([])
const booru_check = async (e:MouseEvent) => {
//console.debug({id,username})
//console.debug({event:e});
const ico = e.target as HTMLImageElement;
ico.classList.add('otis-icon-loading');
ico.classList.remove('otis-icon-noresult');
const res = await tweet_search(id,username)
ico.classList.remove('otis-icon-loading');
if ( res.length == 0 ) {
ico.classList.add('otis-icon-noresult');
ico.title = "Can't find any post based on Tweet ID."
return console.debug("grape: none")
}
setPosts(res)
if ( res.length === 1 ) setShowDanboResult(true)
else setShowTooltip(true)
}
const iqdb_check = async (e:MouseEvent) => {
const ico = e.target as HTMLImageElement;
ico.classList.add('otis-icon-loading');
ico.classList.remove('otis-icon-noresult');
// TODO: handle which image to check
const res = await iqdb_search(media_url[0])
ico.classList.remove('otis-icon-loading');
if ( res.length == 0 ) {
ico.classList.add('otis-icon-noresult');
ico.title = "No relevant image search results from IQDB"
return console.debug("iqdb: none");
}
setPosts(res)
if ( res.length === 1 ) setShowDanboResult(true)
else setShowTooltip(true)
}
const sauce_check = async (e:MouseEvent) => {
const ico = e.target as HTMLImageElement;
ico.classList.add('otis-icon-loading');
ico.classList.remove('otis-icon-noresult');
// TODO: handle which image to check
const res = await saucenao_search(media_url[0]);
ico.classList.remove('otis-icon-loading');
if ( res.length == 0 ) {
ico.classList.add('otis-icon-noresult');
ico.title = "No relevant image search results from IQDB"
return console.debug("sauce: none");
}
setPosts(res)
if ( res.length === 1 ) setShowDanboResult(true)
else setShowTooltip(true)
}
const DanboPostsResult = () => (
<>
<DanboIcon />
<a
rel="noopener"
target="_blank"
class={"danbo-text-link"}
href={`${DANBOORU_API}/posts/${posts()[0]?.id}`}
onmouseover={() => setShowTooltip(true)}>
{`#${posts()[0]?.id}`}
</a>
</>
)
return ( <>
<span>
<Show
when={!ShowDanboResult()}
fallback={<DanboPostsResult /> }>
<GrapeCatIcon onClick={booru_check} />
<IqdbIcon onClick={iqdb_check} />
<SauceIcon onClick={sauce_check} />
</Show>
</span>
<div class={"dropdown-menu danbo-more-results"} use:clickOutside={() => setShowTooltip(false)} hidden={!showTooltip()}>
<For each={posts()}>
{ (post) =>
<span
class={"danbo-item"}
onClick={() => window.open(`${DANBOORU_API}/posts/${post.id}`,'_blank')}>
<img src={post.thumbnail} width="80px"/>
<div>
<div> #{post.id} </div>
<div> {post.source_domain} </div>
<div> { post.img_width >= 0 ? `${post.img_width} x ${post.img_height}` : ""} </div>
</div>
</span>
}
</For>
</div>
</>
)
}
const callback : MutationCallback = (mutationList, observer) => {
for (const mutation of mutationList) {
if (mutation.type !== "childList") return;
mutation.addedNodes.forEach( (node) => {
const tweet = node as HTMLElement;
const media = tweet.getElementsByClassName('tweet-media').item(0);
if ( !media ) return;
const imgs = media.getElementsByTagName('img');
if ( !imgs ) return;
const twt_interact = tweet.getElementsByClassName('tweet-interact').item(0);
const twt_avatar = tweet.getElementsByClassName('tweet-avatar-link').item(0) as HTMLAnchorElement;
const twt_child_elipsis = twt_interact?.getElementsByClassName('tweet-interact-more').item(0);
const tweet_id = tweet.dataset.tweetId || "0"
const tweet_user = twt_avatar.href.split('/').pop() || "*"
//console.debug({tweet_id: tweet_id, media:imgs?.length || 0});
//console.debug({tweet_user:tweet_user});
let img_urls = []
for ( const img of imgs ) {
img_urls.push(img.src)
}
//console.debug({media:img_urls, id:tweet_id, user:tweet_user});
const grape = <GrapeSearch media_url={img_urls} id={tweet_id} username={tweet_user}/>;
twt_child_elipsis?.before(...grape as any);
// TODO: Implement OTIS buttons
})
}
};
const tweet_observer = new MutationObserver(callback);
const timeline = document.getElementById('timeline');
if ( !timeline ) return;
const config: MutationObserverInit = {
subtree:false,
childList:true,
attributes:false
}
tweet_observer.observe(timeline, config);
}
// const init:any = async (limit=0) => {
// /* We need to do this hack because Old Twitter Extension
// would just dump entire Twitter's page including userscripts
// and replace it with OT's custom page instead of replacing
// Twitter's Document Body page
// */
// if ( limit >= 10 ) return console.error("OTIS: Old Twitter Extension not detected, userscript won't run")
// const element = document.getElementById('center-cell');
// if (element) {
// console.debug("Old Twitter detected");
// return main();
// }
// else {
// console.debug("can't find it");
// await delay(1000);
// return init(limit += 1);
// }
// }
//init()
const element = document.getElementById('center-cell');
if (element) {
console.debug("Old Twitter Extension detected");
main();
}
else {
console.debug("can't find it");
}

38
src/settings.tsx Normal file
View File

@ -0,0 +1,38 @@
import { Component, createSignal } from "solid-js";
import { GM_getValue, GM_setValue } from "vite-plugin-monkey/dist/client";
export function OTISSettingsPage() {
console.debug("settings page fired")
const settingsElement = document.getElementById('settings');
const ot_settings = settingsElement.getElementsByTagName('hr').item(0);
const OTISSettings : Component = () => {
const [SauceKey,setSauceKey] = createSignal(GM_getValue('DunkOatmeal_SNKey',''));
return <>
<hr />
<h1>Old Twitter Image Search Settings</h1>
<br/>
<span> Userscript made by SoberOatmeal </span >
<br />
<br />
<span> SauceNAO API Key </span>
<br />
<span>
Can be acquired by signing up to SauceNAO then go to <b>Account > api </b> and then grab the generated api key.
</span>
<div class={"setting"}>
<input
type={"text"}
style={{"height":"25px", "width":"550px"}}
value={SauceKey()}
oninput={(i) => GM_setValue("DunkOatmeal_SNKey",i.target.value) }
placeholder={"Put SauceNAO API key here"} />
</div>
<br />
</>
}
ot_settings.before(...<OTISSettings />);
}

58
src/style.css Normal file
View File

@ -0,0 +1,58 @@
.otis-icon {
width:16px;
vertical-align:middle;
margin-right:20px;
margin-left:6px;
margin-bottom: 4px;
}
.otis-icon:hover {
opacity: 0.8;
}
.otis-icon-loading {
opacity: 0.6 !important;
animation-name: icon-spin;
animation-duration: 2000ms;
animation-iteration-count: infinite;
animation-timing-function: linear;
}
.otis-icon-noresult {
opacity: 0.3 !important;
}
.otis-danbo-icon {
width:18px;
vertical-align:middle;
margin-bottom:2px;
}
.danbo-text-link {
color: var(--light-gray);
font-weight: 700;
font-size: 12px;
}
.danbo-more-results {
margin-left:250px;
}
.danbo-item > img, .danbo-item > div {
vertical-align:middle;
display: inline-block;
}
.danbo-item > div {
margin-left: 10px;
}
@keyframes icon-spin {
from {
transform:rotate(0deg);
}
to {
transform:rotate(360deg);
}
}

22
tsconfig.json Normal file
View File

@ -0,0 +1,22 @@
{
"compilerOptions": {
"outDir": "dist",
"strict": true,
"target": "ESNext",
"module": "ESNext",
"moduleResolution": "node",
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"jsx": "preserve",
"jsxImportSource": "solid-js",
"noEmit": true,
"isolatedModules": true,
"types": [
"vite-userscript-plugin/types/tampermonkey",
"vite/client"
]
},
"include": [
"src/**/*"
]
}

32
vite.config.ts Normal file
View File

@ -0,0 +1,32 @@
import { defineConfig, optimizeDeps } from 'vite'
import solidPlugin from 'vite-plugin-solid';
import Monkey from 'vite-plugin-monkey';
import { name, description, version } from './package.json'
export default defineConfig((config) => {
return {
esbuild: {
drop: ['console', 'debugger'],
},
plugins: [
solidPlugin(),
Monkey({
entry: 'src/index.tsx',
userscript: {
name: description,
description: name,
version,
match: 'https://twitter.com/*',
connect: [
'donmai.us',
'saucenao.com',
'twimg.com',
'api.twitter.com',
],
"run-at": "document-end",
grant: ['GM.xmlHttpRequest', 'GM.setValue', 'GM.getValue']
}
})
]
}
})

1134
yarn.lock Normal file
View File

@ -0,0 +1,1134 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@ampproject/remapping@^2.2.0":
version "2.2.1"
resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630"
integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==
dependencies:
"@jridgewell/gen-mapping" "^0.3.0"
"@jridgewell/trace-mapping" "^0.3.9"
"@babel/code-frame@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658"
integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==
dependencies:
"@babel/highlight" "^7.22.5"
"@babel/compat-data@^7.22.6":
version "7.22.6"
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.6.tgz#15606a20341de59ba02cd2fcc5086fcbe73bf544"
integrity sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==
"@babel/core@^7.20.5":
version "7.22.8"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.8.tgz#386470abe884302db9c82e8e5e87be9e46c86785"
integrity sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw==
dependencies:
"@ampproject/remapping" "^2.2.0"
"@babel/code-frame" "^7.22.5"
"@babel/generator" "^7.22.7"
"@babel/helper-compilation-targets" "^7.22.6"
"@babel/helper-module-transforms" "^7.22.5"
"@babel/helpers" "^7.22.6"
"@babel/parser" "^7.22.7"
"@babel/template" "^7.22.5"
"@babel/traverse" "^7.22.8"
"@babel/types" "^7.22.5"
"@nicolo-ribaudo/semver-v6" "^6.3.3"
convert-source-map "^1.7.0"
debug "^4.1.0"
gensync "^1.0.0-beta.2"
json5 "^2.2.2"
"@babel/generator@^7.21.1", "@babel/generator@^7.22.7":
version "7.22.7"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.7.tgz#a6b8152d5a621893f2c9dacf9a4e286d520633d5"
integrity sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==
dependencies:
"@babel/types" "^7.22.5"
"@jridgewell/gen-mapping" "^0.3.2"
"@jridgewell/trace-mapping" "^0.3.17"
jsesc "^2.5.1"
"@babel/helper-annotate-as-pure@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882"
integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==
dependencies:
"@babel/types" "^7.22.5"
"@babel/helper-compilation-targets@^7.22.6":
version "7.22.6"
resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz#e30d61abe9480aa5a83232eb31c111be922d2e52"
integrity sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==
dependencies:
"@babel/compat-data" "^7.22.6"
"@babel/helper-validator-option" "^7.22.5"
"@nicolo-ribaudo/semver-v6" "^6.3.3"
browserslist "^4.21.9"
lru-cache "^5.1.1"
"@babel/helper-create-class-features-plugin@^7.22.5":
version "7.22.6"
resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.6.tgz#58564873c889a6fea05a538e23f9f6d201f10950"
integrity sha512-iwdzgtSiBxF6ni6mzVnZCF3xt5qE6cEA0J7nFt8QOAWZ0zjCFceEgpn3vtb2V7WFR6QzP2jmIFOHMTRo7eNJjQ==
dependencies:
"@babel/helper-annotate-as-pure" "^7.22.5"
"@babel/helper-environment-visitor" "^7.22.5"
"@babel/helper-function-name" "^7.22.5"
"@babel/helper-member-expression-to-functions" "^7.22.5"
"@babel/helper-optimise-call-expression" "^7.22.5"
"@babel/helper-replace-supers" "^7.22.5"
"@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
"@babel/helper-split-export-declaration" "^7.22.6"
"@nicolo-ribaudo/semver-v6" "^6.3.3"
"@babel/helper-environment-visitor@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98"
integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==
"@babel/helper-function-name@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be"
integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==
dependencies:
"@babel/template" "^7.22.5"
"@babel/types" "^7.22.5"
"@babel/helper-hoist-variables@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb"
integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==
dependencies:
"@babel/types" "^7.22.5"
"@babel/helper-member-expression-to-functions@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz#0a7c56117cad3372fbf8d2fb4bf8f8d64a1e76b2"
integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==
dependencies:
"@babel/types" "^7.22.5"
"@babel/helper-module-imports@7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e"
integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==
dependencies:
"@babel/types" "^7.18.6"
"@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c"
integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==
dependencies:
"@babel/types" "^7.22.5"
"@babel/helper-module-transforms@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef"
integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==
dependencies:
"@babel/helper-environment-visitor" "^7.22.5"
"@babel/helper-module-imports" "^7.22.5"
"@babel/helper-simple-access" "^7.22.5"
"@babel/helper-split-export-declaration" "^7.22.5"
"@babel/helper-validator-identifier" "^7.22.5"
"@babel/template" "^7.22.5"
"@babel/traverse" "^7.22.5"
"@babel/types" "^7.22.5"
"@babel/helper-optimise-call-expression@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e"
integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==
dependencies:
"@babel/types" "^7.22.5"
"@babel/helper-plugin-utils@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295"
integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==
"@babel/helper-replace-supers@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz#71bc5fb348856dea9fdc4eafd7e2e49f585145dc"
integrity sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg==
dependencies:
"@babel/helper-environment-visitor" "^7.22.5"
"@babel/helper-member-expression-to-functions" "^7.22.5"
"@babel/helper-optimise-call-expression" "^7.22.5"
"@babel/template" "^7.22.5"
"@babel/traverse" "^7.22.5"
"@babel/types" "^7.22.5"
"@babel/helper-simple-access@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de"
integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==
dependencies:
"@babel/types" "^7.22.5"
"@babel/helper-skip-transparent-expression-wrappers@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847"
integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==
dependencies:
"@babel/types" "^7.22.5"
"@babel/helper-split-export-declaration@^7.22.5", "@babel/helper-split-export-declaration@^7.22.6":
version "7.22.6"
resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c"
integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==
dependencies:
"@babel/types" "^7.22.5"
"@babel/helper-string-parser@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f"
integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==
"@babel/helper-validator-identifier@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193"
integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==
"@babel/helper-validator-option@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac"
integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==
"@babel/helpers@^7.22.6":
version "7.22.6"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.6.tgz#8e61d3395a4f0c5a8060f309fb008200969b5ecd"
integrity sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==
dependencies:
"@babel/template" "^7.22.5"
"@babel/traverse" "^7.22.6"
"@babel/types" "^7.22.5"
"@babel/highlight@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031"
integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==
dependencies:
"@babel/helper-validator-identifier" "^7.22.5"
chalk "^2.0.0"
js-tokens "^4.0.0"
"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5", "@babel/parser@^7.22.7":
version "7.22.7"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae"
integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==
"@babel/plugin-syntax-jsx@^7.18.6", "@babel/plugin-syntax-jsx@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918"
integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/plugin-syntax-typescript@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272"
integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/plugin-transform-modules-commonjs@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz#7d9875908d19b8c0536085af7b053fd5bd651bfa"
integrity sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==
dependencies:
"@babel/helper-module-transforms" "^7.22.5"
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/helper-simple-access" "^7.22.5"
"@babel/plugin-transform-typescript@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.5.tgz#5c0f7adfc1b5f38c4dbc8f79b1f0f8074134bd7d"
integrity sha512-SMubA9S7Cb5sGSFFUlqxyClTA9zWJ8qGQrppNUm05LtFuN1ELRFNndkix4zUJrC9F+YivWwa1dHMSyo0e0N9dA==
dependencies:
"@babel/helper-annotate-as-pure" "^7.22.5"
"@babel/helper-create-class-features-plugin" "^7.22.5"
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/plugin-syntax-typescript" "^7.22.5"
"@babel/preset-typescript@^7.18.6":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.22.5.tgz#16367d8b01d640e9a507577ed4ee54e0101e51c8"
integrity sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/helper-validator-option" "^7.22.5"
"@babel/plugin-syntax-jsx" "^7.22.5"
"@babel/plugin-transform-modules-commonjs" "^7.22.5"
"@babel/plugin-transform-typescript" "^7.22.5"
"@babel/template@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec"
integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==
dependencies:
"@babel/code-frame" "^7.22.5"
"@babel/parser" "^7.22.5"
"@babel/types" "^7.22.5"
"@babel/traverse@^7.22.5", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8":
version "7.22.8"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.8.tgz#4d4451d31bc34efeae01eac222b514a77aa4000e"
integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==
dependencies:
"@babel/code-frame" "^7.22.5"
"@babel/generator" "^7.22.7"
"@babel/helper-environment-visitor" "^7.22.5"
"@babel/helper-function-name" "^7.22.5"
"@babel/helper-hoist-variables" "^7.22.5"
"@babel/helper-split-export-declaration" "^7.22.6"
"@babel/parser" "^7.22.7"
"@babel/types" "^7.22.5"
debug "^4.1.0"
globals "^11.1.0"
"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.20.7", "@babel/types@^7.21.2", "@babel/types@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe"
integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==
dependencies:
"@babel/helper-string-parser" "^7.22.5"
"@babel/helper-validator-identifier" "^7.22.5"
to-fast-properties "^2.0.0"
"@esbuild/android-arm64@0.18.11":
version "0.18.11"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.11.tgz#fa6f0cc7105367cb79cc0a8bf32bf50cb1673e45"
integrity sha512-snieiq75Z1z5LJX9cduSAjUr7vEI1OdlzFPMw0HH5YI7qQHDd3qs+WZoMrWYDsfRJSq36lIA6mfZBkvL46KoIw==
"@esbuild/android-arm@0.18.11":
version "0.18.11"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.11.tgz#ae84a410696c9f549a15be94eaececb860bacacb"
integrity sha512-q4qlUf5ucwbUJZXF5tEQ8LF7y0Nk4P58hOsGk3ucY0oCwgQqAnqXVbUuahCddVHfrxmpyewRpiTHwVHIETYu7Q==
"@esbuild/android-x64@0.18.11":
version "0.18.11"
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.11.tgz#0e58360bbc789ad0d68174d32ba20e678c2a16b6"
integrity sha512-iPuoxQEV34+hTF6FT7om+Qwziv1U519lEOvekXO9zaMMlT9+XneAhKL32DW3H7okrCOBQ44BMihE8dclbZtTuw==
"@esbuild/darwin-arm64@0.18.11":
version "0.18.11"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.11.tgz#fcdcd2ef76ca656540208afdd84f284072f0d1f9"
integrity sha512-Gm0QkI3k402OpfMKyQEEMG0RuW2LQsSmI6OeO4El2ojJMoF5NLYb3qMIjvbG/lbMeLOGiW6ooU8xqc+S0fgz2w==
"@esbuild/darwin-x64@0.18.11":
version "0.18.11"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.11.tgz#c5ac602ec0504a8ff81e876bc8a9811e94d69d37"
integrity sha512-N15Vzy0YNHu6cfyDOjiyfJlRJCB/ngKOAvoBf1qybG3eOq0SL2Lutzz9N7DYUbb7Q23XtHPn6lMDF6uWbGv9Fw==
"@esbuild/freebsd-arm64@0.18.11":
version "0.18.11"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.11.tgz#7012fb06ee3e6e0d5560664a65f3fefbcc46db2e"
integrity sha512-atEyuq6a3omEY5qAh5jIORWk8MzFnCpSTUruBgeyN9jZq1K/QI9uke0ATi3MHu4L8c59CnIi4+1jDKMuqmR71A==
"@esbuild/freebsd-x64@0.18.11":
version "0.18.11"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.11.tgz#c5de1199f70e1f97d5c8fca51afa9bf9a2af5969"
integrity sha512-XtuPrEfBj/YYYnAAB7KcorzzpGTvOr/dTtXPGesRfmflqhA4LMF0Gh/n5+a9JBzPuJ+CGk17CA++Hmr1F/gI0Q==
"@esbuild/linux-arm64@0.18.11":
version "0.18.11"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.11.tgz#2a6d3a74e0b8b5f294e22b4515b29f76ebd42660"
integrity sha512-c6Vh2WS9VFKxKZ2TvJdA7gdy0n6eSy+yunBvv4aqNCEhSWVor1TU43wNRp2YLO9Vng2G+W94aRz+ILDSwAiYog==
"@esbuild/linux-arm@0.18.11":
version "0.18.11"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.11.tgz#5175bd61b793b436e4aece6328aa0d9be07751e1"
integrity sha512-Idipz+Taso/toi2ETugShXjQ3S59b6m62KmLHkJlSq/cBejixmIydqrtM2XTvNCywFl3VC7SreSf6NV0i6sRyg==
"@esbuild/linux-ia32@0.18.11":
version "0.18.11"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.11.tgz#20ee6cfd65a398875f321a485e7b2278e5f6f67b"
integrity sha512-S3hkIF6KUqRh9n1Q0dSyYcWmcVa9Cg+mSoZEfFuzoYXXsk6196qndrM+ZiHNwpZKi3XOXpShZZ+9dfN5ykqjjw==
"@esbuild/linux-loong64@0.18.11":
version "0.18.11"
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.11.tgz#8e7b251dede75083bf44508dab5edce3f49d052b"
integrity sha512-MRESANOoObQINBA+RMZW+Z0TJWpibtE7cPFnahzyQHDCA9X9LOmGh68MVimZlM9J8n5Ia8lU773te6O3ILW8kw==
"@esbuild/linux-mips64el@0.18.11":
version "0.18.11"
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.11.tgz#a3125eb48538ac4932a9d05089b157f94e443165"
integrity sha512-qVyPIZrXNMOLYegtD1u8EBccCrBVshxMrn5MkuFc3mEVsw7CCQHaqZ4jm9hbn4gWY95XFnb7i4SsT3eflxZsUg==
"@esbuild/linux-ppc64@0.18.11":
version "0.18.11"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.11.tgz#842abadb7a0995bd539adee2be4d681b68279499"
integrity sha512-T3yd8vJXfPirZaUOoA9D2ZjxZX4Gr3QuC3GztBJA6PklLotc/7sXTOuuRkhE9W/5JvJP/K9b99ayPNAD+R+4qQ==
"@esbuild/linux-riscv64@0.18.11":
version "0.18.11"
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.11.tgz#7ce6e6cee1c72d5b4d2f4f8b6fcccf4a9bea0e28"
integrity sha512-evUoRPWiwuFk++snjH9e2cAjF5VVSTj+Dnf+rkO/Q20tRqv+644279TZlPK8nUGunjPAtQRCj1jQkDAvL6rm2w==
"@esbuild/linux-s390x@0.18.11":
version "0.18.11"
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.11.tgz#98fbc794363d02ded07d300df2e535650b297b96"
integrity sha512-/SlRJ15XR6i93gRWquRxYCfhTeC5PdqEapKoLbX63PLCmAkXZHY2uQm2l9bN0oPHBsOw2IswRZctMYS0MijFcg==
"@esbuild/linux-x64@0.18.11":
version "0.18.11"
resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.11.tgz#f8458ec8cf74c8274e4cacd00744d8446cac52eb"
integrity sha512-xcncej+wF16WEmIwPtCHi0qmx1FweBqgsRtEL1mSHLFR6/mb3GEZfLQnx+pUDfRDEM4DQF8dpXIW7eDOZl1IbA==
"@esbuild/netbsd-x64@0.18.11":
version "0.18.11"
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.11.tgz#a7b2f991b8293748a7be42eac1c4325faf0c7cca"
integrity sha512-aSjMHj/F7BuS1CptSXNg6S3M4F3bLp5wfFPIJM+Km2NfIVfFKhdmfHF9frhiCLIGVzDziggqWll0B+9AUbud/Q==
"@esbuild/openbsd-x64@0.18.11":
version "0.18.11"
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.11.tgz#3e50923de84c54008f834221130fd23646072b2f"
integrity sha512-tNBq+6XIBZtht0xJGv7IBB5XaSyvYPCm1PxJ33zLQONdZoLVM0bgGqUrXnJyiEguD9LU4AHiu+GCXy/Hm9LsdQ==
"@esbuild/sunos-x64@0.18.11":
version "0.18.11"
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.11.tgz#ae47a550b0cd395de03606ecfba03cc96c7c19e2"
integrity sha512-kxfbDOrH4dHuAAOhr7D7EqaYf+W45LsAOOhAet99EyuxxQmjbk8M9N4ezHcEiCYPaiW8Dj3K26Z2V17Gt6p3ng==
"@esbuild/win32-arm64@0.18.11":
version "0.18.11"
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.11.tgz#05d364582b7862d7fbf4698ef43644f7346dcfcc"
integrity sha512-Sh0dDRyk1Xi348idbal7lZyfSkjhJsdFeuC13zqdipsvMetlGiFQNdO+Yfp6f6B4FbyQm7qsk16yaZk25LChzg==
"@esbuild/win32-ia32@0.18.11":
version "0.18.11"
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.11.tgz#a3372095a4a1939da672156a3c104f8ce85ee616"
integrity sha512-o9JUIKF1j0rqJTFbIoF4bXj6rvrTZYOrfRcGyL0Vm5uJ/j5CkBD/51tpdxe9lXEDouhRgdr/BYzUrDOvrWwJpg==
"@esbuild/win32-x64@0.18.11":
version "0.18.11"
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.11.tgz#6526c7e1b40d5b9f0a222c6b767c22f6fb97aa57"
integrity sha512-rQI4cjLHd2hGsM1LqgDI7oOCYbQ6IBOVsX9ejuRMSze0GqXUG2ekwiKkiBU1pRGSeCqFFHxTrcEydB2Hyoz9CA==
"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2":
version "0.3.3"
resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098"
integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==
dependencies:
"@jridgewell/set-array" "^1.0.1"
"@jridgewell/sourcemap-codec" "^1.4.10"
"@jridgewell/trace-mapping" "^0.3.9"
"@jridgewell/resolve-uri@3.1.0":
version "3.1.0"
resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
"@jridgewell/set-array@^1.0.1":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
"@jridgewell/sourcemap-codec@1.4.14":
version "1.4.14"
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.15":
version "1.4.15"
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9":
version "0.3.18"
resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6"
integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==
dependencies:
"@jridgewell/resolve-uri" "3.1.0"
"@jridgewell/sourcemap-codec" "1.4.14"
"@nicolo-ribaudo/semver-v6@^6.3.3":
version "6.3.3"
resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz#ea6d23ade78a325f7a52750aab1526b02b628c29"
integrity sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==
"@types/babel__core@^7.1.20":
version "7.20.1"
resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.1.tgz#916ecea274b0c776fec721e333e55762d3a9614b"
integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==
dependencies:
"@babel/parser" "^7.20.7"
"@babel/types" "^7.20.7"
"@types/babel__generator" "*"
"@types/babel__template" "*"
"@types/babel__traverse" "*"
"@types/babel__generator@*":
version "7.6.4"
resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7"
integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==
dependencies:
"@babel/types" "^7.0.0"
"@types/babel__template@*":
version "7.4.1"
resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969"
integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==
dependencies:
"@babel/parser" "^7.1.0"
"@babel/types" "^7.0.0"
"@types/babel__traverse@*":
version "7.20.1"
resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.1.tgz#dd6f1d2411ae677dcb2db008c962598be31d6acf"
integrity sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==
dependencies:
"@babel/types" "^7.20.7"
acorn-walk@^8.2.0:
version "8.2.0"
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
address@^1.0.1:
version "1.2.2"
resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e"
integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==
ansi-styles@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
dependencies:
color-convert "^1.9.0"
babel-plugin-jsx-dom-expressions@^0.36.10:
version "0.36.10"
resolved "https://registry.yarnpkg.com/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.36.10.tgz#8f05f12b1c8622453ec4db48b95e5d1495fe497a"
integrity sha512-QA2k/14WGw+RgcGGnEuLWwnu4em6CGhjeXtjvgOYyFHYS2a+CzPeaVQHDOlfuiBcjq/3hWMspHMIMnPEOIzdBg==
dependencies:
"@babel/helper-module-imports" "7.18.6"
"@babel/plugin-syntax-jsx" "^7.18.6"
"@babel/types" "^7.20.7"
html-entities "2.3.3"
validate-html-nesting "^1.2.1"
babel-preset-solid@^1.7.2:
version "1.7.7"
resolved "https://registry.yarnpkg.com/babel-preset-solid/-/babel-preset-solid-1.7.7.tgz#316ad3e1c11083772358c3b7796a5ab234987a0e"
integrity sha512-tdxVzx3kgcIjNXAOmGRbzIhFBPeJjSakiN9yM+IYdL/+LtXNnbGqb0Va5tJb8Sjbk+QVEriovCyuzB5T7jeTvg==
dependencies:
babel-plugin-jsx-dom-expressions "^0.36.10"
big-integer@^1.6.44:
version "1.6.51"
resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686"
integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==
bplist-parser@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e"
integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==
dependencies:
big-integer "^1.6.44"
browserslist@^4.21.9:
version "4.21.9"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635"
integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==
dependencies:
caniuse-lite "^1.0.30001503"
electron-to-chromium "^1.4.431"
node-releases "^2.0.12"
update-browserslist-db "^1.0.11"
bundle-name@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a"
integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==
dependencies:
run-applescript "^5.0.0"
caniuse-lite@^1.0.30001503:
version "1.0.30001513"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001513.tgz#382fe5fbfb0f7abbaf8c55ca3ac71a0307a752e9"
integrity sha512-pnjGJo7SOOjAGytZZ203Em95MRM8Cr6jhCXNF/FAXTpCTRTECnqQWLpiTRqrFtdYcth8hf4WECUpkezuYsMVww==
chalk@^2.0.0:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
dependencies:
ansi-styles "^3.2.1"
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
color-convert@^1.9.0:
version "1.9.3"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
dependencies:
color-name "1.1.3"
color-name@1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
convert-source-map@^1.7.0:
version "1.9.0"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f"
integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
cross-spawn@^7.0.3:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
dependencies:
path-key "^3.1.0"
shebang-command "^2.0.0"
which "^2.0.1"
csstype@^3.1.0:
version "3.1.2"
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b"
integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==
debug@4, debug@^4.1.0:
version "4.3.4"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
dependencies:
ms "2.1.2"
default-browser-id@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c"
integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==
dependencies:
bplist-parser "^0.2.0"
untildify "^4.0.0"
default-browser@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-4.0.0.tgz#53c9894f8810bf86696de117a6ce9085a3cbc7da"
integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==
dependencies:
bundle-name "^3.0.0"
default-browser-id "^3.0.0"
execa "^7.1.1"
titleize "^3.0.0"
define-lazy-prop@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f"
integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==
detect-port@^1.5.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b"
integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==
dependencies:
address "^1.0.1"
debug "4"
dom-serializer@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53"
integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==
dependencies:
domelementtype "^2.3.0"
domhandler "^5.0.2"
entities "^4.2.0"
domelementtype@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d"
integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==
domhandler@^5.0.2, domhandler@^5.0.3:
version "5.0.3"
resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31"
integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==
dependencies:
domelementtype "^2.3.0"
domutils@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e"
integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==
dependencies:
dom-serializer "^2.0.0"
domelementtype "^2.3.0"
domhandler "^5.0.3"
electron-to-chromium@^1.4.431:
version "1.4.454"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.454.tgz#774dc7cb5e58576d0125939ec34a4182f3ccc87d"
integrity sha512-pmf1rbAStw8UEQ0sr2cdJtWl48ZMuPD9Sto8HVQOq9vx9j2WgDEN6lYoaqFvqEHYOmGA9oRGn7LqWI9ta0YugQ==
entities@^4.2.0, entities@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
esbuild@^0.18.10:
version "0.18.11"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.11.tgz#cbf94dc3359d57f600a0dbf281df9b1d1b4a156e"
integrity sha512-i8u6mQF0JKJUlGR3OdFLKldJQMMs8OqM9Cc3UCi9XXziJ9WERM5bfkHaEAy0YAvPRMgqSW55W7xYn84XtEFTtA==
optionalDependencies:
"@esbuild/android-arm" "0.18.11"
"@esbuild/android-arm64" "0.18.11"
"@esbuild/android-x64" "0.18.11"
"@esbuild/darwin-arm64" "0.18.11"
"@esbuild/darwin-x64" "0.18.11"
"@esbuild/freebsd-arm64" "0.18.11"
"@esbuild/freebsd-x64" "0.18.11"
"@esbuild/linux-arm" "0.18.11"
"@esbuild/linux-arm64" "0.18.11"
"@esbuild/linux-ia32" "0.18.11"
"@esbuild/linux-loong64" "0.18.11"
"@esbuild/linux-mips64el" "0.18.11"
"@esbuild/linux-ppc64" "0.18.11"
"@esbuild/linux-riscv64" "0.18.11"
"@esbuild/linux-s390x" "0.18.11"
"@esbuild/linux-x64" "0.18.11"
"@esbuild/netbsd-x64" "0.18.11"
"@esbuild/openbsd-x64" "0.18.11"
"@esbuild/sunos-x64" "0.18.11"
"@esbuild/win32-arm64" "0.18.11"
"@esbuild/win32-ia32" "0.18.11"
"@esbuild/win32-x64" "0.18.11"
escalade@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
escape-string-regexp@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
execa@^5.0.0:
version "5.1.1"
resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
dependencies:
cross-spawn "^7.0.3"
get-stream "^6.0.0"
human-signals "^2.1.0"
is-stream "^2.0.0"
merge-stream "^2.0.0"
npm-run-path "^4.0.1"
onetime "^5.1.2"
signal-exit "^3.0.3"
strip-final-newline "^2.0.0"
execa@^7.1.1:
version "7.1.1"
resolved "https://registry.yarnpkg.com/execa/-/execa-7.1.1.tgz#3eb3c83d239488e7b409d48e8813b76bb55c9c43"
integrity sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==
dependencies:
cross-spawn "^7.0.3"
get-stream "^6.0.1"
human-signals "^4.3.0"
is-stream "^3.0.0"
merge-stream "^2.0.0"
npm-run-path "^5.1.0"
onetime "^6.0.0"
signal-exit "^3.0.7"
strip-final-newline "^3.0.0"
fsevents@~2.3.2:
version "2.3.2"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
gensync@^1.0.0-beta.2:
version "1.0.0-beta.2"
resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
get-stream@^6.0.0, get-stream@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
globals@^11.1.0:
version "11.12.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
has-flag@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
html-entities@2.3.3:
version "2.3.3"
resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46"
integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==
htmlparser2@^9.0.0:
version "9.0.0"
resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-9.0.0.tgz#e431142b7eeb1d91672742dea48af8ac7140cddb"
integrity sha512-uxbSI98wmFT/G4P2zXx4OVx04qWUmyFPrD2/CNepa2Zo3GPNaCaaxElDgwUrwYWkK1nr9fft0Ya8dws8coDLLQ==
dependencies:
domelementtype "^2.3.0"
domhandler "^5.0.3"
domutils "^3.1.0"
entities "^4.5.0"
human-signals@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
human-signals@^4.3.0:
version "4.3.1"
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2"
integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==
is-docker@^2.0.0:
version "2.2.1"
resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
is-docker@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200"
integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==
is-inside-container@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4"
integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==
dependencies:
is-docker "^3.0.0"
is-stream@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
is-stream@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac"
integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==
is-what@^4.1.8:
version "4.1.15"
resolved "https://registry.yarnpkg.com/is-what/-/is-what-4.1.15.tgz#de43a81090417a425942d67b1ae86e7fae2eee0e"
integrity sha512-uKua1wfy3Yt+YqsD6mTUEa2zSi3G1oPlqTflgaPJ7z63vUGN5pxFpnQfeSLMFnJDEsdvOtkp1rUWkYjB4YfhgA==
is-wsl@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
dependencies:
is-docker "^2.0.0"
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
jsesc@^2.5.1:
version "2.5.2"
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
json5@^2.2.2:
version "2.2.3"
resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
lru-cache@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
dependencies:
yallist "^3.0.2"
magic-string@^0.30.1:
version "0.30.1"
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.1.tgz#ce5cd4b0a81a5d032bd69aab4522299b2166284d"
integrity sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==
dependencies:
"@jridgewell/sourcemap-codec" "^1.4.15"
merge-anything@^5.1.4:
version "5.1.7"
resolved "https://registry.yarnpkg.com/merge-anything/-/merge-anything-5.1.7.tgz#94f364d2b0cf21ac76067b5120e429353b3525d7"
integrity sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==
dependencies:
is-what "^4.1.8"
merge-stream@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
mimic-fn@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
mimic-fn@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc"
integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==
mrmime@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27"
integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==
ms@2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
nanoid@^3.3.6:
version "3.3.6"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c"
integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==
node-releases@^2.0.12:
version "2.0.13"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d"
integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==
npm-run-path@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
dependencies:
path-key "^3.0.0"
npm-run-path@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00"
integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==
dependencies:
path-key "^4.0.0"
onetime@^5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
dependencies:
mimic-fn "^2.1.0"
onetime@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4"
integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==
dependencies:
mimic-fn "^4.0.0"
open@^9.1.0:
version "9.1.0"
resolved "https://registry.yarnpkg.com/open/-/open-9.1.0.tgz#684934359c90ad25742f5a26151970ff8c6c80b6"
integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==
dependencies:
default-browser "^4.0.0"
define-lazy-prop "^3.0.0"
is-inside-container "^1.0.0"
is-wsl "^2.2.0"
path-key@^3.0.0, path-key@^3.1.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
path-key@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18"
integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==
picocolors@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
postcss@^8.4.24:
version "8.4.25"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.25.tgz#4a133f5e379eda7f61e906c3b1aaa9b81292726f"
integrity sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw==
dependencies:
nanoid "^3.3.6"
picocolors "^1.0.0"
source-map-js "^1.0.2"
rollup@^3.25.2:
version "3.26.2"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.26.2.tgz#2e76a37606cb523fc9fef43e6f59c93f86d95e7c"
integrity sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==
optionalDependencies:
fsevents "~2.3.2"
run-applescript@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-5.0.0.tgz#e11e1c932e055d5c6b40d98374e0268d9b11899c"
integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==
dependencies:
execa "^5.0.0"
seroval@^0.5.0:
version "0.5.1"
resolved "https://registry.yarnpkg.com/seroval/-/seroval-0.5.1.tgz#e6d17365cdaaae7e50815c7e0bcd7102facdadf3"
integrity sha512-ZfhQVB59hmIauJG5Ydynupy8KHyr5imGNtdDhbZG68Ufh1Ynkv9KOYOAABf71oVbQxJ8VkWnMHAjEHE7fWkH5g==
shebang-command@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
dependencies:
shebang-regex "^3.0.0"
shebang-regex@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
signal-exit@^3.0.3, signal-exit@^3.0.7:
version "3.0.7"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
solid-js@^1.7.7:
version "1.7.7"
resolved "https://registry.yarnpkg.com/solid-js/-/solid-js-1.7.7.tgz#c8b13ce5429983eae10010e11886432588bb4b5e"
integrity sha512-SPdYVke/Z6Za24PBTbULyQYPrhGO1ZbPany76atO2zF2dmYn2pCotbsw1JtlgWnr9dK2JbwPGnA3ODTGPLhZNw==
dependencies:
csstype "^3.1.0"
seroval "^0.5.0"
solid-refresh@^0.5.0:
version "0.5.3"
resolved "https://registry.yarnpkg.com/solid-refresh/-/solid-refresh-0.5.3.tgz#41b97fa1ee655d86125abda8e398861683f926b6"
integrity sha512-Otg5it5sjOdZbQZJnvo99TEBAr6J7PQ5AubZLNU6szZzg3RQQ5MX04oteBIIGDs0y2Qv8aXKm9e44V8z+UnFdw==
dependencies:
"@babel/generator" "^7.21.1"
"@babel/helper-module-imports" "^7.18.6"
"@babel/types" "^7.21.2"
source-map-js@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
strip-final-newline@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
strip-final-newline@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd"
integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==
supports-color@^5.3.0:
version "5.5.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
dependencies:
has-flag "^3.0.0"
systemjs@^6.14.1:
version "6.14.1"
resolved "https://registry.yarnpkg.com/systemjs/-/systemjs-6.14.1.tgz#95a580b91b50d0d69ff178ed4816f0ddbcea23c1"
integrity sha512-8ftwWd+XnQtZ/aGbatrN4QFNGrKJzmbtixW+ODpci7pyoTajg4sonPP8aFLESAcuVxaC1FyDESt+SpfFCH9rZQ==
titleize@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53"
integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==
to-fast-properties@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
untildify@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b"
integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==
update-browserslist-db@^1.0.11:
version "1.0.11"
resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940"
integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==
dependencies:
escalade "^3.1.1"
picocolors "^1.0.0"
validate-html-nesting@^1.2.1:
version "1.2.2"
resolved "https://registry.yarnpkg.com/validate-html-nesting/-/validate-html-nesting-1.2.2.tgz#2d74de14b598a0de671fad01bd71deabb93b8aca"
integrity sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==
vite-plugin-monkey@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/vite-plugin-monkey/-/vite-plugin-monkey-3.3.0.tgz#c26900098094117b7d91e3e65d4bfda52d2a908e"
integrity sha512-1tmGUjPNEGFdI5M6hwbZ+Sj5angz1tBhneHJ7lxSbGHdT3H8lLzXGL+QpaygCT/ogmBUFalofyduAWDBTyyV7g==
dependencies:
acorn-walk "^8.2.0"
cross-spawn "^7.0.3"
detect-port "^1.5.1"
htmlparser2 "^9.0.0"
magic-string "^0.30.1"
mrmime "^1.0.1"
open "^9.1.0"
picocolors "^1.0.0"
systemjs "^6.14.1"
vite-plugin-solid@^2.7.0:
version "2.7.0"
resolved "https://registry.yarnpkg.com/vite-plugin-solid/-/vite-plugin-solid-2.7.0.tgz#44de91335f30dfddd7f5f59a7019020860fcba2e"
integrity sha512-avp/Jl5zOp/Itfo67xtDB2O61U7idviaIp4mLsjhCa13PjKNasz+IID0jYTyqUp9SFx6/PmBr6v4KgDppqompg==
dependencies:
"@babel/core" "^7.20.5"
"@babel/preset-typescript" "^7.18.6"
"@types/babel__core" "^7.1.20"
babel-preset-solid "^1.7.2"
merge-anything "^5.1.4"
solid-refresh "^0.5.0"
vitefu "^0.2.3"
vite@^4.4.1:
version "4.4.1"
resolved "https://registry.yarnpkg.com/vite/-/vite-4.4.1.tgz#cfe0baf6af4b1b9f3b37c5ebf1e012622be3da98"
integrity sha512-8mmwPlsy7t+ZcTme7vdbVGuZ3Tri+lrLXr6hsF5UHdyYyARPPPMtM16QlqC9TZuCd5j3NmWs1rwka3cVSRHZTw==
dependencies:
esbuild "^0.18.10"
postcss "^8.4.24"
rollup "^3.25.2"
optionalDependencies:
fsevents "~2.3.2"
vitefu@^0.2.3:
version "0.2.4"
resolved "https://registry.yarnpkg.com/vitefu/-/vitefu-0.2.4.tgz#212dc1a9d0254afe65e579351bed4e25d81e0b35"
integrity sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==
which@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
dependencies:
isexe "^2.0.0"
yallist@^3.0.2:
version "3.1.1"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==