5761 lines
171 KiB
JavaScript
5761 lines
171 KiB
JavaScript
|
|
import { basename, camelize, classify, deepClone, isBrowser, isNuxtApp, isUrlString, kebabize, target } from "@vue/devtools-shared";
|
|||
|
|
import { debounce } from "perfect-debounce";
|
|||
|
|
import { createHooks } from "hookable";
|
|||
|
|
import { createBirpc, createBirpcGroup } from "birpc";
|
|||
|
|
|
|||
|
|
//#region rolldown:runtime
|
|||
|
|
var __create = Object.create;
|
|||
|
|
var __defProp = Object.defineProperty;
|
|||
|
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|||
|
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|||
|
|
var __getProtoOf = Object.getPrototypeOf;
|
|||
|
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|||
|
|
var __commonJS = (cb, mod) => function() {
|
|||
|
|
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|||
|
|
};
|
|||
|
|
var __copyProps = (to, from, except, desc) => {
|
|||
|
|
if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|||
|
|
key = keys[i];
|
|||
|
|
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
|
|||
|
|
get: ((k) => from[k]).bind(null, key),
|
|||
|
|
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
return to;
|
|||
|
|
};
|
|||
|
|
var __toESM = (mod, isNodeMode, target$1) => (target$1 = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target$1, "default", {
|
|||
|
|
value: mod,
|
|||
|
|
enumerable: true
|
|||
|
|
}) : target$1, mod));
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/compat/index.ts
|
|||
|
|
function onLegacyDevToolsPluginApiAvailable(cb) {
|
|||
|
|
if (target.__VUE_DEVTOOLS_PLUGIN_API_AVAILABLE__) {
|
|||
|
|
cb();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
Object.defineProperty(target, "__VUE_DEVTOOLS_PLUGIN_API_AVAILABLE__", {
|
|||
|
|
set(value) {
|
|||
|
|
if (value) cb();
|
|||
|
|
},
|
|||
|
|
configurable: true
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/component/utils/index.ts
|
|||
|
|
function getComponentTypeName(options) {
|
|||
|
|
const name = options.name || options._componentTag || options.__VUE_DEVTOOLS_COMPONENT_GUSSED_NAME__ || options.__name;
|
|||
|
|
if (name === "index" && options.__file?.endsWith("index.vue")) return "";
|
|||
|
|
return name;
|
|||
|
|
}
|
|||
|
|
function getComponentFileName(options) {
|
|||
|
|
const file = options.__file;
|
|||
|
|
if (file) return classify(basename(file, ".vue"));
|
|||
|
|
}
|
|||
|
|
function getComponentName(options) {
|
|||
|
|
const name = options.displayName || options.name || options._componentTag;
|
|||
|
|
if (name) return name;
|
|||
|
|
return getComponentFileName(options);
|
|||
|
|
}
|
|||
|
|
function saveComponentGussedName(instance, name) {
|
|||
|
|
instance.type.__VUE_DEVTOOLS_COMPONENT_GUSSED_NAME__ = name;
|
|||
|
|
return name;
|
|||
|
|
}
|
|||
|
|
function getAppRecord(instance) {
|
|||
|
|
if (instance.__VUE_DEVTOOLS_NEXT_APP_RECORD__) return instance.__VUE_DEVTOOLS_NEXT_APP_RECORD__;
|
|||
|
|
else if (instance.root) return instance.appContext.app.__VUE_DEVTOOLS_NEXT_APP_RECORD__;
|
|||
|
|
}
|
|||
|
|
async function getComponentId(options) {
|
|||
|
|
const { app, uid, instance } = options;
|
|||
|
|
try {
|
|||
|
|
if (instance.__VUE_DEVTOOLS_NEXT_UID__) return instance.__VUE_DEVTOOLS_NEXT_UID__;
|
|||
|
|
const appRecord = await getAppRecord(app);
|
|||
|
|
if (!appRecord) return null;
|
|||
|
|
const isRoot = appRecord.rootInstance === instance;
|
|||
|
|
return `${appRecord.id}:${isRoot ? "root" : uid}`;
|
|||
|
|
} catch (e) {}
|
|||
|
|
}
|
|||
|
|
function isFragment(instance) {
|
|||
|
|
const subTreeType = instance.subTree?.type;
|
|||
|
|
const appRecord = getAppRecord(instance);
|
|||
|
|
if (appRecord) return appRecord?.types?.Fragment === subTreeType;
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
function isBeingDestroyed(instance) {
|
|||
|
|
return instance._isBeingDestroyed || instance.isUnmounted;
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* Get the appropriate display name for an instance.
|
|||
|
|
*
|
|||
|
|
* @param {Vue} instance
|
|||
|
|
* @return {string}
|
|||
|
|
*/
|
|||
|
|
function getInstanceName(instance) {
|
|||
|
|
const name = getComponentTypeName(instance?.type || {});
|
|||
|
|
if (name) return name;
|
|||
|
|
if (instance?.root === instance) return "Root";
|
|||
|
|
for (const key in instance.parent?.type?.components) if (instance.parent.type.components[key] === instance?.type) return saveComponentGussedName(instance, key);
|
|||
|
|
for (const key in instance.appContext?.components) if (instance.appContext.components[key] === instance?.type) return saveComponentGussedName(instance, key);
|
|||
|
|
const fileName = getComponentFileName(instance?.type || {});
|
|||
|
|
if (fileName) return fileName;
|
|||
|
|
return "Anonymous Component";
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* Returns a devtools unique id for instance.
|
|||
|
|
* @param {Vue} instance
|
|||
|
|
*/
|
|||
|
|
function getUniqueComponentId(instance) {
|
|||
|
|
return `${instance?.appContext?.app?.__VUE_DEVTOOLS_NEXT_APP_RECORD_ID__ ?? 0}:${instance === instance?.root ? "root" : instance.uid}`;
|
|||
|
|
}
|
|||
|
|
function getRenderKey(value) {
|
|||
|
|
if (value == null) return "";
|
|||
|
|
if (typeof value === "number") return value;
|
|||
|
|
else if (typeof value === "string") return `'${value}'`;
|
|||
|
|
else if (Array.isArray(value)) return "Array";
|
|||
|
|
else return "Object";
|
|||
|
|
}
|
|||
|
|
function returnError(cb) {
|
|||
|
|
try {
|
|||
|
|
return cb();
|
|||
|
|
} catch (e) {
|
|||
|
|
return e;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
function getComponentInstance(appRecord, instanceId) {
|
|||
|
|
instanceId = instanceId || `${appRecord.id}:root`;
|
|||
|
|
return appRecord.instanceMap.get(instanceId) || appRecord.instanceMap.get(":root");
|
|||
|
|
}
|
|||
|
|
function ensurePropertyExists(obj, key, skipObjCheck = false) {
|
|||
|
|
return skipObjCheck ? key in obj : typeof obj === "object" && obj !== null ? key in obj : false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/component/state/bounding-rect.ts
|
|||
|
|
function createRect() {
|
|||
|
|
const rect = {
|
|||
|
|
top: 0,
|
|||
|
|
bottom: 0,
|
|||
|
|
left: 0,
|
|||
|
|
right: 0,
|
|||
|
|
get width() {
|
|||
|
|
return rect.right - rect.left;
|
|||
|
|
},
|
|||
|
|
get height() {
|
|||
|
|
return rect.bottom - rect.top;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
return rect;
|
|||
|
|
}
|
|||
|
|
let range;
|
|||
|
|
function getTextRect(node) {
|
|||
|
|
if (!range) range = document.createRange();
|
|||
|
|
range.selectNode(node);
|
|||
|
|
return range.getBoundingClientRect();
|
|||
|
|
}
|
|||
|
|
function getFragmentRect(vnode) {
|
|||
|
|
const rect = createRect();
|
|||
|
|
if (!vnode.children) return rect;
|
|||
|
|
for (let i = 0, l = vnode.children.length; i < l; i++) {
|
|||
|
|
const childVnode = vnode.children[i];
|
|||
|
|
let childRect;
|
|||
|
|
if (childVnode.component) childRect = getComponentBoundingRect(childVnode.component);
|
|||
|
|
else if (childVnode.el) {
|
|||
|
|
const el = childVnode.el;
|
|||
|
|
if (el.nodeType === 1 || el.getBoundingClientRect) childRect = el.getBoundingClientRect();
|
|||
|
|
else if (el.nodeType === 3 && el.data.trim()) childRect = getTextRect(el);
|
|||
|
|
}
|
|||
|
|
if (childRect) mergeRects(rect, childRect);
|
|||
|
|
}
|
|||
|
|
return rect;
|
|||
|
|
}
|
|||
|
|
function mergeRects(a, b) {
|
|||
|
|
if (!a.top || b.top < a.top) a.top = b.top;
|
|||
|
|
if (!a.bottom || b.bottom > a.bottom) a.bottom = b.bottom;
|
|||
|
|
if (!a.left || b.left < a.left) a.left = b.left;
|
|||
|
|
if (!a.right || b.right > a.right) a.right = b.right;
|
|||
|
|
return a;
|
|||
|
|
}
|
|||
|
|
const DEFAULT_RECT = {
|
|||
|
|
top: 0,
|
|||
|
|
left: 0,
|
|||
|
|
right: 0,
|
|||
|
|
bottom: 0,
|
|||
|
|
width: 0,
|
|||
|
|
height: 0
|
|||
|
|
};
|
|||
|
|
function getComponentBoundingRect(instance) {
|
|||
|
|
const el = instance.subTree.el;
|
|||
|
|
if (typeof window === "undefined") return DEFAULT_RECT;
|
|||
|
|
if (isFragment(instance)) return getFragmentRect(instance.subTree);
|
|||
|
|
else if (el?.nodeType === 1) return el?.getBoundingClientRect();
|
|||
|
|
else if (instance.subTree.component) return getComponentBoundingRect(instance.subTree.component);
|
|||
|
|
else return DEFAULT_RECT;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/component/tree/el.ts
|
|||
|
|
function getRootElementsFromComponentInstance(instance) {
|
|||
|
|
if (isFragment(instance)) return getFragmentRootElements(instance.subTree);
|
|||
|
|
if (!instance.subTree) return [];
|
|||
|
|
return [instance.subTree.el];
|
|||
|
|
}
|
|||
|
|
function getFragmentRootElements(vnode) {
|
|||
|
|
if (!vnode.children) return [];
|
|||
|
|
const list = [];
|
|||
|
|
vnode.children.forEach((childVnode) => {
|
|||
|
|
if (childVnode.component) list.push(...getRootElementsFromComponentInstance(childVnode.component));
|
|||
|
|
else if (childVnode?.el) list.push(childVnode.el);
|
|||
|
|
});
|
|||
|
|
return list;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/component-highlighter/index.ts
|
|||
|
|
const CONTAINER_ELEMENT_ID = "__vue-devtools-component-inspector__";
|
|||
|
|
const CARD_ELEMENT_ID = "__vue-devtools-component-inspector__card__";
|
|||
|
|
const COMPONENT_NAME_ELEMENT_ID = "__vue-devtools-component-inspector__name__";
|
|||
|
|
const INDICATOR_ELEMENT_ID = "__vue-devtools-component-inspector__indicator__";
|
|||
|
|
const containerStyles = {
|
|||
|
|
display: "block",
|
|||
|
|
zIndex: 2147483640,
|
|||
|
|
position: "fixed",
|
|||
|
|
backgroundColor: "#42b88325",
|
|||
|
|
border: "1px solid #42b88350",
|
|||
|
|
borderRadius: "5px",
|
|||
|
|
transition: "all 0.1s ease-in",
|
|||
|
|
pointerEvents: "none"
|
|||
|
|
};
|
|||
|
|
const cardStyles = {
|
|||
|
|
fontFamily: "Arial, Helvetica, sans-serif",
|
|||
|
|
padding: "5px 8px",
|
|||
|
|
borderRadius: "4px",
|
|||
|
|
textAlign: "left",
|
|||
|
|
position: "absolute",
|
|||
|
|
left: 0,
|
|||
|
|
color: "#e9e9e9",
|
|||
|
|
fontSize: "14px",
|
|||
|
|
fontWeight: 600,
|
|||
|
|
lineHeight: "24px",
|
|||
|
|
backgroundColor: "#42b883",
|
|||
|
|
boxShadow: "0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1)"
|
|||
|
|
};
|
|||
|
|
const indicatorStyles = {
|
|||
|
|
display: "inline-block",
|
|||
|
|
fontWeight: 400,
|
|||
|
|
fontStyle: "normal",
|
|||
|
|
fontSize: "12px",
|
|||
|
|
opacity: .7
|
|||
|
|
};
|
|||
|
|
function getContainerElement() {
|
|||
|
|
return document.getElementById(CONTAINER_ELEMENT_ID);
|
|||
|
|
}
|
|||
|
|
function getCardElement() {
|
|||
|
|
return document.getElementById(CARD_ELEMENT_ID);
|
|||
|
|
}
|
|||
|
|
function getIndicatorElement() {
|
|||
|
|
return document.getElementById(INDICATOR_ELEMENT_ID);
|
|||
|
|
}
|
|||
|
|
function getNameElement() {
|
|||
|
|
return document.getElementById(COMPONENT_NAME_ELEMENT_ID);
|
|||
|
|
}
|
|||
|
|
function getStyles(bounds) {
|
|||
|
|
return {
|
|||
|
|
left: `${Math.round(bounds.left * 100) / 100}px`,
|
|||
|
|
top: `${Math.round(bounds.top * 100) / 100}px`,
|
|||
|
|
width: `${Math.round(bounds.width * 100) / 100}px`,
|
|||
|
|
height: `${Math.round(bounds.height * 100) / 100}px`
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
function create(options) {
|
|||
|
|
const containerEl = document.createElement("div");
|
|||
|
|
containerEl.id = options.elementId ?? CONTAINER_ELEMENT_ID;
|
|||
|
|
Object.assign(containerEl.style, {
|
|||
|
|
...containerStyles,
|
|||
|
|
...getStyles(options.bounds),
|
|||
|
|
...options.style
|
|||
|
|
});
|
|||
|
|
const cardEl = document.createElement("span");
|
|||
|
|
cardEl.id = CARD_ELEMENT_ID;
|
|||
|
|
Object.assign(cardEl.style, {
|
|||
|
|
...cardStyles,
|
|||
|
|
top: options.bounds.top < 35 ? 0 : "-35px"
|
|||
|
|
});
|
|||
|
|
const nameEl = document.createElement("span");
|
|||
|
|
nameEl.id = COMPONENT_NAME_ELEMENT_ID;
|
|||
|
|
nameEl.innerHTML = `<${options.name}> `;
|
|||
|
|
const indicatorEl = document.createElement("i");
|
|||
|
|
indicatorEl.id = INDICATOR_ELEMENT_ID;
|
|||
|
|
indicatorEl.innerHTML = `${Math.round(options.bounds.width * 100) / 100} x ${Math.round(options.bounds.height * 100) / 100}`;
|
|||
|
|
Object.assign(indicatorEl.style, indicatorStyles);
|
|||
|
|
cardEl.appendChild(nameEl);
|
|||
|
|
cardEl.appendChild(indicatorEl);
|
|||
|
|
containerEl.appendChild(cardEl);
|
|||
|
|
document.body.appendChild(containerEl);
|
|||
|
|
return containerEl;
|
|||
|
|
}
|
|||
|
|
function update(options) {
|
|||
|
|
const containerEl = getContainerElement();
|
|||
|
|
const cardEl = getCardElement();
|
|||
|
|
const nameEl = getNameElement();
|
|||
|
|
const indicatorEl = getIndicatorElement();
|
|||
|
|
if (containerEl) {
|
|||
|
|
Object.assign(containerEl.style, {
|
|||
|
|
...containerStyles,
|
|||
|
|
...getStyles(options.bounds)
|
|||
|
|
});
|
|||
|
|
Object.assign(cardEl.style, { top: options.bounds.top < 35 ? 0 : "-35px" });
|
|||
|
|
nameEl.innerHTML = `<${options.name}> `;
|
|||
|
|
indicatorEl.innerHTML = `${Math.round(options.bounds.width * 100) / 100} x ${Math.round(options.bounds.height * 100) / 100}`;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
function highlight(instance) {
|
|||
|
|
const bounds = getComponentBoundingRect(instance);
|
|||
|
|
if (!bounds.width && !bounds.height) return;
|
|||
|
|
const name = getInstanceName(instance);
|
|||
|
|
getContainerElement() ? update({
|
|||
|
|
bounds,
|
|||
|
|
name
|
|||
|
|
}) : create({
|
|||
|
|
bounds,
|
|||
|
|
name
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
function unhighlight() {
|
|||
|
|
const el = getContainerElement();
|
|||
|
|
if (el) el.style.display = "none";
|
|||
|
|
}
|
|||
|
|
let inspectInstance = null;
|
|||
|
|
function inspectFn(e) {
|
|||
|
|
const target$1 = e.target;
|
|||
|
|
if (target$1) {
|
|||
|
|
const instance = target$1.__vueParentComponent;
|
|||
|
|
if (instance) {
|
|||
|
|
inspectInstance = instance;
|
|||
|
|
if (instance.vnode.el) {
|
|||
|
|
const bounds = getComponentBoundingRect(instance);
|
|||
|
|
const name = getInstanceName(instance);
|
|||
|
|
getContainerElement() ? update({
|
|||
|
|
bounds,
|
|||
|
|
name
|
|||
|
|
}) : create({
|
|||
|
|
bounds,
|
|||
|
|
name
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
function selectComponentFn(e, cb) {
|
|||
|
|
e.preventDefault();
|
|||
|
|
e.stopPropagation();
|
|||
|
|
if (inspectInstance) cb(getUniqueComponentId(inspectInstance));
|
|||
|
|
}
|
|||
|
|
let inspectComponentHighLighterSelectFn = null;
|
|||
|
|
function cancelInspectComponentHighLighter() {
|
|||
|
|
unhighlight();
|
|||
|
|
window.removeEventListener("mouseover", inspectFn);
|
|||
|
|
window.removeEventListener("click", inspectComponentHighLighterSelectFn, true);
|
|||
|
|
inspectComponentHighLighterSelectFn = null;
|
|||
|
|
}
|
|||
|
|
function inspectComponentHighLighter() {
|
|||
|
|
window.addEventListener("mouseover", inspectFn);
|
|||
|
|
return new Promise((resolve) => {
|
|||
|
|
function onSelect(e) {
|
|||
|
|
e.preventDefault();
|
|||
|
|
e.stopPropagation();
|
|||
|
|
selectComponentFn(e, (id) => {
|
|||
|
|
window.removeEventListener("click", onSelect, true);
|
|||
|
|
inspectComponentHighLighterSelectFn = null;
|
|||
|
|
window.removeEventListener("mouseover", inspectFn);
|
|||
|
|
const el = getContainerElement();
|
|||
|
|
if (el) el.style.display = "none";
|
|||
|
|
resolve(JSON.stringify({ id }));
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
inspectComponentHighLighterSelectFn = onSelect;
|
|||
|
|
window.addEventListener("click", onSelect, true);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
function scrollToComponent(options) {
|
|||
|
|
const instance = getComponentInstance(activeAppRecord.value, options.id);
|
|||
|
|
if (instance) {
|
|||
|
|
const [el] = getRootElementsFromComponentInstance(instance);
|
|||
|
|
if (typeof el.scrollIntoView === "function") el.scrollIntoView({ behavior: "smooth" });
|
|||
|
|
else {
|
|||
|
|
const bounds = getComponentBoundingRect(instance);
|
|||
|
|
const scrollTarget = document.createElement("div");
|
|||
|
|
const styles = {
|
|||
|
|
...getStyles(bounds),
|
|||
|
|
position: "absolute"
|
|||
|
|
};
|
|||
|
|
Object.assign(scrollTarget.style, styles);
|
|||
|
|
document.body.appendChild(scrollTarget);
|
|||
|
|
scrollTarget.scrollIntoView({ behavior: "smooth" });
|
|||
|
|
setTimeout(() => {
|
|||
|
|
document.body.removeChild(scrollTarget);
|
|||
|
|
}, 2e3);
|
|||
|
|
}
|
|||
|
|
setTimeout(() => {
|
|||
|
|
const bounds = getComponentBoundingRect(instance);
|
|||
|
|
if (bounds.width || bounds.height) {
|
|||
|
|
const name = getInstanceName(instance);
|
|||
|
|
const el$1 = getContainerElement();
|
|||
|
|
el$1 ? update({
|
|||
|
|
...options,
|
|||
|
|
name,
|
|||
|
|
bounds
|
|||
|
|
}) : create({
|
|||
|
|
...options,
|
|||
|
|
name,
|
|||
|
|
bounds
|
|||
|
|
});
|
|||
|
|
setTimeout(() => {
|
|||
|
|
if (el$1) el$1.style.display = "none";
|
|||
|
|
}, 1500);
|
|||
|
|
}
|
|||
|
|
}, 1200);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/component-inspector/index.ts
|
|||
|
|
target.__VUE_DEVTOOLS_COMPONENT_INSPECTOR_ENABLED__ ??= true;
|
|||
|
|
function toggleComponentInspectorEnabled(enabled) {
|
|||
|
|
target.__VUE_DEVTOOLS_COMPONENT_INSPECTOR_ENABLED__ = enabled;
|
|||
|
|
}
|
|||
|
|
function waitForInspectorInit(cb) {
|
|||
|
|
let total = 0;
|
|||
|
|
const timer = setInterval(() => {
|
|||
|
|
if (target.__VUE_INSPECTOR__) {
|
|||
|
|
clearInterval(timer);
|
|||
|
|
total += 30;
|
|||
|
|
cb();
|
|||
|
|
}
|
|||
|
|
if (total >= 5e3) clearInterval(timer);
|
|||
|
|
}, 30);
|
|||
|
|
}
|
|||
|
|
function setupInspector() {
|
|||
|
|
const inspector = target.__VUE_INSPECTOR__;
|
|||
|
|
const _openInEditor = inspector.openInEditor;
|
|||
|
|
inspector.openInEditor = async (...params) => {
|
|||
|
|
inspector.disable();
|
|||
|
|
_openInEditor(...params);
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
function getComponentInspector() {
|
|||
|
|
return new Promise((resolve) => {
|
|||
|
|
function setup() {
|
|||
|
|
setupInspector();
|
|||
|
|
resolve(target.__VUE_INSPECTOR__);
|
|||
|
|
}
|
|||
|
|
if (!target.__VUE_INSPECTOR__) waitForInspectorInit(() => {
|
|||
|
|
setup();
|
|||
|
|
});
|
|||
|
|
else setup();
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/shared/stub-vue.ts
|
|||
|
|
/**
|
|||
|
|
* To prevent include a **HUGE** vue package in the final bundle of chrome ext / electron
|
|||
|
|
* we stub the necessary vue module.
|
|||
|
|
* This implementation is based on the 1c3327a0fa5983aa9078e3f7bb2330f572435425 commit
|
|||
|
|
*/
|
|||
|
|
/**
|
|||
|
|
* @from [@vue/reactivity](https://github.com/vuejs/core/blob/1c3327a0fa5983aa9078e3f7bb2330f572435425/packages/reactivity/src/constants.ts#L17-L23)
|
|||
|
|
*/
|
|||
|
|
let ReactiveFlags = /* @__PURE__ */ function(ReactiveFlags$1) {
|
|||
|
|
ReactiveFlags$1["SKIP"] = "__v_skip";
|
|||
|
|
ReactiveFlags$1["IS_REACTIVE"] = "__v_isReactive";
|
|||
|
|
ReactiveFlags$1["IS_READONLY"] = "__v_isReadonly";
|
|||
|
|
ReactiveFlags$1["IS_SHALLOW"] = "__v_isShallow";
|
|||
|
|
ReactiveFlags$1["RAW"] = "__v_raw";
|
|||
|
|
return ReactiveFlags$1;
|
|||
|
|
}({});
|
|||
|
|
/**
|
|||
|
|
* @from [@vue/reactivity](https://github.com/vuejs/core/blob/1c3327a0fa5983aa9078e3f7bb2330f572435425/packages/reactivity/src/reactive.ts#L330-L332)
|
|||
|
|
*/
|
|||
|
|
function isReadonly(value) {
|
|||
|
|
return !!(value && value[ReactiveFlags.IS_READONLY]);
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* @from [@vue/reactivity](https://github.com/vuejs/core/blob/1c3327a0fa5983aa9078e3f7bb2330f572435425/packages/reactivity/src/reactive.ts#L312-L317)
|
|||
|
|
*/
|
|||
|
|
function isReactive$1(value) {
|
|||
|
|
if (isReadonly(value)) return isReactive$1(value[ReactiveFlags.RAW]);
|
|||
|
|
return !!(value && value[ReactiveFlags.IS_REACTIVE]);
|
|||
|
|
}
|
|||
|
|
function isRef$1(r) {
|
|||
|
|
return !!(r && r.__v_isRef === true);
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* @from [@vue/reactivity](https://github.com/vuejs/core/blob/1c3327a0fa5983aa9078e3f7bb2330f572435425/packages/reactivity/src/reactive.ts#L372-L375)
|
|||
|
|
*/
|
|||
|
|
function toRaw$1(observed) {
|
|||
|
|
const raw = observed && observed[ReactiveFlags.RAW];
|
|||
|
|
return raw ? toRaw$1(raw) : observed;
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* @from [@vue/runtime-core](https://github.com/vuejs/core/blob/1c3327a0fa5983aa9078e3f7bb2330f572435425/packages/runtime-core/src/vnode.ts#L63-L68)
|
|||
|
|
*/
|
|||
|
|
const Fragment = Symbol.for("v-fgt");
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/component/state/editor.ts
|
|||
|
|
var StateEditor = class {
|
|||
|
|
constructor() {
|
|||
|
|
this.refEditor = new RefStateEditor();
|
|||
|
|
}
|
|||
|
|
set(object, path, value, cb) {
|
|||
|
|
const sections = Array.isArray(path) ? path : path.split(".");
|
|||
|
|
while (sections.length > 1) {
|
|||
|
|
const section = sections.shift();
|
|||
|
|
if (object instanceof Map) object = object.get(section);
|
|||
|
|
else if (object instanceof Set) object = Array.from(object.values())[section];
|
|||
|
|
else object = object[section];
|
|||
|
|
if (this.refEditor.isRef(object)) object = this.refEditor.get(object);
|
|||
|
|
}
|
|||
|
|
const field = sections[0];
|
|||
|
|
const item = this.refEditor.get(object)[field];
|
|||
|
|
if (cb) cb(object, field, value);
|
|||
|
|
else if (this.refEditor.isRef(item)) this.refEditor.set(item, value);
|
|||
|
|
else object[field] = value;
|
|||
|
|
}
|
|||
|
|
get(object, path) {
|
|||
|
|
const sections = Array.isArray(path) ? path : path.split(".");
|
|||
|
|
for (let i = 0; i < sections.length; i++) {
|
|||
|
|
if (object instanceof Map) object = object.get(sections[i]);
|
|||
|
|
else object = object[sections[i]];
|
|||
|
|
if (this.refEditor.isRef(object)) object = this.refEditor.get(object);
|
|||
|
|
if (!object) return void 0;
|
|||
|
|
}
|
|||
|
|
return object;
|
|||
|
|
}
|
|||
|
|
has(object, path, parent = false) {
|
|||
|
|
if (typeof object === "undefined") return false;
|
|||
|
|
const sections = Array.isArray(path) ? path.slice() : path.split(".");
|
|||
|
|
const size = !parent ? 1 : 2;
|
|||
|
|
while (object && sections.length > size) {
|
|||
|
|
const section = sections.shift();
|
|||
|
|
object = object[section];
|
|||
|
|
if (this.refEditor.isRef(object)) object = this.refEditor.get(object);
|
|||
|
|
}
|
|||
|
|
return object != null && Object.prototype.hasOwnProperty.call(object, sections[0]);
|
|||
|
|
}
|
|||
|
|
createDefaultSetCallback(state) {
|
|||
|
|
return (object, field, value) => {
|
|||
|
|
if (state.remove || state.newKey) if (Array.isArray(object)) object.splice(field, 1);
|
|||
|
|
else if (toRaw$1(object) instanceof Map) object.delete(field);
|
|||
|
|
else if (toRaw$1(object) instanceof Set) object.delete(Array.from(object.values())[field]);
|
|||
|
|
else Reflect.deleteProperty(object, field);
|
|||
|
|
if (!state.remove) {
|
|||
|
|
const target$1 = object[state.newKey || field];
|
|||
|
|
if (this.refEditor.isRef(target$1)) this.refEditor.set(target$1, value);
|
|||
|
|
else if (toRaw$1(object) instanceof Map) object.set(state.newKey || field, value);
|
|||
|
|
else if (toRaw$1(object) instanceof Set) object.add(value);
|
|||
|
|
else object[state.newKey || field] = value;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var RefStateEditor = class {
|
|||
|
|
set(ref, value) {
|
|||
|
|
if (isRef$1(ref)) ref.value = value;
|
|||
|
|
else {
|
|||
|
|
if (ref instanceof Set && Array.isArray(value)) {
|
|||
|
|
ref.clear();
|
|||
|
|
value.forEach((v) => ref.add(v));
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
const currentKeys = Object.keys(value);
|
|||
|
|
if (ref instanceof Map) {
|
|||
|
|
const previousKeysSet$1 = new Set(ref.keys());
|
|||
|
|
currentKeys.forEach((key) => {
|
|||
|
|
ref.set(key, Reflect.get(value, key));
|
|||
|
|
previousKeysSet$1.delete(key);
|
|||
|
|
});
|
|||
|
|
previousKeysSet$1.forEach((key) => ref.delete(key));
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
const previousKeysSet = new Set(Object.keys(ref));
|
|||
|
|
currentKeys.forEach((key) => {
|
|||
|
|
Reflect.set(ref, key, Reflect.get(value, key));
|
|||
|
|
previousKeysSet.delete(key);
|
|||
|
|
});
|
|||
|
|
previousKeysSet.forEach((key) => Reflect.deleteProperty(ref, key));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
get(ref) {
|
|||
|
|
return isRef$1(ref) ? ref.value : ref;
|
|||
|
|
}
|
|||
|
|
isRef(ref) {
|
|||
|
|
return isRef$1(ref) || isReactive$1(ref);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
async function editComponentState(payload, stateEditor$1) {
|
|||
|
|
const { path, nodeId, state, type } = payload;
|
|||
|
|
const instance = getComponentInstance(activeAppRecord.value, nodeId);
|
|||
|
|
if (!instance) return;
|
|||
|
|
const targetPath = path.slice();
|
|||
|
|
let target$1;
|
|||
|
|
if (Object.keys(instance.props).includes(path[0])) target$1 = instance.props;
|
|||
|
|
else if (instance.devtoolsRawSetupState && Object.keys(instance.devtoolsRawSetupState).includes(path[0])) target$1 = instance.devtoolsRawSetupState;
|
|||
|
|
else if (instance.data && Object.keys(instance.data).includes(path[0])) target$1 = instance.data;
|
|||
|
|
else target$1 = instance.proxy;
|
|||
|
|
if (target$1 && targetPath) {
|
|||
|
|
if (state.type === "object" && type === "reactive") {}
|
|||
|
|
stateEditor$1.set(target$1, targetPath, state.value, stateEditor$1.createDefaultSetCallback(state));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
const stateEditor = new StateEditor();
|
|||
|
|
async function editState(payload) {
|
|||
|
|
editComponentState(payload, stateEditor);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/timeline/storage.ts
|
|||
|
|
const TIMELINE_LAYERS_STATE_STORAGE_ID = "__VUE_DEVTOOLS_KIT_TIMELINE_LAYERS_STATE__";
|
|||
|
|
function addTimelineLayersStateToStorage(state) {
|
|||
|
|
if (!isBrowser || typeof localStorage === "undefined" || localStorage === null) return;
|
|||
|
|
localStorage.setItem(TIMELINE_LAYERS_STATE_STORAGE_ID, JSON.stringify(state));
|
|||
|
|
}
|
|||
|
|
function getTimelineLayersStateFromStorage() {
|
|||
|
|
if (typeof window === "undefined" || !isBrowser || typeof localStorage === "undefined" || localStorage === null) return {
|
|||
|
|
recordingState: false,
|
|||
|
|
mouseEventEnabled: false,
|
|||
|
|
keyboardEventEnabled: false,
|
|||
|
|
componentEventEnabled: false,
|
|||
|
|
performanceEventEnabled: false,
|
|||
|
|
selected: ""
|
|||
|
|
};
|
|||
|
|
const state = typeof localStorage.getItem !== "undefined" ? localStorage.getItem(TIMELINE_LAYERS_STATE_STORAGE_ID) : null;
|
|||
|
|
return state ? JSON.parse(state) : {
|
|||
|
|
recordingState: false,
|
|||
|
|
mouseEventEnabled: false,
|
|||
|
|
keyboardEventEnabled: false,
|
|||
|
|
componentEventEnabled: false,
|
|||
|
|
performanceEventEnabled: false,
|
|||
|
|
selected: ""
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/ctx/timeline.ts
|
|||
|
|
target.__VUE_DEVTOOLS_KIT_TIMELINE_LAYERS ??= [];
|
|||
|
|
const devtoolsTimelineLayers = new Proxy(target.__VUE_DEVTOOLS_KIT_TIMELINE_LAYERS, { get(target$1, prop, receiver) {
|
|||
|
|
return Reflect.get(target$1, prop, receiver);
|
|||
|
|
} });
|
|||
|
|
function addTimelineLayer(options, descriptor) {
|
|||
|
|
devtoolsState.timelineLayersState[descriptor.id] = false;
|
|||
|
|
devtoolsTimelineLayers.push({
|
|||
|
|
...options,
|
|||
|
|
descriptorId: descriptor.id,
|
|||
|
|
appRecord: getAppRecord(descriptor.app)
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
function updateTimelineLayersState(state) {
|
|||
|
|
const updatedState = {
|
|||
|
|
...devtoolsState.timelineLayersState,
|
|||
|
|
...state
|
|||
|
|
};
|
|||
|
|
addTimelineLayersStateToStorage(updatedState);
|
|||
|
|
updateDevToolsState({ timelineLayersState: updatedState });
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/ctx/inspector.ts
|
|||
|
|
target.__VUE_DEVTOOLS_KIT_INSPECTOR__ ??= [];
|
|||
|
|
const devtoolsInspector = new Proxy(target.__VUE_DEVTOOLS_KIT_INSPECTOR__, { get(target$1, prop, receiver) {
|
|||
|
|
return Reflect.get(target$1, prop, receiver);
|
|||
|
|
} });
|
|||
|
|
const callInspectorUpdatedHook = debounce(() => {
|
|||
|
|
devtoolsContext.hooks.callHook(DevToolsMessagingHookKeys.SEND_INSPECTOR_TO_CLIENT, getActiveInspectors());
|
|||
|
|
});
|
|||
|
|
function addInspector(inspector, descriptor) {
|
|||
|
|
devtoolsInspector.push({
|
|||
|
|
options: inspector,
|
|||
|
|
descriptor,
|
|||
|
|
treeFilterPlaceholder: inspector.treeFilterPlaceholder ?? "Search tree...",
|
|||
|
|
stateFilterPlaceholder: inspector.stateFilterPlaceholder ?? "Search state...",
|
|||
|
|
treeFilter: "",
|
|||
|
|
selectedNodeId: "",
|
|||
|
|
appRecord: getAppRecord(descriptor.app)
|
|||
|
|
});
|
|||
|
|
callInspectorUpdatedHook();
|
|||
|
|
}
|
|||
|
|
function getActiveInspectors() {
|
|||
|
|
return devtoolsInspector.filter((inspector) => inspector.descriptor.app === activeAppRecord.value.app).filter((inspector) => inspector.descriptor.id !== "components").map((inspector) => {
|
|||
|
|
const descriptor = inspector.descriptor;
|
|||
|
|
const options = inspector.options;
|
|||
|
|
return {
|
|||
|
|
id: options.id,
|
|||
|
|
label: options.label,
|
|||
|
|
logo: descriptor.logo,
|
|||
|
|
icon: `custom-ic-baseline-${options?.icon?.replace(/_/g, "-")}`,
|
|||
|
|
packageName: descriptor.packageName,
|
|||
|
|
homepage: descriptor.homepage,
|
|||
|
|
pluginId: descriptor.id
|
|||
|
|
};
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
function getInspectorInfo(id) {
|
|||
|
|
const inspector = getInspector(id, activeAppRecord.value.app);
|
|||
|
|
if (!inspector) return;
|
|||
|
|
const descriptor = inspector.descriptor;
|
|||
|
|
const options = inspector.options;
|
|||
|
|
const timelineLayers = devtoolsTimelineLayers.filter((layer) => layer.descriptorId === descriptor.id).map((item) => ({
|
|||
|
|
id: item.id,
|
|||
|
|
label: item.label,
|
|||
|
|
color: item.color
|
|||
|
|
}));
|
|||
|
|
return {
|
|||
|
|
id: options.id,
|
|||
|
|
label: options.label,
|
|||
|
|
logo: descriptor.logo,
|
|||
|
|
packageName: descriptor.packageName,
|
|||
|
|
homepage: descriptor.homepage,
|
|||
|
|
timelineLayers,
|
|||
|
|
treeFilterPlaceholder: inspector.treeFilterPlaceholder,
|
|||
|
|
stateFilterPlaceholder: inspector.stateFilterPlaceholder
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
function getInspector(id, app) {
|
|||
|
|
return devtoolsInspector.find((inspector) => inspector.options.id === id && (app ? inspector.descriptor.app === app : true));
|
|||
|
|
}
|
|||
|
|
function getInspectorActions(id) {
|
|||
|
|
return getInspector(id)?.options.actions;
|
|||
|
|
}
|
|||
|
|
function getInspectorNodeActions(id) {
|
|||
|
|
return getInspector(id)?.options.nodeActions;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/ctx/hook.ts
|
|||
|
|
let DevToolsV6PluginAPIHookKeys = /* @__PURE__ */ function(DevToolsV6PluginAPIHookKeys$1) {
|
|||
|
|
DevToolsV6PluginAPIHookKeys$1["VISIT_COMPONENT_TREE"] = "visitComponentTree";
|
|||
|
|
DevToolsV6PluginAPIHookKeys$1["INSPECT_COMPONENT"] = "inspectComponent";
|
|||
|
|
DevToolsV6PluginAPIHookKeys$1["EDIT_COMPONENT_STATE"] = "editComponentState";
|
|||
|
|
DevToolsV6PluginAPIHookKeys$1["GET_INSPECTOR_TREE"] = "getInspectorTree";
|
|||
|
|
DevToolsV6PluginAPIHookKeys$1["GET_INSPECTOR_STATE"] = "getInspectorState";
|
|||
|
|
DevToolsV6PluginAPIHookKeys$1["EDIT_INSPECTOR_STATE"] = "editInspectorState";
|
|||
|
|
DevToolsV6PluginAPIHookKeys$1["INSPECT_TIMELINE_EVENT"] = "inspectTimelineEvent";
|
|||
|
|
DevToolsV6PluginAPIHookKeys$1["TIMELINE_CLEARED"] = "timelineCleared";
|
|||
|
|
DevToolsV6PluginAPIHookKeys$1["SET_PLUGIN_SETTINGS"] = "setPluginSettings";
|
|||
|
|
return DevToolsV6PluginAPIHookKeys$1;
|
|||
|
|
}({});
|
|||
|
|
let DevToolsContextHookKeys = /* @__PURE__ */ function(DevToolsContextHookKeys$1) {
|
|||
|
|
DevToolsContextHookKeys$1["ADD_INSPECTOR"] = "addInspector";
|
|||
|
|
DevToolsContextHookKeys$1["SEND_INSPECTOR_TREE"] = "sendInspectorTree";
|
|||
|
|
DevToolsContextHookKeys$1["SEND_INSPECTOR_STATE"] = "sendInspectorState";
|
|||
|
|
DevToolsContextHookKeys$1["CUSTOM_INSPECTOR_SELECT_NODE"] = "customInspectorSelectNode";
|
|||
|
|
DevToolsContextHookKeys$1["TIMELINE_LAYER_ADDED"] = "timelineLayerAdded";
|
|||
|
|
DevToolsContextHookKeys$1["TIMELINE_EVENT_ADDED"] = "timelineEventAdded";
|
|||
|
|
DevToolsContextHookKeys$1["GET_COMPONENT_INSTANCES"] = "getComponentInstances";
|
|||
|
|
DevToolsContextHookKeys$1["GET_COMPONENT_BOUNDS"] = "getComponentBounds";
|
|||
|
|
DevToolsContextHookKeys$1["GET_COMPONENT_NAME"] = "getComponentName";
|
|||
|
|
DevToolsContextHookKeys$1["COMPONENT_HIGHLIGHT"] = "componentHighlight";
|
|||
|
|
DevToolsContextHookKeys$1["COMPONENT_UNHIGHLIGHT"] = "componentUnhighlight";
|
|||
|
|
return DevToolsContextHookKeys$1;
|
|||
|
|
}({});
|
|||
|
|
let DevToolsMessagingHookKeys = /* @__PURE__ */ function(DevToolsMessagingHookKeys$1) {
|
|||
|
|
DevToolsMessagingHookKeys$1["SEND_INSPECTOR_TREE_TO_CLIENT"] = "sendInspectorTreeToClient";
|
|||
|
|
DevToolsMessagingHookKeys$1["SEND_INSPECTOR_STATE_TO_CLIENT"] = "sendInspectorStateToClient";
|
|||
|
|
DevToolsMessagingHookKeys$1["SEND_TIMELINE_EVENT_TO_CLIENT"] = "sendTimelineEventToClient";
|
|||
|
|
DevToolsMessagingHookKeys$1["SEND_INSPECTOR_TO_CLIENT"] = "sendInspectorToClient";
|
|||
|
|
DevToolsMessagingHookKeys$1["SEND_ACTIVE_APP_UNMOUNTED_TO_CLIENT"] = "sendActiveAppUpdatedToClient";
|
|||
|
|
DevToolsMessagingHookKeys$1["DEVTOOLS_STATE_UPDATED"] = "devtoolsStateUpdated";
|
|||
|
|
DevToolsMessagingHookKeys$1["DEVTOOLS_CONNECTED_UPDATED"] = "devtoolsConnectedUpdated";
|
|||
|
|
DevToolsMessagingHookKeys$1["ROUTER_INFO_UPDATED"] = "routerInfoUpdated";
|
|||
|
|
return DevToolsMessagingHookKeys$1;
|
|||
|
|
}({});
|
|||
|
|
function createDevToolsCtxHooks() {
|
|||
|
|
const hooks$1 = createHooks();
|
|||
|
|
hooks$1.hook(DevToolsContextHookKeys.ADD_INSPECTOR, ({ inspector, plugin }) => {
|
|||
|
|
addInspector(inspector, plugin.descriptor);
|
|||
|
|
});
|
|||
|
|
const debounceSendInspectorTree = debounce(async ({ inspectorId, plugin }) => {
|
|||
|
|
if (!inspectorId || !plugin?.descriptor?.app || devtoolsState.highPerfModeEnabled) return;
|
|||
|
|
const inspector = getInspector(inspectorId, plugin.descriptor.app);
|
|||
|
|
const _payload = {
|
|||
|
|
app: plugin.descriptor.app,
|
|||
|
|
inspectorId,
|
|||
|
|
filter: inspector?.treeFilter || "",
|
|||
|
|
rootNodes: []
|
|||
|
|
};
|
|||
|
|
await new Promise((resolve) => {
|
|||
|
|
hooks$1.callHookWith(async (callbacks) => {
|
|||
|
|
await Promise.all(callbacks.map((cb) => cb(_payload)));
|
|||
|
|
resolve();
|
|||
|
|
}, DevToolsV6PluginAPIHookKeys.GET_INSPECTOR_TREE);
|
|||
|
|
});
|
|||
|
|
hooks$1.callHookWith(async (callbacks) => {
|
|||
|
|
await Promise.all(callbacks.map((cb) => cb({
|
|||
|
|
inspectorId,
|
|||
|
|
rootNodes: _payload.rootNodes
|
|||
|
|
})));
|
|||
|
|
}, DevToolsMessagingHookKeys.SEND_INSPECTOR_TREE_TO_CLIENT);
|
|||
|
|
}, 120);
|
|||
|
|
hooks$1.hook(DevToolsContextHookKeys.SEND_INSPECTOR_TREE, debounceSendInspectorTree);
|
|||
|
|
const debounceSendInspectorState = debounce(async ({ inspectorId, plugin }) => {
|
|||
|
|
if (!inspectorId || !plugin?.descriptor?.app || devtoolsState.highPerfModeEnabled) return;
|
|||
|
|
const inspector = getInspector(inspectorId, plugin.descriptor.app);
|
|||
|
|
const _payload = {
|
|||
|
|
app: plugin.descriptor.app,
|
|||
|
|
inspectorId,
|
|||
|
|
nodeId: inspector?.selectedNodeId || "",
|
|||
|
|
state: null
|
|||
|
|
};
|
|||
|
|
const ctx = { currentTab: `custom-inspector:${inspectorId}` };
|
|||
|
|
if (_payload.nodeId) await new Promise((resolve) => {
|
|||
|
|
hooks$1.callHookWith(async (callbacks) => {
|
|||
|
|
await Promise.all(callbacks.map((cb) => cb(_payload, ctx)));
|
|||
|
|
resolve();
|
|||
|
|
}, DevToolsV6PluginAPIHookKeys.GET_INSPECTOR_STATE);
|
|||
|
|
});
|
|||
|
|
hooks$1.callHookWith(async (callbacks) => {
|
|||
|
|
await Promise.all(callbacks.map((cb) => cb({
|
|||
|
|
inspectorId,
|
|||
|
|
nodeId: _payload.nodeId,
|
|||
|
|
state: _payload.state
|
|||
|
|
})));
|
|||
|
|
}, DevToolsMessagingHookKeys.SEND_INSPECTOR_STATE_TO_CLIENT);
|
|||
|
|
}, 120);
|
|||
|
|
hooks$1.hook(DevToolsContextHookKeys.SEND_INSPECTOR_STATE, debounceSendInspectorState);
|
|||
|
|
hooks$1.hook(DevToolsContextHookKeys.CUSTOM_INSPECTOR_SELECT_NODE, ({ inspectorId, nodeId, plugin }) => {
|
|||
|
|
const inspector = getInspector(inspectorId, plugin.descriptor.app);
|
|||
|
|
if (!inspector) return;
|
|||
|
|
inspector.selectedNodeId = nodeId;
|
|||
|
|
});
|
|||
|
|
hooks$1.hook(DevToolsContextHookKeys.TIMELINE_LAYER_ADDED, ({ options, plugin }) => {
|
|||
|
|
addTimelineLayer(options, plugin.descriptor);
|
|||
|
|
});
|
|||
|
|
hooks$1.hook(DevToolsContextHookKeys.TIMELINE_EVENT_ADDED, ({ options, plugin }) => {
|
|||
|
|
if (devtoolsState.highPerfModeEnabled || !devtoolsState.timelineLayersState?.[plugin.descriptor.id] && ![
|
|||
|
|
"performance",
|
|||
|
|
"component-event",
|
|||
|
|
"keyboard",
|
|||
|
|
"mouse"
|
|||
|
|
].includes(options.layerId)) return;
|
|||
|
|
hooks$1.callHookWith(async (callbacks) => {
|
|||
|
|
await Promise.all(callbacks.map((cb) => cb(options)));
|
|||
|
|
}, DevToolsMessagingHookKeys.SEND_TIMELINE_EVENT_TO_CLIENT);
|
|||
|
|
});
|
|||
|
|
hooks$1.hook(DevToolsContextHookKeys.GET_COMPONENT_INSTANCES, async ({ app }) => {
|
|||
|
|
const appRecord = app.__VUE_DEVTOOLS_NEXT_APP_RECORD__;
|
|||
|
|
if (!appRecord) return null;
|
|||
|
|
const appId = appRecord.id.toString();
|
|||
|
|
return [...appRecord.instanceMap].filter(([key]) => key.split(":")[0] === appId).map(([, instance]) => instance);
|
|||
|
|
});
|
|||
|
|
hooks$1.hook(DevToolsContextHookKeys.GET_COMPONENT_BOUNDS, async ({ instance }) => {
|
|||
|
|
return getComponentBoundingRect(instance);
|
|||
|
|
});
|
|||
|
|
hooks$1.hook(DevToolsContextHookKeys.GET_COMPONENT_NAME, ({ instance }) => {
|
|||
|
|
return getInstanceName(instance);
|
|||
|
|
});
|
|||
|
|
hooks$1.hook(DevToolsContextHookKeys.COMPONENT_HIGHLIGHT, ({ uid }) => {
|
|||
|
|
const instance = activeAppRecord.value.instanceMap.get(uid);
|
|||
|
|
if (instance) highlight(instance);
|
|||
|
|
});
|
|||
|
|
hooks$1.hook(DevToolsContextHookKeys.COMPONENT_UNHIGHLIGHT, () => {
|
|||
|
|
unhighlight();
|
|||
|
|
});
|
|||
|
|
return hooks$1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/ctx/state.ts
|
|||
|
|
target.__VUE_DEVTOOLS_KIT_APP_RECORDS__ ??= [];
|
|||
|
|
target.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD__ ??= {};
|
|||
|
|
target.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD_ID__ ??= "";
|
|||
|
|
target.__VUE_DEVTOOLS_KIT_CUSTOM_TABS__ ??= [];
|
|||
|
|
target.__VUE_DEVTOOLS_KIT_CUSTOM_COMMANDS__ ??= [];
|
|||
|
|
const STATE_KEY = "__VUE_DEVTOOLS_KIT_GLOBAL_STATE__";
|
|||
|
|
function initStateFactory() {
|
|||
|
|
return {
|
|||
|
|
connected: false,
|
|||
|
|
clientConnected: false,
|
|||
|
|
vitePluginDetected: true,
|
|||
|
|
appRecords: [],
|
|||
|
|
activeAppRecordId: "",
|
|||
|
|
tabs: [],
|
|||
|
|
commands: [],
|
|||
|
|
highPerfModeEnabled: true,
|
|||
|
|
devtoolsClientDetected: {},
|
|||
|
|
perfUniqueGroupId: 0,
|
|||
|
|
timelineLayersState: getTimelineLayersStateFromStorage()
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
target[STATE_KEY] ??= initStateFactory();
|
|||
|
|
const callStateUpdatedHook = debounce((state) => {
|
|||
|
|
devtoolsContext.hooks.callHook(DevToolsMessagingHookKeys.DEVTOOLS_STATE_UPDATED, { state });
|
|||
|
|
});
|
|||
|
|
const callConnectedUpdatedHook = debounce((state, oldState) => {
|
|||
|
|
devtoolsContext.hooks.callHook(DevToolsMessagingHookKeys.DEVTOOLS_CONNECTED_UPDATED, {
|
|||
|
|
state,
|
|||
|
|
oldState
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
const devtoolsAppRecords = new Proxy(target.__VUE_DEVTOOLS_KIT_APP_RECORDS__, { get(_target, prop, receiver) {
|
|||
|
|
if (prop === "value") return target.__VUE_DEVTOOLS_KIT_APP_RECORDS__;
|
|||
|
|
return target.__VUE_DEVTOOLS_KIT_APP_RECORDS__[prop];
|
|||
|
|
} });
|
|||
|
|
const addDevToolsAppRecord = (app) => {
|
|||
|
|
target.__VUE_DEVTOOLS_KIT_APP_RECORDS__ = [...target.__VUE_DEVTOOLS_KIT_APP_RECORDS__, app];
|
|||
|
|
};
|
|||
|
|
const removeDevToolsAppRecord = (app) => {
|
|||
|
|
target.__VUE_DEVTOOLS_KIT_APP_RECORDS__ = devtoolsAppRecords.value.filter((record) => record.app !== app);
|
|||
|
|
};
|
|||
|
|
const activeAppRecord = new Proxy(target.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD__, { get(_target, prop, receiver) {
|
|||
|
|
if (prop === "value") return target.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD__;
|
|||
|
|
else if (prop === "id") return target.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD_ID__;
|
|||
|
|
return target.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD__[prop];
|
|||
|
|
} });
|
|||
|
|
function updateAllStates() {
|
|||
|
|
callStateUpdatedHook({
|
|||
|
|
...target[STATE_KEY],
|
|||
|
|
appRecords: devtoolsAppRecords.value,
|
|||
|
|
activeAppRecordId: activeAppRecord.id,
|
|||
|
|
tabs: target.__VUE_DEVTOOLS_KIT_CUSTOM_TABS__,
|
|||
|
|
commands: target.__VUE_DEVTOOLS_KIT_CUSTOM_COMMANDS__
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
function setActiveAppRecord(app) {
|
|||
|
|
target.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD__ = app;
|
|||
|
|
updateAllStates();
|
|||
|
|
}
|
|||
|
|
function setActiveAppRecordId(id) {
|
|||
|
|
target.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD_ID__ = id;
|
|||
|
|
updateAllStates();
|
|||
|
|
}
|
|||
|
|
const devtoolsState = new Proxy(target[STATE_KEY], {
|
|||
|
|
get(target$1, property) {
|
|||
|
|
if (property === "appRecords") return devtoolsAppRecords;
|
|||
|
|
else if (property === "activeAppRecordId") return activeAppRecord.id;
|
|||
|
|
else if (property === "tabs") return target.__VUE_DEVTOOLS_KIT_CUSTOM_TABS__;
|
|||
|
|
else if (property === "commands") return target.__VUE_DEVTOOLS_KIT_CUSTOM_COMMANDS__;
|
|||
|
|
return target[STATE_KEY][property];
|
|||
|
|
},
|
|||
|
|
deleteProperty(target$1, property) {
|
|||
|
|
delete target$1[property];
|
|||
|
|
return true;
|
|||
|
|
},
|
|||
|
|
set(target$1, property, value) {
|
|||
|
|
({ ...target[STATE_KEY] });
|
|||
|
|
target$1[property] = value;
|
|||
|
|
target[STATE_KEY][property] = value;
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
function resetDevToolsState() {
|
|||
|
|
Object.assign(target[STATE_KEY], initStateFactory());
|
|||
|
|
}
|
|||
|
|
function updateDevToolsState(state) {
|
|||
|
|
const oldState = {
|
|||
|
|
...target[STATE_KEY],
|
|||
|
|
appRecords: devtoolsAppRecords.value,
|
|||
|
|
activeAppRecordId: activeAppRecord.id
|
|||
|
|
};
|
|||
|
|
if (oldState.connected !== state.connected && state.connected || oldState.clientConnected !== state.clientConnected && state.clientConnected) callConnectedUpdatedHook(target[STATE_KEY], oldState);
|
|||
|
|
Object.assign(target[STATE_KEY], state);
|
|||
|
|
updateAllStates();
|
|||
|
|
}
|
|||
|
|
function onDevToolsConnected(fn) {
|
|||
|
|
return new Promise((resolve) => {
|
|||
|
|
if (devtoolsState.connected) {
|
|||
|
|
fn();
|
|||
|
|
resolve();
|
|||
|
|
}
|
|||
|
|
devtoolsContext.hooks.hook(DevToolsMessagingHookKeys.DEVTOOLS_CONNECTED_UPDATED, ({ state }) => {
|
|||
|
|
if (state.connected) {
|
|||
|
|
fn();
|
|||
|
|
resolve();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
const resolveIcon = (icon) => {
|
|||
|
|
if (!icon) return;
|
|||
|
|
if (icon.startsWith("baseline-")) return `custom-ic-${icon}`;
|
|||
|
|
if (icon.startsWith("i-") || isUrlString(icon)) return icon;
|
|||
|
|
return `custom-ic-baseline-${icon}`;
|
|||
|
|
};
|
|||
|
|
function addCustomTab(tab) {
|
|||
|
|
const tabs = target.__VUE_DEVTOOLS_KIT_CUSTOM_TABS__;
|
|||
|
|
if (tabs.some((t) => t.name === tab.name)) return;
|
|||
|
|
tabs.push({
|
|||
|
|
...tab,
|
|||
|
|
icon: resolveIcon(tab.icon)
|
|||
|
|
});
|
|||
|
|
updateAllStates();
|
|||
|
|
}
|
|||
|
|
function addCustomCommand(action) {
|
|||
|
|
const commands = target.__VUE_DEVTOOLS_KIT_CUSTOM_COMMANDS__;
|
|||
|
|
if (commands.some((t) => t.id === action.id)) return;
|
|||
|
|
commands.push({
|
|||
|
|
...action,
|
|||
|
|
icon: resolveIcon(action.icon),
|
|||
|
|
children: action.children ? action.children.map((child) => ({
|
|||
|
|
...child,
|
|||
|
|
icon: resolveIcon(child.icon)
|
|||
|
|
})) : void 0
|
|||
|
|
});
|
|||
|
|
updateAllStates();
|
|||
|
|
}
|
|||
|
|
function removeCustomCommand(actionId) {
|
|||
|
|
const commands = target.__VUE_DEVTOOLS_KIT_CUSTOM_COMMANDS__;
|
|||
|
|
const index = commands.findIndex((t) => t.id === actionId);
|
|||
|
|
if (index === -1) return;
|
|||
|
|
commands.splice(index, 1);
|
|||
|
|
updateAllStates();
|
|||
|
|
}
|
|||
|
|
function toggleClientConnected(state) {
|
|||
|
|
updateDevToolsState({ clientConnected: state });
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/open-in-editor/index.ts
|
|||
|
|
function setOpenInEditorBaseUrl(url) {
|
|||
|
|
target.__VUE_DEVTOOLS_OPEN_IN_EDITOR_BASE_URL__ = url;
|
|||
|
|
}
|
|||
|
|
function openInEditor(options = {}) {
|
|||
|
|
const { file, host, baseUrl = window.location.origin, line = 0, column = 0 } = options;
|
|||
|
|
if (file) {
|
|||
|
|
if (host === "chrome-extension") {
|
|||
|
|
const fileName = file.replace(/\\/g, "\\\\");
|
|||
|
|
const _baseUrl = window.VUE_DEVTOOLS_CONFIG?.openInEditorHost ?? "/";
|
|||
|
|
fetch(`${_baseUrl}__open-in-editor?file=${encodeURI(file)}`).then((response) => {
|
|||
|
|
if (!response.ok) {
|
|||
|
|
const msg = `Opening component ${fileName} failed`;
|
|||
|
|
console.log(`%c${msg}`, "color:red");
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
} else if (devtoolsState.vitePluginDetected) {
|
|||
|
|
const _baseUrl = target.__VUE_DEVTOOLS_OPEN_IN_EDITOR_BASE_URL__ ?? baseUrl;
|
|||
|
|
target.__VUE_INSPECTOR__.openInEditor(_baseUrl, file, line, column);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/ctx/plugin.ts
|
|||
|
|
target.__VUE_DEVTOOLS_KIT_PLUGIN_BUFFER__ ??= [];
|
|||
|
|
const devtoolsPluginBuffer = new Proxy(target.__VUE_DEVTOOLS_KIT_PLUGIN_BUFFER__, { get(target$1, prop, receiver) {
|
|||
|
|
return Reflect.get(target$1, prop, receiver);
|
|||
|
|
} });
|
|||
|
|
function addDevToolsPluginToBuffer(pluginDescriptor, setupFn) {
|
|||
|
|
devtoolsPluginBuffer.push([pluginDescriptor, setupFn]);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/plugin/plugin-settings.ts
|
|||
|
|
function _getSettings(settings) {
|
|||
|
|
const _settings = {};
|
|||
|
|
Object.keys(settings).forEach((key) => {
|
|||
|
|
_settings[key] = settings[key].defaultValue;
|
|||
|
|
});
|
|||
|
|
return _settings;
|
|||
|
|
}
|
|||
|
|
function getPluginLocalKey(pluginId) {
|
|||
|
|
return `__VUE_DEVTOOLS_NEXT_PLUGIN_SETTINGS__${pluginId}__`;
|
|||
|
|
}
|
|||
|
|
function getPluginSettingsOptions(pluginId) {
|
|||
|
|
return (devtoolsPluginBuffer.find((item) => item[0].id === pluginId && !!item[0]?.settings)?.[0] ?? null)?.settings ?? null;
|
|||
|
|
}
|
|||
|
|
function getPluginSettings(pluginId, fallbackValue) {
|
|||
|
|
const localKey = getPluginLocalKey(pluginId);
|
|||
|
|
if (localKey) {
|
|||
|
|
const localSettings = localStorage.getItem(localKey);
|
|||
|
|
if (localSettings) return JSON.parse(localSettings);
|
|||
|
|
}
|
|||
|
|
if (pluginId) return _getSettings((devtoolsPluginBuffer.find((item) => item[0].id === pluginId)?.[0] ?? null)?.settings ?? {});
|
|||
|
|
return _getSettings(fallbackValue);
|
|||
|
|
}
|
|||
|
|
function initPluginSettings(pluginId, settings) {
|
|||
|
|
const localKey = getPluginLocalKey(pluginId);
|
|||
|
|
if (!localStorage.getItem(localKey)) localStorage.setItem(localKey, JSON.stringify(_getSettings(settings)));
|
|||
|
|
}
|
|||
|
|
function setPluginSettings(pluginId, key, value) {
|
|||
|
|
const localKey = getPluginLocalKey(pluginId);
|
|||
|
|
const localSettings = localStorage.getItem(localKey);
|
|||
|
|
const parsedLocalSettings = JSON.parse(localSettings || "{}");
|
|||
|
|
const updated = {
|
|||
|
|
...parsedLocalSettings,
|
|||
|
|
[key]: value
|
|||
|
|
};
|
|||
|
|
localStorage.setItem(localKey, JSON.stringify(updated));
|
|||
|
|
devtoolsContext.hooks.callHookWith((callbacks) => {
|
|||
|
|
callbacks.forEach((cb) => cb({
|
|||
|
|
pluginId,
|
|||
|
|
key,
|
|||
|
|
oldValue: parsedLocalSettings[key],
|
|||
|
|
newValue: value,
|
|||
|
|
settings: updated
|
|||
|
|
}));
|
|||
|
|
}, DevToolsV6PluginAPIHookKeys.SET_PLUGIN_SETTINGS);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/types/hook.ts
|
|||
|
|
let DevToolsHooks = /* @__PURE__ */ function(DevToolsHooks$1) {
|
|||
|
|
DevToolsHooks$1["APP_INIT"] = "app:init";
|
|||
|
|
DevToolsHooks$1["APP_UNMOUNT"] = "app:unmount";
|
|||
|
|
DevToolsHooks$1["COMPONENT_UPDATED"] = "component:updated";
|
|||
|
|
DevToolsHooks$1["COMPONENT_ADDED"] = "component:added";
|
|||
|
|
DevToolsHooks$1["COMPONENT_REMOVED"] = "component:removed";
|
|||
|
|
DevToolsHooks$1["COMPONENT_EMIT"] = "component:emit";
|
|||
|
|
DevToolsHooks$1["PERFORMANCE_START"] = "perf:start";
|
|||
|
|
DevToolsHooks$1["PERFORMANCE_END"] = "perf:end";
|
|||
|
|
DevToolsHooks$1["ADD_ROUTE"] = "router:add-route";
|
|||
|
|
DevToolsHooks$1["REMOVE_ROUTE"] = "router:remove-route";
|
|||
|
|
DevToolsHooks$1["RENDER_TRACKED"] = "render:tracked";
|
|||
|
|
DevToolsHooks$1["RENDER_TRIGGERED"] = "render:triggered";
|
|||
|
|
DevToolsHooks$1["APP_CONNECTED"] = "app:connected";
|
|||
|
|
DevToolsHooks$1["SETUP_DEVTOOLS_PLUGIN"] = "devtools-plugin:setup";
|
|||
|
|
return DevToolsHooks$1;
|
|||
|
|
}({});
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/hook/index.ts
|
|||
|
|
const devtoolsHooks = target.__VUE_DEVTOOLS_HOOK ??= createHooks();
|
|||
|
|
const on = {
|
|||
|
|
vueAppInit(fn) {
|
|||
|
|
devtoolsHooks.hook(DevToolsHooks.APP_INIT, fn);
|
|||
|
|
},
|
|||
|
|
vueAppUnmount(fn) {
|
|||
|
|
devtoolsHooks.hook(DevToolsHooks.APP_UNMOUNT, fn);
|
|||
|
|
},
|
|||
|
|
vueAppConnected(fn) {
|
|||
|
|
devtoolsHooks.hook(DevToolsHooks.APP_CONNECTED, fn);
|
|||
|
|
},
|
|||
|
|
componentAdded(fn) {
|
|||
|
|
return devtoolsHooks.hook(DevToolsHooks.COMPONENT_ADDED, fn);
|
|||
|
|
},
|
|||
|
|
componentEmit(fn) {
|
|||
|
|
return devtoolsHooks.hook(DevToolsHooks.COMPONENT_EMIT, fn);
|
|||
|
|
},
|
|||
|
|
componentUpdated(fn) {
|
|||
|
|
return devtoolsHooks.hook(DevToolsHooks.COMPONENT_UPDATED, fn);
|
|||
|
|
},
|
|||
|
|
componentRemoved(fn) {
|
|||
|
|
return devtoolsHooks.hook(DevToolsHooks.COMPONENT_REMOVED, fn);
|
|||
|
|
},
|
|||
|
|
setupDevtoolsPlugin(fn) {
|
|||
|
|
devtoolsHooks.hook(DevToolsHooks.SETUP_DEVTOOLS_PLUGIN, fn);
|
|||
|
|
},
|
|||
|
|
perfStart(fn) {
|
|||
|
|
return devtoolsHooks.hook(DevToolsHooks.PERFORMANCE_START, fn);
|
|||
|
|
},
|
|||
|
|
perfEnd(fn) {
|
|||
|
|
return devtoolsHooks.hook(DevToolsHooks.PERFORMANCE_END, fn);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
function createDevToolsHook() {
|
|||
|
|
return {
|
|||
|
|
id: "vue-devtools-next",
|
|||
|
|
devtoolsVersion: "7.0",
|
|||
|
|
enabled: false,
|
|||
|
|
appRecords: [],
|
|||
|
|
apps: [],
|
|||
|
|
events: /* @__PURE__ */ new Map(),
|
|||
|
|
on(event, fn) {
|
|||
|
|
if (!this.events.has(event)) this.events.set(event, []);
|
|||
|
|
this.events.get(event)?.push(fn);
|
|||
|
|
return () => this.off(event, fn);
|
|||
|
|
},
|
|||
|
|
once(event, fn) {
|
|||
|
|
const onceFn = (...args) => {
|
|||
|
|
this.off(event, onceFn);
|
|||
|
|
fn(...args);
|
|||
|
|
};
|
|||
|
|
this.on(event, onceFn);
|
|||
|
|
return [event, onceFn];
|
|||
|
|
},
|
|||
|
|
off(event, fn) {
|
|||
|
|
if (this.events.has(event)) {
|
|||
|
|
const eventCallbacks = this.events.get(event);
|
|||
|
|
const index = eventCallbacks.indexOf(fn);
|
|||
|
|
if (index !== -1) eventCallbacks.splice(index, 1);
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
emit(event, ...payload) {
|
|||
|
|
if (this.events.has(event)) this.events.get(event).forEach((fn) => fn(...payload));
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
function subscribeDevToolsHook(hook$1) {
|
|||
|
|
hook$1.on(DevToolsHooks.APP_INIT, (app, version, types) => {
|
|||
|
|
if (app?._instance?.type?.devtools?.hide) return;
|
|||
|
|
devtoolsHooks.callHook(DevToolsHooks.APP_INIT, app, version, types);
|
|||
|
|
});
|
|||
|
|
hook$1.on(DevToolsHooks.APP_UNMOUNT, (app) => {
|
|||
|
|
devtoolsHooks.callHook(DevToolsHooks.APP_UNMOUNT, app);
|
|||
|
|
});
|
|||
|
|
hook$1.on(DevToolsHooks.COMPONENT_ADDED, async (app, uid, parentUid, component) => {
|
|||
|
|
if (app?._instance?.type?.devtools?.hide || devtoolsState.highPerfModeEnabled) return;
|
|||
|
|
if (!app || typeof uid !== "number" && !uid || !component) return;
|
|||
|
|
devtoolsHooks.callHook(DevToolsHooks.COMPONENT_ADDED, app, uid, parentUid, component);
|
|||
|
|
});
|
|||
|
|
hook$1.on(DevToolsHooks.COMPONENT_UPDATED, (app, uid, parentUid, component) => {
|
|||
|
|
if (!app || typeof uid !== "number" && !uid || !component || devtoolsState.highPerfModeEnabled) return;
|
|||
|
|
devtoolsHooks.callHook(DevToolsHooks.COMPONENT_UPDATED, app, uid, parentUid, component);
|
|||
|
|
});
|
|||
|
|
hook$1.on(DevToolsHooks.COMPONENT_REMOVED, async (app, uid, parentUid, component) => {
|
|||
|
|
if (!app || typeof uid !== "number" && !uid || !component || devtoolsState.highPerfModeEnabled) return;
|
|||
|
|
devtoolsHooks.callHook(DevToolsHooks.COMPONENT_REMOVED, app, uid, parentUid, component);
|
|||
|
|
});
|
|||
|
|
hook$1.on(DevToolsHooks.COMPONENT_EMIT, async (app, instance, event, params) => {
|
|||
|
|
if (!app || !instance || devtoolsState.highPerfModeEnabled) return;
|
|||
|
|
devtoolsHooks.callHook(DevToolsHooks.COMPONENT_EMIT, app, instance, event, params);
|
|||
|
|
});
|
|||
|
|
hook$1.on(DevToolsHooks.PERFORMANCE_START, (app, uid, vm, type, time) => {
|
|||
|
|
if (!app || devtoolsState.highPerfModeEnabled) return;
|
|||
|
|
devtoolsHooks.callHook(DevToolsHooks.PERFORMANCE_START, app, uid, vm, type, time);
|
|||
|
|
});
|
|||
|
|
hook$1.on(DevToolsHooks.PERFORMANCE_END, (app, uid, vm, type, time) => {
|
|||
|
|
if (!app || devtoolsState.highPerfModeEnabled) return;
|
|||
|
|
devtoolsHooks.callHook(DevToolsHooks.PERFORMANCE_END, app, uid, vm, type, time);
|
|||
|
|
});
|
|||
|
|
hook$1.on(DevToolsHooks.SETUP_DEVTOOLS_PLUGIN, (pluginDescriptor, setupFn, options) => {
|
|||
|
|
if (options?.target === "legacy") return;
|
|||
|
|
devtoolsHooks.callHook(DevToolsHooks.SETUP_DEVTOOLS_PLUGIN, pluginDescriptor, setupFn);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
const hook = {
|
|||
|
|
on,
|
|||
|
|
setupDevToolsPlugin(pluginDescriptor, setupFn) {
|
|||
|
|
return devtoolsHooks.callHook(DevToolsHooks.SETUP_DEVTOOLS_PLUGIN, pluginDescriptor, setupFn);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/api/v6/index.ts
|
|||
|
|
var DevToolsV6PluginAPI = class {
|
|||
|
|
constructor({ plugin, ctx }) {
|
|||
|
|
this.hooks = ctx.hooks;
|
|||
|
|
this.plugin = plugin;
|
|||
|
|
}
|
|||
|
|
get on() {
|
|||
|
|
return {
|
|||
|
|
visitComponentTree: (handler) => {
|
|||
|
|
this.hooks.hook(DevToolsV6PluginAPIHookKeys.VISIT_COMPONENT_TREE, handler);
|
|||
|
|
},
|
|||
|
|
inspectComponent: (handler) => {
|
|||
|
|
this.hooks.hook(DevToolsV6PluginAPIHookKeys.INSPECT_COMPONENT, handler);
|
|||
|
|
},
|
|||
|
|
editComponentState: (handler) => {
|
|||
|
|
this.hooks.hook(DevToolsV6PluginAPIHookKeys.EDIT_COMPONENT_STATE, handler);
|
|||
|
|
},
|
|||
|
|
getInspectorTree: (handler) => {
|
|||
|
|
this.hooks.hook(DevToolsV6PluginAPIHookKeys.GET_INSPECTOR_TREE, handler);
|
|||
|
|
},
|
|||
|
|
getInspectorState: (handler) => {
|
|||
|
|
this.hooks.hook(DevToolsV6PluginAPIHookKeys.GET_INSPECTOR_STATE, handler);
|
|||
|
|
},
|
|||
|
|
editInspectorState: (handler) => {
|
|||
|
|
this.hooks.hook(DevToolsV6PluginAPIHookKeys.EDIT_INSPECTOR_STATE, handler);
|
|||
|
|
},
|
|||
|
|
inspectTimelineEvent: (handler) => {
|
|||
|
|
this.hooks.hook(DevToolsV6PluginAPIHookKeys.INSPECT_TIMELINE_EVENT, handler);
|
|||
|
|
},
|
|||
|
|
timelineCleared: (handler) => {
|
|||
|
|
this.hooks.hook(DevToolsV6PluginAPIHookKeys.TIMELINE_CLEARED, handler);
|
|||
|
|
},
|
|||
|
|
setPluginSettings: (handler) => {
|
|||
|
|
this.hooks.hook(DevToolsV6PluginAPIHookKeys.SET_PLUGIN_SETTINGS, handler);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
notifyComponentUpdate(instance) {
|
|||
|
|
if (devtoolsState.highPerfModeEnabled) return;
|
|||
|
|
const inspector = getActiveInspectors().find((i) => i.packageName === this.plugin.descriptor.packageName);
|
|||
|
|
if (inspector?.id) {
|
|||
|
|
if (instance) {
|
|||
|
|
const args = [
|
|||
|
|
instance.appContext.app,
|
|||
|
|
instance.uid,
|
|||
|
|
instance.parent?.uid,
|
|||
|
|
instance
|
|||
|
|
];
|
|||
|
|
devtoolsHooks.callHook(DevToolsHooks.COMPONENT_UPDATED, ...args);
|
|||
|
|
} else devtoolsHooks.callHook(DevToolsHooks.COMPONENT_UPDATED);
|
|||
|
|
this.hooks.callHook(DevToolsContextHookKeys.SEND_INSPECTOR_STATE, {
|
|||
|
|
inspectorId: inspector.id,
|
|||
|
|
plugin: this.plugin
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
addInspector(options) {
|
|||
|
|
this.hooks.callHook(DevToolsContextHookKeys.ADD_INSPECTOR, {
|
|||
|
|
inspector: options,
|
|||
|
|
plugin: this.plugin
|
|||
|
|
});
|
|||
|
|
if (this.plugin.descriptor.settings) initPluginSettings(options.id, this.plugin.descriptor.settings);
|
|||
|
|
}
|
|||
|
|
sendInspectorTree(inspectorId) {
|
|||
|
|
if (devtoolsState.highPerfModeEnabled) return;
|
|||
|
|
this.hooks.callHook(DevToolsContextHookKeys.SEND_INSPECTOR_TREE, {
|
|||
|
|
inspectorId,
|
|||
|
|
plugin: this.plugin
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
sendInspectorState(inspectorId) {
|
|||
|
|
if (devtoolsState.highPerfModeEnabled) return;
|
|||
|
|
this.hooks.callHook(DevToolsContextHookKeys.SEND_INSPECTOR_STATE, {
|
|||
|
|
inspectorId,
|
|||
|
|
plugin: this.plugin
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
selectInspectorNode(inspectorId, nodeId) {
|
|||
|
|
this.hooks.callHook(DevToolsContextHookKeys.CUSTOM_INSPECTOR_SELECT_NODE, {
|
|||
|
|
inspectorId,
|
|||
|
|
nodeId,
|
|||
|
|
plugin: this.plugin
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
visitComponentTree(payload) {
|
|||
|
|
return this.hooks.callHook(DevToolsV6PluginAPIHookKeys.VISIT_COMPONENT_TREE, payload);
|
|||
|
|
}
|
|||
|
|
now() {
|
|||
|
|
if (devtoolsState.highPerfModeEnabled) return 0;
|
|||
|
|
return Date.now();
|
|||
|
|
}
|
|||
|
|
addTimelineLayer(options) {
|
|||
|
|
this.hooks.callHook(DevToolsContextHookKeys.TIMELINE_LAYER_ADDED, {
|
|||
|
|
options,
|
|||
|
|
plugin: this.plugin
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
addTimelineEvent(options) {
|
|||
|
|
if (devtoolsState.highPerfModeEnabled) return;
|
|||
|
|
this.hooks.callHook(DevToolsContextHookKeys.TIMELINE_EVENT_ADDED, {
|
|||
|
|
options,
|
|||
|
|
plugin: this.plugin
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
getSettings(pluginId) {
|
|||
|
|
return getPluginSettings(pluginId ?? this.plugin.descriptor.id, this.plugin.descriptor.settings);
|
|||
|
|
}
|
|||
|
|
getComponentInstances(app) {
|
|||
|
|
return this.hooks.callHook(DevToolsContextHookKeys.GET_COMPONENT_INSTANCES, { app });
|
|||
|
|
}
|
|||
|
|
getComponentBounds(instance) {
|
|||
|
|
return this.hooks.callHook(DevToolsContextHookKeys.GET_COMPONENT_BOUNDS, { instance });
|
|||
|
|
}
|
|||
|
|
getComponentName(instance) {
|
|||
|
|
return this.hooks.callHook(DevToolsContextHookKeys.GET_COMPONENT_NAME, { instance });
|
|||
|
|
}
|
|||
|
|
highlightElement(instance) {
|
|||
|
|
const uid = instance.__VUE_DEVTOOLS_NEXT_UID__;
|
|||
|
|
return this.hooks.callHook(DevToolsContextHookKeys.COMPONENT_HIGHLIGHT, { uid });
|
|||
|
|
}
|
|||
|
|
unhighlightElement() {
|
|||
|
|
return this.hooks.callHook(DevToolsContextHookKeys.COMPONENT_UNHIGHLIGHT);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/api/index.ts
|
|||
|
|
const DevToolsPluginAPI = DevToolsV6PluginAPI;
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/component/state/constants.ts
|
|||
|
|
const vueBuiltins = new Set([
|
|||
|
|
"nextTick",
|
|||
|
|
"defineComponent",
|
|||
|
|
"defineAsyncComponent",
|
|||
|
|
"defineCustomElement",
|
|||
|
|
"ref",
|
|||
|
|
"computed",
|
|||
|
|
"reactive",
|
|||
|
|
"readonly",
|
|||
|
|
"watchEffect",
|
|||
|
|
"watchPostEffect",
|
|||
|
|
"watchSyncEffect",
|
|||
|
|
"watch",
|
|||
|
|
"isRef",
|
|||
|
|
"unref",
|
|||
|
|
"toRef",
|
|||
|
|
"toRefs",
|
|||
|
|
"isProxy",
|
|||
|
|
"isReactive",
|
|||
|
|
"isReadonly",
|
|||
|
|
"shallowRef",
|
|||
|
|
"triggerRef",
|
|||
|
|
"customRef",
|
|||
|
|
"shallowReactive",
|
|||
|
|
"shallowReadonly",
|
|||
|
|
"toRaw",
|
|||
|
|
"markRaw",
|
|||
|
|
"effectScope",
|
|||
|
|
"getCurrentScope",
|
|||
|
|
"onScopeDispose",
|
|||
|
|
"onMounted",
|
|||
|
|
"onUpdated",
|
|||
|
|
"onUnmounted",
|
|||
|
|
"onBeforeMount",
|
|||
|
|
"onBeforeUpdate",
|
|||
|
|
"onBeforeUnmount",
|
|||
|
|
"onErrorCaptured",
|
|||
|
|
"onRenderTracked",
|
|||
|
|
"onRenderTriggered",
|
|||
|
|
"onActivated",
|
|||
|
|
"onDeactivated",
|
|||
|
|
"onServerPrefetch",
|
|||
|
|
"provide",
|
|||
|
|
"inject",
|
|||
|
|
"h",
|
|||
|
|
"mergeProps",
|
|||
|
|
"cloneVNode",
|
|||
|
|
"isVNode",
|
|||
|
|
"resolveComponent",
|
|||
|
|
"resolveDirective",
|
|||
|
|
"withDirectives",
|
|||
|
|
"withModifiers"
|
|||
|
|
]);
|
|||
|
|
const symbolRE = /^\[native Symbol Symbol\((.*)\)\]$/;
|
|||
|
|
const rawTypeRE = /^\[object (\w+)\]$/;
|
|||
|
|
const specialTypeRE = /^\[native (\w+) (.*?)(<>(([\s\S])*))?\]$/;
|
|||
|
|
const fnTypeRE = /^(?:function|class) (\w+)/;
|
|||
|
|
const MAX_STRING_SIZE = 1e4;
|
|||
|
|
const MAX_ARRAY_SIZE = 5e3;
|
|||
|
|
const UNDEFINED = "__vue_devtool_undefined__";
|
|||
|
|
const INFINITY = "__vue_devtool_infinity__";
|
|||
|
|
const NEGATIVE_INFINITY = "__vue_devtool_negative_infinity__";
|
|||
|
|
const NAN = "__vue_devtool_nan__";
|
|||
|
|
const ESC = {
|
|||
|
|
"<": "<",
|
|||
|
|
">": ">",
|
|||
|
|
"\"": """,
|
|||
|
|
"&": "&"
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/component/state/is.ts
|
|||
|
|
function isVueInstance(value) {
|
|||
|
|
if (!ensurePropertyExists(value, "_")) return false;
|
|||
|
|
if (!isPlainObject(value._)) return false;
|
|||
|
|
return Object.keys(value._).includes("vnode");
|
|||
|
|
}
|
|||
|
|
function isPlainObject(obj) {
|
|||
|
|
return Object.prototype.toString.call(obj) === "[object Object]";
|
|||
|
|
}
|
|||
|
|
function isPrimitive$1(data) {
|
|||
|
|
if (data == null) return true;
|
|||
|
|
const type = typeof data;
|
|||
|
|
return type === "string" || type === "number" || type === "boolean";
|
|||
|
|
}
|
|||
|
|
function isRef(raw) {
|
|||
|
|
return !!raw.__v_isRef;
|
|||
|
|
}
|
|||
|
|
function isComputed(raw) {
|
|||
|
|
return isRef(raw) && !!raw.effect;
|
|||
|
|
}
|
|||
|
|
function isReactive(raw) {
|
|||
|
|
return !!raw.__v_isReactive;
|
|||
|
|
}
|
|||
|
|
function isReadOnly(raw) {
|
|||
|
|
return !!raw.__v_isReadonly;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/component/state/util.ts
|
|||
|
|
const tokenMap = {
|
|||
|
|
[UNDEFINED]: "undefined",
|
|||
|
|
[NAN]: "NaN",
|
|||
|
|
[INFINITY]: "Infinity",
|
|||
|
|
[NEGATIVE_INFINITY]: "-Infinity"
|
|||
|
|
};
|
|||
|
|
const reversedTokenMap = Object.entries(tokenMap).reduce((acc, [key, value]) => {
|
|||
|
|
acc[value] = key;
|
|||
|
|
return acc;
|
|||
|
|
}, {});
|
|||
|
|
function internalStateTokenToString(value) {
|
|||
|
|
if (value === null) return "null";
|
|||
|
|
return typeof value === "string" && tokenMap[value] || false;
|
|||
|
|
}
|
|||
|
|
function replaceTokenToString(value) {
|
|||
|
|
const replaceRegex = new RegExp(`"(${Object.keys(tokenMap).join("|")})"`, "g");
|
|||
|
|
return value.replace(replaceRegex, (_, g1) => tokenMap[g1]);
|
|||
|
|
}
|
|||
|
|
function replaceStringToToken(value) {
|
|||
|
|
const literalValue = reversedTokenMap[value.trim()];
|
|||
|
|
if (literalValue) return `"${literalValue}"`;
|
|||
|
|
const replaceRegex = new RegExp(`:\\s*(${Object.keys(reversedTokenMap).join("|")})`, "g");
|
|||
|
|
return value.replace(replaceRegex, (_, g1) => `:"${reversedTokenMap[g1]}"`);
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* Convert prop type constructor to string.
|
|||
|
|
*/
|
|||
|
|
function getPropType(type) {
|
|||
|
|
if (Array.isArray(type)) return type.map((t) => getPropType(t)).join(" or ");
|
|||
|
|
if (type == null) return "null";
|
|||
|
|
const match = type.toString().match(fnTypeRE);
|
|||
|
|
return typeof type === "function" ? match && match[1] || "any" : "any";
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* Sanitize data to be posted to the other side.
|
|||
|
|
* Since the message posted is sent with structured clone,
|
|||
|
|
* we need to filter out any types that might cause an error.
|
|||
|
|
*/
|
|||
|
|
function sanitize(data) {
|
|||
|
|
if (!isPrimitive$1(data) && !Array.isArray(data) && !isPlainObject(data)) return Object.prototype.toString.call(data);
|
|||
|
|
else return data;
|
|||
|
|
}
|
|||
|
|
function getSetupStateType(raw) {
|
|||
|
|
try {
|
|||
|
|
return {
|
|||
|
|
ref: isRef(raw),
|
|||
|
|
computed: isComputed(raw),
|
|||
|
|
reactive: isReactive(raw),
|
|||
|
|
readonly: isReadOnly(raw)
|
|||
|
|
};
|
|||
|
|
} catch {
|
|||
|
|
return {
|
|||
|
|
ref: false,
|
|||
|
|
computed: false,
|
|||
|
|
reactive: false,
|
|||
|
|
readonly: false
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
function toRaw(value) {
|
|||
|
|
if (value?.__v_raw) return value.__v_raw;
|
|||
|
|
return value;
|
|||
|
|
}
|
|||
|
|
function escape(s) {
|
|||
|
|
return s.replace(/[<>"&]/g, (s$1) => {
|
|||
|
|
return ESC[s$1] || s$1;
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/component/state/process.ts
|
|||
|
|
function mergeOptions(to, from, instance) {
|
|||
|
|
if (typeof from === "function") from = from.options;
|
|||
|
|
if (!from) return to;
|
|||
|
|
const { mixins, extends: extendsOptions } = from;
|
|||
|
|
extendsOptions && mergeOptions(to, extendsOptions, instance);
|
|||
|
|
mixins && mixins.forEach((m) => mergeOptions(to, m, instance));
|
|||
|
|
for (const key of ["computed", "inject"]) if (Object.prototype.hasOwnProperty.call(from, key)) if (!to[key]) to[key] = from[key];
|
|||
|
|
else Object.assign(to[key], from[key]);
|
|||
|
|
return to;
|
|||
|
|
}
|
|||
|
|
function resolveMergedOptions(instance) {
|
|||
|
|
const raw = instance?.type;
|
|||
|
|
if (!raw) return {};
|
|||
|
|
const { mixins, extends: extendsOptions } = raw;
|
|||
|
|
const globalMixins = instance.appContext.mixins;
|
|||
|
|
if (!globalMixins.length && !mixins && !extendsOptions) return raw;
|
|||
|
|
const options = {};
|
|||
|
|
globalMixins.forEach((m) => mergeOptions(options, m, instance));
|
|||
|
|
mergeOptions(options, raw, instance);
|
|||
|
|
return options;
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* Process the props of an instance.
|
|||
|
|
* Make sure return a plain object because window.postMessage()
|
|||
|
|
* will throw an Error if the passed object contains Functions.
|
|||
|
|
*
|
|||
|
|
*/
|
|||
|
|
function processProps(instance) {
|
|||
|
|
const props = [];
|
|||
|
|
const propDefinitions = instance?.type?.props;
|
|||
|
|
for (const key in instance?.props) {
|
|||
|
|
const propDefinition = propDefinitions ? propDefinitions[key] : null;
|
|||
|
|
const camelizeKey = camelize(key);
|
|||
|
|
props.push({
|
|||
|
|
type: "props",
|
|||
|
|
key: camelizeKey,
|
|||
|
|
value: returnError(() => instance.props[key]),
|
|||
|
|
editable: true,
|
|||
|
|
meta: propDefinition ? {
|
|||
|
|
type: propDefinition.type ? getPropType(propDefinition.type) : "any",
|
|||
|
|
required: !!propDefinition.required,
|
|||
|
|
...propDefinition.default ? { default: propDefinition.default.toString() } : {}
|
|||
|
|
} : { type: "invalid" }
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
return props;
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* Process state, filtering out props and "clean" the result
|
|||
|
|
* with a JSON dance. This removes functions which can cause
|
|||
|
|
* errors during structured clone used by window.postMessage.
|
|||
|
|
*
|
|||
|
|
*/
|
|||
|
|
function processState(instance) {
|
|||
|
|
const type = instance.type;
|
|||
|
|
const props = type?.props;
|
|||
|
|
const getters = type.vuex && type.vuex.getters;
|
|||
|
|
const computedDefs = type.computed;
|
|||
|
|
const data = {
|
|||
|
|
...instance.data,
|
|||
|
|
...instance.renderContext
|
|||
|
|
};
|
|||
|
|
return Object.keys(data).filter((key) => !(props && key in props) && !(getters && key in getters) && !(computedDefs && key in computedDefs)).map((key) => ({
|
|||
|
|
key,
|
|||
|
|
type: "data",
|
|||
|
|
value: returnError(() => data[key]),
|
|||
|
|
editable: true
|
|||
|
|
}));
|
|||
|
|
}
|
|||
|
|
function getStateTypeAndName(info) {
|
|||
|
|
const stateType = info.computed ? "computed" : info.ref ? "ref" : info.reactive ? "reactive" : null;
|
|||
|
|
return {
|
|||
|
|
stateType,
|
|||
|
|
stateTypeName: stateType ? `${stateType.charAt(0).toUpperCase()}${stateType.slice(1)}` : null
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
function processSetupState(instance) {
|
|||
|
|
const raw = instance.devtoolsRawSetupState || {};
|
|||
|
|
return Object.keys(instance.setupState).filter((key) => !vueBuiltins.has(key) && key.split(/(?=[A-Z])/)[0] !== "use").map((key) => {
|
|||
|
|
const value = returnError(() => toRaw(instance.setupState[key]));
|
|||
|
|
const accessError = value instanceof Error;
|
|||
|
|
const rawData = raw[key];
|
|||
|
|
let result;
|
|||
|
|
let isOtherType = accessError || typeof value === "function" || ensurePropertyExists(value, "render") && typeof value.render === "function" || ensurePropertyExists(value, "__asyncLoader") && typeof value.__asyncLoader === "function" || typeof value === "object" && value && ("setup" in value || "props" in value) || /^v[A-Z]/.test(key);
|
|||
|
|
if (rawData && !accessError) {
|
|||
|
|
const info = getSetupStateType(rawData);
|
|||
|
|
const { stateType, stateTypeName } = getStateTypeAndName(info);
|
|||
|
|
const isState = info.ref || info.computed || info.reactive;
|
|||
|
|
const raw$1 = ensurePropertyExists(rawData, "effect") ? rawData.effect?.raw?.toString() || rawData.effect?.fn?.toString() : null;
|
|||
|
|
if (stateType) isOtherType = false;
|
|||
|
|
result = {
|
|||
|
|
...stateType ? {
|
|||
|
|
stateType,
|
|||
|
|
stateTypeName
|
|||
|
|
} : {},
|
|||
|
|
...raw$1 ? { raw: raw$1 } : {},
|
|||
|
|
editable: isState && !info.readonly
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
return {
|
|||
|
|
key,
|
|||
|
|
value,
|
|||
|
|
type: isOtherType ? "setup (other)" : "setup",
|
|||
|
|
...result
|
|||
|
|
};
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* Process the computed properties of an instance.
|
|||
|
|
*/
|
|||
|
|
function processComputed(instance, mergedType) {
|
|||
|
|
const type = mergedType;
|
|||
|
|
const computed = [];
|
|||
|
|
const defs = type.computed || {};
|
|||
|
|
for (const key in defs) {
|
|||
|
|
const def = defs[key];
|
|||
|
|
const type$1 = typeof def === "function" && def.vuex ? "vuex bindings" : "computed";
|
|||
|
|
computed.push({
|
|||
|
|
type: type$1,
|
|||
|
|
key,
|
|||
|
|
value: returnError(() => instance?.proxy?.[key]),
|
|||
|
|
editable: typeof def.set === "function"
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
return computed;
|
|||
|
|
}
|
|||
|
|
function processAttrs(instance) {
|
|||
|
|
return Object.keys(instance.attrs).map((key) => ({
|
|||
|
|
type: "attrs",
|
|||
|
|
key,
|
|||
|
|
value: returnError(() => instance.attrs[key])
|
|||
|
|
}));
|
|||
|
|
}
|
|||
|
|
function processProvide(instance) {
|
|||
|
|
return Reflect.ownKeys(instance.provides).map((key) => ({
|
|||
|
|
type: "provided",
|
|||
|
|
key: key.toString(),
|
|||
|
|
value: returnError(() => instance.provides[key])
|
|||
|
|
}));
|
|||
|
|
}
|
|||
|
|
function processInject(instance, mergedType) {
|
|||
|
|
if (!mergedType?.inject) return [];
|
|||
|
|
let keys = [];
|
|||
|
|
let defaultValue;
|
|||
|
|
if (Array.isArray(mergedType.inject)) keys = mergedType.inject.map((key) => ({
|
|||
|
|
key,
|
|||
|
|
originalKey: key
|
|||
|
|
}));
|
|||
|
|
else keys = Reflect.ownKeys(mergedType.inject).map((key) => {
|
|||
|
|
const value = mergedType.inject[key];
|
|||
|
|
let originalKey;
|
|||
|
|
if (typeof value === "string" || typeof value === "symbol") originalKey = value;
|
|||
|
|
else {
|
|||
|
|
originalKey = value.from;
|
|||
|
|
defaultValue = value.default;
|
|||
|
|
}
|
|||
|
|
return {
|
|||
|
|
key,
|
|||
|
|
originalKey
|
|||
|
|
};
|
|||
|
|
});
|
|||
|
|
return keys.map(({ key, originalKey }) => ({
|
|||
|
|
type: "injected",
|
|||
|
|
key: originalKey && key !== originalKey ? `${originalKey.toString()} ➞ ${key.toString()}` : key.toString(),
|
|||
|
|
value: returnError(() => instance.ctx.hasOwnProperty(key) ? instance.ctx[key] : instance.provides.hasOwnProperty(originalKey) ? instance.provides[originalKey] : defaultValue)
|
|||
|
|
}));
|
|||
|
|
}
|
|||
|
|
function processRefs(instance) {
|
|||
|
|
return Object.keys(instance.refs).map((key) => ({
|
|||
|
|
type: "template refs",
|
|||
|
|
key,
|
|||
|
|
value: returnError(() => instance.refs[key])
|
|||
|
|
}));
|
|||
|
|
}
|
|||
|
|
function processEventListeners(instance) {
|
|||
|
|
const emitsDefinition = instance.type.emits;
|
|||
|
|
const declaredEmits = Array.isArray(emitsDefinition) ? emitsDefinition : Object.keys(emitsDefinition ?? {});
|
|||
|
|
const keys = Object.keys(instance?.vnode?.props ?? {});
|
|||
|
|
const result = [];
|
|||
|
|
for (const key of keys) {
|
|||
|
|
const [prefix, ...eventNameParts] = key.split(/(?=[A-Z])/);
|
|||
|
|
if (prefix === "on") {
|
|||
|
|
const eventName = eventNameParts.join("-").toLowerCase();
|
|||
|
|
const isDeclared = declaredEmits.includes(eventName);
|
|||
|
|
result.push({
|
|||
|
|
type: "event listeners",
|
|||
|
|
key: eventName,
|
|||
|
|
value: { _custom: {
|
|||
|
|
displayText: isDeclared ? "✅ Declared" : "⚠️ Not declared",
|
|||
|
|
key: isDeclared ? "✅ Declared" : "⚠️ Not declared",
|
|||
|
|
value: isDeclared ? "✅ Declared" : "⚠️ Not declared",
|
|||
|
|
tooltipText: !isDeclared ? `The event <code>${eventName}</code> is not declared in the <code>emits</code> option. It will leak into the component's attributes (<code>$attrs</code>).` : null
|
|||
|
|
} }
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
function processInstanceState(instance) {
|
|||
|
|
const mergedType = resolveMergedOptions(instance);
|
|||
|
|
return processProps(instance).concat(processState(instance), processSetupState(instance), processComputed(instance, mergedType), processAttrs(instance), processProvide(instance), processInject(instance, mergedType), processRefs(instance), processEventListeners(instance));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/component/state/index.ts
|
|||
|
|
function getInstanceState(params) {
|
|||
|
|
const instance = getComponentInstance(activeAppRecord.value, params.instanceId);
|
|||
|
|
return {
|
|||
|
|
id: getUniqueComponentId(instance),
|
|||
|
|
name: getInstanceName(instance),
|
|||
|
|
file: instance?.type?.__file,
|
|||
|
|
state: processInstanceState(instance),
|
|||
|
|
instance
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/component/tree/filter.ts
|
|||
|
|
var ComponentFilter = class {
|
|||
|
|
constructor(filter) {
|
|||
|
|
this.filter = filter || "";
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* Check if an instance is qualified.
|
|||
|
|
*
|
|||
|
|
* @param {Vue|Vnode} instance
|
|||
|
|
* @return {boolean}
|
|||
|
|
*/
|
|||
|
|
isQualified(instance) {
|
|||
|
|
const name = getInstanceName(instance);
|
|||
|
|
return classify(name).toLowerCase().includes(this.filter) || kebabize(name).toLowerCase().includes(this.filter);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
function createComponentFilter(filterText) {
|
|||
|
|
return new ComponentFilter(filterText);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/component/tree/walker.ts
|
|||
|
|
var ComponentWalker = class {
|
|||
|
|
constructor(options) {
|
|||
|
|
this.captureIds = /* @__PURE__ */ new Map();
|
|||
|
|
const { filterText = "", maxDepth, recursively, api } = options;
|
|||
|
|
this.componentFilter = createComponentFilter(filterText);
|
|||
|
|
this.maxDepth = maxDepth;
|
|||
|
|
this.recursively = recursively;
|
|||
|
|
this.api = api;
|
|||
|
|
}
|
|||
|
|
getComponentTree(instance) {
|
|||
|
|
this.captureIds = /* @__PURE__ */ new Map();
|
|||
|
|
return this.findQualifiedChildren(instance, 0);
|
|||
|
|
}
|
|||
|
|
getComponentParents(instance) {
|
|||
|
|
this.captureIds = /* @__PURE__ */ new Map();
|
|||
|
|
const parents = [];
|
|||
|
|
this.captureId(instance);
|
|||
|
|
let parent = instance;
|
|||
|
|
while (parent = parent.parent) {
|
|||
|
|
this.captureId(parent);
|
|||
|
|
parents.push(parent);
|
|||
|
|
}
|
|||
|
|
return parents;
|
|||
|
|
}
|
|||
|
|
captureId(instance) {
|
|||
|
|
if (!instance) return null;
|
|||
|
|
const id = instance.__VUE_DEVTOOLS_NEXT_UID__ != null ? instance.__VUE_DEVTOOLS_NEXT_UID__ : getUniqueComponentId(instance);
|
|||
|
|
instance.__VUE_DEVTOOLS_NEXT_UID__ = id;
|
|||
|
|
if (this.captureIds.has(id)) return null;
|
|||
|
|
else this.captureIds.set(id, void 0);
|
|||
|
|
this.mark(instance);
|
|||
|
|
return id;
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* Capture the meta information of an instance. (recursive)
|
|||
|
|
*
|
|||
|
|
* @param {Vue} instance
|
|||
|
|
* @return {object}
|
|||
|
|
*/
|
|||
|
|
async capture(instance, depth) {
|
|||
|
|
if (!instance) return null;
|
|||
|
|
const id = this.captureId(instance);
|
|||
|
|
const name = getInstanceName(instance);
|
|||
|
|
const children = this.getInternalInstanceChildren(instance.subTree).filter((child) => !isBeingDestroyed(child));
|
|||
|
|
const parents = this.getComponentParents(instance) || [];
|
|||
|
|
const inactive = !!instance.isDeactivated || parents.some((parent) => parent.isDeactivated);
|
|||
|
|
const treeNode = {
|
|||
|
|
uid: instance.uid,
|
|||
|
|
id,
|
|||
|
|
name,
|
|||
|
|
renderKey: getRenderKey(instance.vnode ? instance.vnode.key : null),
|
|||
|
|
inactive,
|
|||
|
|
children: [],
|
|||
|
|
isFragment: isFragment(instance),
|
|||
|
|
tags: typeof instance.type !== "function" ? [] : [{
|
|||
|
|
label: "functional",
|
|||
|
|
textColor: 5592405,
|
|||
|
|
backgroundColor: 15658734
|
|||
|
|
}],
|
|||
|
|
autoOpen: this.recursively,
|
|||
|
|
file: instance.type.__file || ""
|
|||
|
|
};
|
|||
|
|
if (depth < this.maxDepth || instance.type.__isKeepAlive || parents.some((parent) => parent.type.__isKeepAlive)) treeNode.children = await Promise.all(children.map((child) => this.capture(child, depth + 1)).filter(Boolean));
|
|||
|
|
if (this.isKeepAlive(instance)) {
|
|||
|
|
const cachedComponents = this.getKeepAliveCachedInstances(instance);
|
|||
|
|
const childrenIds = children.map((child) => child.__VUE_DEVTOOLS_NEXT_UID__);
|
|||
|
|
for (const cachedChild of cachedComponents) if (!childrenIds.includes(cachedChild.__VUE_DEVTOOLS_NEXT_UID__)) {
|
|||
|
|
const node = await this.capture({
|
|||
|
|
...cachedChild,
|
|||
|
|
isDeactivated: true
|
|||
|
|
}, depth + 1);
|
|||
|
|
if (node) treeNode.children.push(node);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
const firstElement = getRootElementsFromComponentInstance(instance)[0];
|
|||
|
|
if (firstElement?.parentElement) {
|
|||
|
|
const parentInstance = instance.parent;
|
|||
|
|
const parentRootElements = parentInstance ? getRootElementsFromComponentInstance(parentInstance) : [];
|
|||
|
|
let el = firstElement;
|
|||
|
|
const indexList = [];
|
|||
|
|
do {
|
|||
|
|
indexList.push(Array.from(el.parentElement.childNodes).indexOf(el));
|
|||
|
|
el = el.parentElement;
|
|||
|
|
} while (el.parentElement && parentRootElements.length && !parentRootElements.includes(el));
|
|||
|
|
treeNode.domOrder = indexList.reverse();
|
|||
|
|
} else treeNode.domOrder = [-1];
|
|||
|
|
if (instance.suspense?.suspenseKey) {
|
|||
|
|
treeNode.tags.push({
|
|||
|
|
label: instance.suspense.suspenseKey,
|
|||
|
|
backgroundColor: 14979812,
|
|||
|
|
textColor: 16777215
|
|||
|
|
});
|
|||
|
|
this.mark(instance, true);
|
|||
|
|
}
|
|||
|
|
this.api.visitComponentTree({
|
|||
|
|
treeNode,
|
|||
|
|
componentInstance: instance,
|
|||
|
|
app: instance.appContext.app,
|
|||
|
|
filter: this.componentFilter.filter
|
|||
|
|
});
|
|||
|
|
return treeNode;
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* Find qualified children from a single instance.
|
|||
|
|
* If the instance itself is qualified, just return itself.
|
|||
|
|
* This is ok because [].concat works in both cases.
|
|||
|
|
*
|
|||
|
|
* @param {Vue|Vnode} instance
|
|||
|
|
* @return {Vue|Array}
|
|||
|
|
*/
|
|||
|
|
async findQualifiedChildren(instance, depth) {
|
|||
|
|
if (this.componentFilter.isQualified(instance) && !instance.type.devtools?.hide) return [await this.capture(instance, depth)];
|
|||
|
|
else if (instance.subTree) {
|
|||
|
|
const list = this.isKeepAlive(instance) ? this.getKeepAliveCachedInstances(instance) : this.getInternalInstanceChildren(instance.subTree);
|
|||
|
|
return this.findQualifiedChildrenFromList(list, depth);
|
|||
|
|
} else return [];
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* Iterate through an array of instances and flatten it into
|
|||
|
|
* an array of qualified instances. This is a depth-first
|
|||
|
|
* traversal - e.g. if an instance is not matched, we will
|
|||
|
|
* recursively go deeper until a qualified child is found.
|
|||
|
|
*
|
|||
|
|
* @param {Array} instances
|
|||
|
|
* @return {Array}
|
|||
|
|
*/
|
|||
|
|
async findQualifiedChildrenFromList(instances, depth) {
|
|||
|
|
instances = instances.filter((child) => !isBeingDestroyed(child) && !child.type.devtools?.hide);
|
|||
|
|
if (!this.componentFilter.filter) return Promise.all(instances.map((child) => this.capture(child, depth)));
|
|||
|
|
else return Array.prototype.concat.apply([], await Promise.all(instances.map((i) => this.findQualifiedChildren(i, depth))));
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* Get children from a component instance.
|
|||
|
|
*/
|
|||
|
|
getInternalInstanceChildren(subTree, suspense = null) {
|
|||
|
|
const list = [];
|
|||
|
|
if (subTree) {
|
|||
|
|
if (subTree.component) !suspense ? list.push(subTree.component) : list.push({
|
|||
|
|
...subTree.component,
|
|||
|
|
suspense
|
|||
|
|
});
|
|||
|
|
else if (subTree.suspense) {
|
|||
|
|
const suspenseKey = !subTree.suspense.isInFallback ? "suspense default" : "suspense fallback";
|
|||
|
|
list.push(...this.getInternalInstanceChildren(subTree.suspense.activeBranch, {
|
|||
|
|
...subTree.suspense,
|
|||
|
|
suspenseKey
|
|||
|
|
}));
|
|||
|
|
} else if (Array.isArray(subTree.children)) subTree.children.forEach((childSubTree) => {
|
|||
|
|
if (childSubTree.component) !suspense ? list.push(childSubTree.component) : list.push({
|
|||
|
|
...childSubTree.component,
|
|||
|
|
suspense
|
|||
|
|
});
|
|||
|
|
else list.push(...this.getInternalInstanceChildren(childSubTree, suspense));
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
return list.filter((child) => !isBeingDestroyed(child) && !child.type.devtools?.hide);
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* Mark an instance as captured and store it in the instance map.
|
|||
|
|
*
|
|||
|
|
* @param {Vue} instance
|
|||
|
|
*/
|
|||
|
|
mark(instance, force = false) {
|
|||
|
|
const instanceMap = getAppRecord(instance).instanceMap;
|
|||
|
|
if (force || !instanceMap.has(instance.__VUE_DEVTOOLS_NEXT_UID__)) {
|
|||
|
|
instanceMap.set(instance.__VUE_DEVTOOLS_NEXT_UID__, instance);
|
|||
|
|
activeAppRecord.value.instanceMap = instanceMap;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
isKeepAlive(instance) {
|
|||
|
|
return instance.type.__isKeepAlive && instance.__v_cache;
|
|||
|
|
}
|
|||
|
|
getKeepAliveCachedInstances(instance) {
|
|||
|
|
return Array.from(instance.__v_cache.values()).map((vnode) => vnode.component).filter(Boolean);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/timeline/perf.ts
|
|||
|
|
const markEndQueue = /* @__PURE__ */ new Map();
|
|||
|
|
const PERFORMANCE_EVENT_LAYER_ID = "performance";
|
|||
|
|
async function performanceMarkStart(api, app, uid, vm, type, time) {
|
|||
|
|
const appRecord = await getAppRecord(app);
|
|||
|
|
if (!appRecord) return;
|
|||
|
|
const componentName = getInstanceName(vm) || "Unknown Component";
|
|||
|
|
const groupId = devtoolsState.perfUniqueGroupId++;
|
|||
|
|
const groupKey = `${uid}-${type}`;
|
|||
|
|
appRecord.perfGroupIds.set(groupKey, {
|
|||
|
|
groupId,
|
|||
|
|
time
|
|||
|
|
});
|
|||
|
|
await api.addTimelineEvent({
|
|||
|
|
layerId: PERFORMANCE_EVENT_LAYER_ID,
|
|||
|
|
event: {
|
|||
|
|
time: Date.now(),
|
|||
|
|
data: {
|
|||
|
|
component: componentName,
|
|||
|
|
type,
|
|||
|
|
measure: "start"
|
|||
|
|
},
|
|||
|
|
title: componentName,
|
|||
|
|
subtitle: type,
|
|||
|
|
groupId
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
if (markEndQueue.has(groupKey)) {
|
|||
|
|
const { app: app$1, uid: uid$1, instance, type: type$1, time: time$1 } = markEndQueue.get(groupKey);
|
|||
|
|
markEndQueue.delete(groupKey);
|
|||
|
|
await performanceMarkEnd(api, app$1, uid$1, instance, type$1, time$1);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
function performanceMarkEnd(api, app, uid, vm, type, time) {
|
|||
|
|
const appRecord = getAppRecord(app);
|
|||
|
|
if (!appRecord) return;
|
|||
|
|
const componentName = getInstanceName(vm) || "Unknown Component";
|
|||
|
|
const groupKey = `${uid}-${type}`;
|
|||
|
|
const groupInfo = appRecord.perfGroupIds.get(groupKey);
|
|||
|
|
if (groupInfo) {
|
|||
|
|
const groupId = groupInfo.groupId;
|
|||
|
|
const duration = time - groupInfo.time;
|
|||
|
|
api.addTimelineEvent({
|
|||
|
|
layerId: PERFORMANCE_EVENT_LAYER_ID,
|
|||
|
|
event: {
|
|||
|
|
time: Date.now(),
|
|||
|
|
data: {
|
|||
|
|
component: componentName,
|
|||
|
|
type,
|
|||
|
|
measure: "end",
|
|||
|
|
duration: { _custom: {
|
|||
|
|
type: "Duration",
|
|||
|
|
value: duration,
|
|||
|
|
display: `${duration} ms`
|
|||
|
|
} }
|
|||
|
|
},
|
|||
|
|
title: componentName,
|
|||
|
|
subtitle: type,
|
|||
|
|
groupId
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
} else markEndQueue.set(groupKey, {
|
|||
|
|
app,
|
|||
|
|
uid,
|
|||
|
|
instance: vm,
|
|||
|
|
type,
|
|||
|
|
time
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/timeline/index.ts
|
|||
|
|
const COMPONENT_EVENT_LAYER_ID = "component-event";
|
|||
|
|
function setupBuiltinTimelineLayers(api) {
|
|||
|
|
if (!isBrowser) return;
|
|||
|
|
api.addTimelineLayer({
|
|||
|
|
id: "mouse",
|
|||
|
|
label: "Mouse",
|
|||
|
|
color: 10768815
|
|||
|
|
});
|
|||
|
|
[
|
|||
|
|
"mousedown",
|
|||
|
|
"mouseup",
|
|||
|
|
"click",
|
|||
|
|
"dblclick"
|
|||
|
|
].forEach((eventType) => {
|
|||
|
|
if (!devtoolsState.timelineLayersState.recordingState || !devtoolsState.timelineLayersState.mouseEventEnabled) return;
|
|||
|
|
window.addEventListener(eventType, async (event) => {
|
|||
|
|
await api.addTimelineEvent({
|
|||
|
|
layerId: "mouse",
|
|||
|
|
event: {
|
|||
|
|
time: Date.now(),
|
|||
|
|
data: {
|
|||
|
|
type: eventType,
|
|||
|
|
x: event.clientX,
|
|||
|
|
y: event.clientY
|
|||
|
|
},
|
|||
|
|
title: eventType
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}, {
|
|||
|
|
capture: true,
|
|||
|
|
passive: true
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
api.addTimelineLayer({
|
|||
|
|
id: "keyboard",
|
|||
|
|
label: "Keyboard",
|
|||
|
|
color: 8475055
|
|||
|
|
});
|
|||
|
|
[
|
|||
|
|
"keyup",
|
|||
|
|
"keydown",
|
|||
|
|
"keypress"
|
|||
|
|
].forEach((eventType) => {
|
|||
|
|
window.addEventListener(eventType, async (event) => {
|
|||
|
|
if (!devtoolsState.timelineLayersState.recordingState || !devtoolsState.timelineLayersState.keyboardEventEnabled) return;
|
|||
|
|
await api.addTimelineEvent({
|
|||
|
|
layerId: "keyboard",
|
|||
|
|
event: {
|
|||
|
|
time: Date.now(),
|
|||
|
|
data: {
|
|||
|
|
type: eventType,
|
|||
|
|
key: event.key,
|
|||
|
|
ctrlKey: event.ctrlKey,
|
|||
|
|
shiftKey: event.shiftKey,
|
|||
|
|
altKey: event.altKey,
|
|||
|
|
metaKey: event.metaKey
|
|||
|
|
},
|
|||
|
|
title: event.key
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}, {
|
|||
|
|
capture: true,
|
|||
|
|
passive: true
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
api.addTimelineLayer({
|
|||
|
|
id: COMPONENT_EVENT_LAYER_ID,
|
|||
|
|
label: "Component events",
|
|||
|
|
color: 5226637
|
|||
|
|
});
|
|||
|
|
hook.on.componentEmit(async (app, instance, event, params) => {
|
|||
|
|
if (!devtoolsState.timelineLayersState.recordingState || !devtoolsState.timelineLayersState.componentEventEnabled) return;
|
|||
|
|
const appRecord = await getAppRecord(app);
|
|||
|
|
if (!appRecord) return;
|
|||
|
|
const componentId = `${appRecord.id}:${instance.uid}`;
|
|||
|
|
const componentName = getInstanceName(instance) || "Unknown Component";
|
|||
|
|
api.addTimelineEvent({
|
|||
|
|
layerId: COMPONENT_EVENT_LAYER_ID,
|
|||
|
|
event: {
|
|||
|
|
time: Date.now(),
|
|||
|
|
data: {
|
|||
|
|
component: { _custom: {
|
|||
|
|
type: "component-definition",
|
|||
|
|
display: componentName
|
|||
|
|
} },
|
|||
|
|
event,
|
|||
|
|
params
|
|||
|
|
},
|
|||
|
|
title: event,
|
|||
|
|
subtitle: `by ${componentName}`,
|
|||
|
|
meta: { componentId }
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
api.addTimelineLayer({
|
|||
|
|
id: "performance",
|
|||
|
|
label: PERFORMANCE_EVENT_LAYER_ID,
|
|||
|
|
color: 4307050
|
|||
|
|
});
|
|||
|
|
hook.on.perfStart((app, uid, vm, type, time) => {
|
|||
|
|
if (!devtoolsState.timelineLayersState.recordingState || !devtoolsState.timelineLayersState.performanceEventEnabled) return;
|
|||
|
|
performanceMarkStart(api, app, uid, vm, type, time);
|
|||
|
|
});
|
|||
|
|
hook.on.perfEnd((app, uid, vm, type, time) => {
|
|||
|
|
if (!devtoolsState.timelineLayersState.recordingState || !devtoolsState.timelineLayersState.performanceEventEnabled) return;
|
|||
|
|
performanceMarkEnd(api, app, uid, vm, type, time);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/vm/index.ts
|
|||
|
|
const MAX_$VM = 10;
|
|||
|
|
const $vmQueue = [];
|
|||
|
|
function exposeInstanceToWindow(componentInstance) {
|
|||
|
|
if (typeof window === "undefined") return;
|
|||
|
|
const win = window;
|
|||
|
|
if (!componentInstance) return;
|
|||
|
|
win.$vm = componentInstance;
|
|||
|
|
if ($vmQueue[0] !== componentInstance) {
|
|||
|
|
if ($vmQueue.length >= MAX_$VM) $vmQueue.pop();
|
|||
|
|
for (let i = $vmQueue.length; i > 0; i--) win[`$vm${i}`] = $vmQueue[i] = $vmQueue[i - 1];
|
|||
|
|
win.$vm0 = $vmQueue[0] = componentInstance;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/plugin/components.ts
|
|||
|
|
const INSPECTOR_ID = "components";
|
|||
|
|
function createComponentsDevToolsPlugin(app) {
|
|||
|
|
const descriptor = {
|
|||
|
|
id: INSPECTOR_ID,
|
|||
|
|
label: "Components",
|
|||
|
|
app
|
|||
|
|
};
|
|||
|
|
const setupFn = (api) => {
|
|||
|
|
api.addInspector({
|
|||
|
|
id: INSPECTOR_ID,
|
|||
|
|
label: "Components",
|
|||
|
|
treeFilterPlaceholder: "Search components"
|
|||
|
|
});
|
|||
|
|
setupBuiltinTimelineLayers(api);
|
|||
|
|
api.on.getInspectorTree(async (payload) => {
|
|||
|
|
if (payload.app === app && payload.inspectorId === INSPECTOR_ID) {
|
|||
|
|
const instance = getComponentInstance(activeAppRecord.value, payload.instanceId);
|
|||
|
|
if (instance) payload.rootNodes = await new ComponentWalker({
|
|||
|
|
filterText: payload.filter,
|
|||
|
|
maxDepth: 100,
|
|||
|
|
recursively: false,
|
|||
|
|
api
|
|||
|
|
}).getComponentTree(instance);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
api.on.getInspectorState(async (payload) => {
|
|||
|
|
if (payload.app === app && payload.inspectorId === INSPECTOR_ID) {
|
|||
|
|
const result = getInstanceState({ instanceId: payload.nodeId });
|
|||
|
|
const componentInstance = result.instance;
|
|||
|
|
const _payload = {
|
|||
|
|
componentInstance,
|
|||
|
|
app: result.instance?.appContext.app,
|
|||
|
|
instanceData: result
|
|||
|
|
};
|
|||
|
|
devtoolsContext.hooks.callHookWith((callbacks) => {
|
|||
|
|
callbacks.forEach((cb) => cb(_payload));
|
|||
|
|
}, DevToolsV6PluginAPIHookKeys.INSPECT_COMPONENT);
|
|||
|
|
payload.state = result;
|
|||
|
|
exposeInstanceToWindow(componentInstance);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
api.on.editInspectorState(async (payload) => {
|
|||
|
|
if (payload.app === app && payload.inspectorId === INSPECTOR_ID) {
|
|||
|
|
editState(payload);
|
|||
|
|
await api.sendInspectorState("components");
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
const debounceSendInspectorTree = debounce(() => {
|
|||
|
|
api.sendInspectorTree(INSPECTOR_ID);
|
|||
|
|
}, 120);
|
|||
|
|
const debounceSendInspectorState = debounce(() => {
|
|||
|
|
api.sendInspectorState(INSPECTOR_ID);
|
|||
|
|
}, 120);
|
|||
|
|
hook.on.componentAdded(async (app$1, uid, parentUid, component) => {
|
|||
|
|
if (devtoolsState.highPerfModeEnabled) return;
|
|||
|
|
if (app$1?._instance?.type?.devtools?.hide) return;
|
|||
|
|
if (!app$1 || typeof uid !== "number" && !uid || !component) return;
|
|||
|
|
const id = await getComponentId({
|
|||
|
|
app: app$1,
|
|||
|
|
uid,
|
|||
|
|
instance: component
|
|||
|
|
});
|
|||
|
|
const appRecord = await getAppRecord(app$1);
|
|||
|
|
if (component) {
|
|||
|
|
if (component.__VUE_DEVTOOLS_NEXT_UID__ == null) component.__VUE_DEVTOOLS_NEXT_UID__ = id;
|
|||
|
|
if (!appRecord?.instanceMap.has(id)) {
|
|||
|
|
appRecord?.instanceMap.set(id, component);
|
|||
|
|
if (activeAppRecord.value.id === appRecord?.id) activeAppRecord.value.instanceMap = appRecord.instanceMap;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (!appRecord) return;
|
|||
|
|
debounceSendInspectorTree();
|
|||
|
|
});
|
|||
|
|
hook.on.componentUpdated(async (app$1, uid, parentUid, component) => {
|
|||
|
|
if (devtoolsState.highPerfModeEnabled) return;
|
|||
|
|
if (app$1?._instance?.type?.devtools?.hide) return;
|
|||
|
|
if (!app$1 || typeof uid !== "number" && !uid || !component) return;
|
|||
|
|
const id = await getComponentId({
|
|||
|
|
app: app$1,
|
|||
|
|
uid,
|
|||
|
|
instance: component
|
|||
|
|
});
|
|||
|
|
const appRecord = await getAppRecord(app$1);
|
|||
|
|
if (component) {
|
|||
|
|
if (component.__VUE_DEVTOOLS_NEXT_UID__ == null) component.__VUE_DEVTOOLS_NEXT_UID__ = id;
|
|||
|
|
if (!appRecord?.instanceMap.has(id)) {
|
|||
|
|
appRecord?.instanceMap.set(id, component);
|
|||
|
|
if (activeAppRecord.value.id === appRecord?.id) activeAppRecord.value.instanceMap = appRecord.instanceMap;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (!appRecord) return;
|
|||
|
|
debounceSendInspectorTree();
|
|||
|
|
debounceSendInspectorState();
|
|||
|
|
});
|
|||
|
|
hook.on.componentRemoved(async (app$1, uid, parentUid, component) => {
|
|||
|
|
if (devtoolsState.highPerfModeEnabled) return;
|
|||
|
|
if (app$1?._instance?.type?.devtools?.hide) return;
|
|||
|
|
if (!app$1 || typeof uid !== "number" && !uid || !component) return;
|
|||
|
|
const appRecord = await getAppRecord(app$1);
|
|||
|
|
if (!appRecord) return;
|
|||
|
|
const id = await getComponentId({
|
|||
|
|
app: app$1,
|
|||
|
|
uid,
|
|||
|
|
instance: component
|
|||
|
|
});
|
|||
|
|
appRecord?.instanceMap.delete(id);
|
|||
|
|
if (activeAppRecord.value.id === appRecord?.id) activeAppRecord.value.instanceMap = appRecord.instanceMap;
|
|||
|
|
debounceSendInspectorTree();
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
return [descriptor, setupFn];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/plugin/index.ts
|
|||
|
|
target.__VUE_DEVTOOLS_KIT__REGISTERED_PLUGIN_APPS__ ??= /* @__PURE__ */ new Set();
|
|||
|
|
function setupDevToolsPlugin(pluginDescriptor, setupFn) {
|
|||
|
|
return hook.setupDevToolsPlugin(pluginDescriptor, setupFn);
|
|||
|
|
}
|
|||
|
|
function callDevToolsPluginSetupFn(plugin, app) {
|
|||
|
|
const [pluginDescriptor, setupFn] = plugin;
|
|||
|
|
if (pluginDescriptor.app !== app) return;
|
|||
|
|
const api = new DevToolsPluginAPI({
|
|||
|
|
plugin: {
|
|||
|
|
setupFn,
|
|||
|
|
descriptor: pluginDescriptor
|
|||
|
|
},
|
|||
|
|
ctx: devtoolsContext
|
|||
|
|
});
|
|||
|
|
if (pluginDescriptor.packageName === "vuex") api.on.editInspectorState((payload) => {
|
|||
|
|
api.sendInspectorState(payload.inspectorId);
|
|||
|
|
});
|
|||
|
|
setupFn(api);
|
|||
|
|
}
|
|||
|
|
function removeRegisteredPluginApp(app) {
|
|||
|
|
target.__VUE_DEVTOOLS_KIT__REGISTERED_PLUGIN_APPS__.delete(app);
|
|||
|
|
}
|
|||
|
|
function registerDevToolsPlugin(app, options) {
|
|||
|
|
if (target.__VUE_DEVTOOLS_KIT__REGISTERED_PLUGIN_APPS__.has(app)) return;
|
|||
|
|
if (devtoolsState.highPerfModeEnabled && !options?.inspectingComponent) return;
|
|||
|
|
target.__VUE_DEVTOOLS_KIT__REGISTERED_PLUGIN_APPS__.add(app);
|
|||
|
|
devtoolsPluginBuffer.forEach((plugin) => {
|
|||
|
|
callDevToolsPluginSetupFn(plugin, app);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/ctx/router.ts
|
|||
|
|
const ROUTER_KEY = "__VUE_DEVTOOLS_ROUTER__";
|
|||
|
|
const ROUTER_INFO_KEY = "__VUE_DEVTOOLS_ROUTER_INFO__";
|
|||
|
|
target[ROUTER_INFO_KEY] ??= {
|
|||
|
|
currentRoute: null,
|
|||
|
|
routes: []
|
|||
|
|
};
|
|||
|
|
target[ROUTER_KEY] ??= {};
|
|||
|
|
const devtoolsRouterInfo = new Proxy(target[ROUTER_INFO_KEY], { get(target$1, property) {
|
|||
|
|
return target[ROUTER_INFO_KEY][property];
|
|||
|
|
} });
|
|||
|
|
const devtoolsRouter = new Proxy(target[ROUTER_KEY], { get(target$1, property) {
|
|||
|
|
if (property === "value") return target[ROUTER_KEY];
|
|||
|
|
} });
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/router/index.ts
|
|||
|
|
function getRoutes(router) {
|
|||
|
|
const routesMap = /* @__PURE__ */ new Map();
|
|||
|
|
return (router?.getRoutes() || []).filter((i) => !routesMap.has(i.path) && routesMap.set(i.path, 1));
|
|||
|
|
}
|
|||
|
|
function filterRoutes(routes) {
|
|||
|
|
return routes.map((item) => {
|
|||
|
|
let { path, name, children, meta } = item;
|
|||
|
|
if (children?.length) children = filterRoutes(children);
|
|||
|
|
return {
|
|||
|
|
path,
|
|||
|
|
name,
|
|||
|
|
children,
|
|||
|
|
meta
|
|||
|
|
};
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
function filterCurrentRoute(route) {
|
|||
|
|
if (route) {
|
|||
|
|
const { fullPath, hash, href, path, name, matched, params, query } = route;
|
|||
|
|
return {
|
|||
|
|
fullPath,
|
|||
|
|
hash,
|
|||
|
|
href,
|
|||
|
|
path,
|
|||
|
|
name,
|
|||
|
|
params,
|
|||
|
|
query,
|
|||
|
|
matched: filterRoutes(matched)
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
return route;
|
|||
|
|
}
|
|||
|
|
function normalizeRouterInfo(appRecord, activeAppRecord$1) {
|
|||
|
|
function init() {
|
|||
|
|
const router = appRecord.app?.config.globalProperties.$router;
|
|||
|
|
const currentRoute = filterCurrentRoute(router?.currentRoute.value);
|
|||
|
|
const routes = filterRoutes(getRoutes(router));
|
|||
|
|
const c = console.warn;
|
|||
|
|
console.warn = () => {};
|
|||
|
|
target[ROUTER_INFO_KEY] = {
|
|||
|
|
currentRoute: currentRoute ? deepClone(currentRoute) : {},
|
|||
|
|
routes: deepClone(routes)
|
|||
|
|
};
|
|||
|
|
target[ROUTER_KEY] = router;
|
|||
|
|
console.warn = c;
|
|||
|
|
}
|
|||
|
|
init();
|
|||
|
|
hook.on.componentUpdated(debounce(() => {
|
|||
|
|
if (activeAppRecord$1.value?.app !== appRecord.app) return;
|
|||
|
|
init();
|
|||
|
|
if (devtoolsState.highPerfModeEnabled) return;
|
|||
|
|
devtoolsContext.hooks.callHook(DevToolsMessagingHookKeys.ROUTER_INFO_UPDATED, { state: target[ROUTER_INFO_KEY] });
|
|||
|
|
}, 200));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/ctx/api.ts
|
|||
|
|
function createDevToolsApi(hooks$1) {
|
|||
|
|
return {
|
|||
|
|
async getInspectorTree(payload) {
|
|||
|
|
const _payload = {
|
|||
|
|
...payload,
|
|||
|
|
app: activeAppRecord.value.app,
|
|||
|
|
rootNodes: []
|
|||
|
|
};
|
|||
|
|
await new Promise((resolve) => {
|
|||
|
|
hooks$1.callHookWith(async (callbacks) => {
|
|||
|
|
await Promise.all(callbacks.map((cb) => cb(_payload)));
|
|||
|
|
resolve();
|
|||
|
|
}, DevToolsV6PluginAPIHookKeys.GET_INSPECTOR_TREE);
|
|||
|
|
});
|
|||
|
|
return _payload.rootNodes;
|
|||
|
|
},
|
|||
|
|
async getInspectorState(payload) {
|
|||
|
|
const _payload = {
|
|||
|
|
...payload,
|
|||
|
|
app: activeAppRecord.value.app,
|
|||
|
|
state: null
|
|||
|
|
};
|
|||
|
|
const ctx = { currentTab: `custom-inspector:${payload.inspectorId}` };
|
|||
|
|
await new Promise((resolve) => {
|
|||
|
|
hooks$1.callHookWith(async (callbacks) => {
|
|||
|
|
await Promise.all(callbacks.map((cb) => cb(_payload, ctx)));
|
|||
|
|
resolve();
|
|||
|
|
}, DevToolsV6PluginAPIHookKeys.GET_INSPECTOR_STATE);
|
|||
|
|
});
|
|||
|
|
return _payload.state;
|
|||
|
|
},
|
|||
|
|
editInspectorState(payload) {
|
|||
|
|
const stateEditor$1 = new StateEditor();
|
|||
|
|
const _payload = {
|
|||
|
|
...payload,
|
|||
|
|
app: activeAppRecord.value.app,
|
|||
|
|
set: (obj, path = payload.path, value = payload.state.value, cb) => {
|
|||
|
|
stateEditor$1.set(obj, path, value, cb || stateEditor$1.createDefaultSetCallback(payload.state));
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
hooks$1.callHookWith((callbacks) => {
|
|||
|
|
callbacks.forEach((cb) => cb(_payload));
|
|||
|
|
}, DevToolsV6PluginAPIHookKeys.EDIT_INSPECTOR_STATE);
|
|||
|
|
},
|
|||
|
|
sendInspectorState(inspectorId) {
|
|||
|
|
const inspector = getInspector(inspectorId);
|
|||
|
|
hooks$1.callHook(DevToolsContextHookKeys.SEND_INSPECTOR_STATE, {
|
|||
|
|
inspectorId,
|
|||
|
|
plugin: {
|
|||
|
|
descriptor: inspector.descriptor,
|
|||
|
|
setupFn: () => ({})
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
inspectComponentInspector() {
|
|||
|
|
return inspectComponentHighLighter();
|
|||
|
|
},
|
|||
|
|
cancelInspectComponentInspector() {
|
|||
|
|
return cancelInspectComponentHighLighter();
|
|||
|
|
},
|
|||
|
|
getComponentRenderCode(id) {
|
|||
|
|
const instance = getComponentInstance(activeAppRecord.value, id);
|
|||
|
|
if (instance) return !(typeof instance?.type === "function") ? instance.render.toString() : instance.type.toString();
|
|||
|
|
},
|
|||
|
|
scrollToComponent(id) {
|
|||
|
|
return scrollToComponent({ id });
|
|||
|
|
},
|
|||
|
|
openInEditor,
|
|||
|
|
getVueInspector: getComponentInspector,
|
|||
|
|
toggleApp(id, options) {
|
|||
|
|
const appRecord = devtoolsAppRecords.value.find((record) => record.id === id);
|
|||
|
|
if (appRecord) {
|
|||
|
|
setActiveAppRecordId(id);
|
|||
|
|
setActiveAppRecord(appRecord);
|
|||
|
|
normalizeRouterInfo(appRecord, activeAppRecord);
|
|||
|
|
callInspectorUpdatedHook();
|
|||
|
|
registerDevToolsPlugin(appRecord.app, options);
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
inspectDOM(instanceId) {
|
|||
|
|
const instance = getComponentInstance(activeAppRecord.value, instanceId);
|
|||
|
|
if (instance) {
|
|||
|
|
const [el] = getRootElementsFromComponentInstance(instance);
|
|||
|
|
if (el) target.__VUE_DEVTOOLS_INSPECT_DOM_TARGET__ = el;
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
updatePluginSettings(pluginId, key, value) {
|
|||
|
|
setPluginSettings(pluginId, key, value);
|
|||
|
|
},
|
|||
|
|
getPluginSettings(pluginId) {
|
|||
|
|
return {
|
|||
|
|
options: getPluginSettingsOptions(pluginId),
|
|||
|
|
values: getPluginSettings(pluginId)
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/ctx/env.ts
|
|||
|
|
target.__VUE_DEVTOOLS_ENV__ ??= { vitePluginDetected: false };
|
|||
|
|
function getDevToolsEnv() {
|
|||
|
|
return target.__VUE_DEVTOOLS_ENV__;
|
|||
|
|
}
|
|||
|
|
function setDevToolsEnv(env) {
|
|||
|
|
target.__VUE_DEVTOOLS_ENV__ = {
|
|||
|
|
...target.__VUE_DEVTOOLS_ENV__,
|
|||
|
|
...env
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/ctx/index.ts
|
|||
|
|
const hooks = createDevToolsCtxHooks();
|
|||
|
|
target.__VUE_DEVTOOLS_KIT_CONTEXT__ ??= {
|
|||
|
|
hooks,
|
|||
|
|
get state() {
|
|||
|
|
return {
|
|||
|
|
...devtoolsState,
|
|||
|
|
activeAppRecordId: activeAppRecord.id,
|
|||
|
|
activeAppRecord: activeAppRecord.value,
|
|||
|
|
appRecords: devtoolsAppRecords.value
|
|||
|
|
};
|
|||
|
|
},
|
|||
|
|
api: createDevToolsApi(hooks)
|
|||
|
|
};
|
|||
|
|
const devtoolsContext = target.__VUE_DEVTOOLS_KIT_CONTEXT__;
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region ../../node_modules/.pnpm/speakingurl@14.0.1/node_modules/speakingurl/lib/speakingurl.js
|
|||
|
|
var require_speakingurl$1 = /* @__PURE__ */ __commonJS({ "../../node_modules/.pnpm/speakingurl@14.0.1/node_modules/speakingurl/lib/speakingurl.js": ((exports, module) => {
|
|||
|
|
(function(root) {
|
|||
|
|
/**
|
|||
|
|
* charMap
|
|||
|
|
* @type {Object}
|
|||
|
|
*/
|
|||
|
|
var charMap = {
|
|||
|
|
"À": "A",
|
|||
|
|
"Á": "A",
|
|||
|
|
"Â": "A",
|
|||
|
|
"Ã": "A",
|
|||
|
|
"Ä": "Ae",
|
|||
|
|
"Å": "A",
|
|||
|
|
"Æ": "AE",
|
|||
|
|
"Ç": "C",
|
|||
|
|
"È": "E",
|
|||
|
|
"É": "E",
|
|||
|
|
"Ê": "E",
|
|||
|
|
"Ë": "E",
|
|||
|
|
"Ì": "I",
|
|||
|
|
"Í": "I",
|
|||
|
|
"Î": "I",
|
|||
|
|
"Ï": "I",
|
|||
|
|
"Ð": "D",
|
|||
|
|
"Ñ": "N",
|
|||
|
|
"Ò": "O",
|
|||
|
|
"Ó": "O",
|
|||
|
|
"Ô": "O",
|
|||
|
|
"Õ": "O",
|
|||
|
|
"Ö": "Oe",
|
|||
|
|
"Ő": "O",
|
|||
|
|
"Ø": "O",
|
|||
|
|
"Ù": "U",
|
|||
|
|
"Ú": "U",
|
|||
|
|
"Û": "U",
|
|||
|
|
"Ü": "Ue",
|
|||
|
|
"Ű": "U",
|
|||
|
|
"Ý": "Y",
|
|||
|
|
"Þ": "TH",
|
|||
|
|
"ß": "ss",
|
|||
|
|
"à": "a",
|
|||
|
|
"á": "a",
|
|||
|
|
"â": "a",
|
|||
|
|
"ã": "a",
|
|||
|
|
"ä": "ae",
|
|||
|
|
"å": "a",
|
|||
|
|
"æ": "ae",
|
|||
|
|
"ç": "c",
|
|||
|
|
"è": "e",
|
|||
|
|
"é": "e",
|
|||
|
|
"ê": "e",
|
|||
|
|
"ë": "e",
|
|||
|
|
"ì": "i",
|
|||
|
|
"í": "i",
|
|||
|
|
"î": "i",
|
|||
|
|
"ï": "i",
|
|||
|
|
"ð": "d",
|
|||
|
|
"ñ": "n",
|
|||
|
|
"ò": "o",
|
|||
|
|
"ó": "o",
|
|||
|
|
"ô": "o",
|
|||
|
|
"õ": "o",
|
|||
|
|
"ö": "oe",
|
|||
|
|
"ő": "o",
|
|||
|
|
"ø": "o",
|
|||
|
|
"ù": "u",
|
|||
|
|
"ú": "u",
|
|||
|
|
"û": "u",
|
|||
|
|
"ü": "ue",
|
|||
|
|
"ű": "u",
|
|||
|
|
"ý": "y",
|
|||
|
|
"þ": "th",
|
|||
|
|
"ÿ": "y",
|
|||
|
|
"ẞ": "SS",
|
|||
|
|
"ا": "a",
|
|||
|
|
"أ": "a",
|
|||
|
|
"إ": "i",
|
|||
|
|
"آ": "aa",
|
|||
|
|
"ؤ": "u",
|
|||
|
|
"ئ": "e",
|
|||
|
|
"ء": "a",
|
|||
|
|
"ب": "b",
|
|||
|
|
"ت": "t",
|
|||
|
|
"ث": "th",
|
|||
|
|
"ج": "j",
|
|||
|
|
"ح": "h",
|
|||
|
|
"خ": "kh",
|
|||
|
|
"د": "d",
|
|||
|
|
"ذ": "th",
|
|||
|
|
"ر": "r",
|
|||
|
|
"ز": "z",
|
|||
|
|
"س": "s",
|
|||
|
|
"ش": "sh",
|
|||
|
|
"ص": "s",
|
|||
|
|
"ض": "dh",
|
|||
|
|
"ط": "t",
|
|||
|
|
"ظ": "z",
|
|||
|
|
"ع": "a",
|
|||
|
|
"غ": "gh",
|
|||
|
|
"ف": "f",
|
|||
|
|
"ق": "q",
|
|||
|
|
"ك": "k",
|
|||
|
|
"ل": "l",
|
|||
|
|
"م": "m",
|
|||
|
|
"ن": "n",
|
|||
|
|
"ه": "h",
|
|||
|
|
"و": "w",
|
|||
|
|
"ي": "y",
|
|||
|
|
"ى": "a",
|
|||
|
|
"ة": "h",
|
|||
|
|
"ﻻ": "la",
|
|||
|
|
"ﻷ": "laa",
|
|||
|
|
"ﻹ": "lai",
|
|||
|
|
"ﻵ": "laa",
|
|||
|
|
"گ": "g",
|
|||
|
|
"چ": "ch",
|
|||
|
|
"پ": "p",
|
|||
|
|
"ژ": "zh",
|
|||
|
|
"ک": "k",
|
|||
|
|
"ی": "y",
|
|||
|
|
"َ": "a",
|
|||
|
|
"ً": "an",
|
|||
|
|
"ِ": "e",
|
|||
|
|
"ٍ": "en",
|
|||
|
|
"ُ": "u",
|
|||
|
|
"ٌ": "on",
|
|||
|
|
"ْ": "",
|
|||
|
|
"٠": "0",
|
|||
|
|
"١": "1",
|
|||
|
|
"٢": "2",
|
|||
|
|
"٣": "3",
|
|||
|
|
"٤": "4",
|
|||
|
|
"٥": "5",
|
|||
|
|
"٦": "6",
|
|||
|
|
"٧": "7",
|
|||
|
|
"٨": "8",
|
|||
|
|
"٩": "9",
|
|||
|
|
"۰": "0",
|
|||
|
|
"۱": "1",
|
|||
|
|
"۲": "2",
|
|||
|
|
"۳": "3",
|
|||
|
|
"۴": "4",
|
|||
|
|
"۵": "5",
|
|||
|
|
"۶": "6",
|
|||
|
|
"۷": "7",
|
|||
|
|
"۸": "8",
|
|||
|
|
"۹": "9",
|
|||
|
|
"က": "k",
|
|||
|
|
"ခ": "kh",
|
|||
|
|
"ဂ": "g",
|
|||
|
|
"ဃ": "ga",
|
|||
|
|
"င": "ng",
|
|||
|
|
"စ": "s",
|
|||
|
|
"ဆ": "sa",
|
|||
|
|
"ဇ": "z",
|
|||
|
|
"စျ": "za",
|
|||
|
|
"ည": "ny",
|
|||
|
|
"ဋ": "t",
|
|||
|
|
"ဌ": "ta",
|
|||
|
|
"ဍ": "d",
|
|||
|
|
"ဎ": "da",
|
|||
|
|
"ဏ": "na",
|
|||
|
|
"တ": "t",
|
|||
|
|
"ထ": "ta",
|
|||
|
|
"ဒ": "d",
|
|||
|
|
"ဓ": "da",
|
|||
|
|
"န": "n",
|
|||
|
|
"ပ": "p",
|
|||
|
|
"ဖ": "pa",
|
|||
|
|
"ဗ": "b",
|
|||
|
|
"ဘ": "ba",
|
|||
|
|
"မ": "m",
|
|||
|
|
"ယ": "y",
|
|||
|
|
"ရ": "ya",
|
|||
|
|
"လ": "l",
|
|||
|
|
"ဝ": "w",
|
|||
|
|
"သ": "th",
|
|||
|
|
"ဟ": "h",
|
|||
|
|
"ဠ": "la",
|
|||
|
|
"အ": "a",
|
|||
|
|
"ြ": "y",
|
|||
|
|
"ျ": "ya",
|
|||
|
|
"ွ": "w",
|
|||
|
|
"ြွ": "yw",
|
|||
|
|
"ျွ": "ywa",
|
|||
|
|
"ှ": "h",
|
|||
|
|
"ဧ": "e",
|
|||
|
|
"၏": "-e",
|
|||
|
|
"ဣ": "i",
|
|||
|
|
"ဤ": "-i",
|
|||
|
|
"ဉ": "u",
|
|||
|
|
"ဦ": "-u",
|
|||
|
|
"ဩ": "aw",
|
|||
|
|
"သြော": "aw",
|
|||
|
|
"ဪ": "aw",
|
|||
|
|
"၀": "0",
|
|||
|
|
"၁": "1",
|
|||
|
|
"၂": "2",
|
|||
|
|
"၃": "3",
|
|||
|
|
"၄": "4",
|
|||
|
|
"၅": "5",
|
|||
|
|
"၆": "6",
|
|||
|
|
"၇": "7",
|
|||
|
|
"၈": "8",
|
|||
|
|
"၉": "9",
|
|||
|
|
"္": "",
|
|||
|
|
"့": "",
|
|||
|
|
"း": "",
|
|||
|
|
"č": "c",
|
|||
|
|
"ď": "d",
|
|||
|
|
"ě": "e",
|
|||
|
|
"ň": "n",
|
|||
|
|
"ř": "r",
|
|||
|
|
"š": "s",
|
|||
|
|
"ť": "t",
|
|||
|
|
"ů": "u",
|
|||
|
|
"ž": "z",
|
|||
|
|
"Č": "C",
|
|||
|
|
"Ď": "D",
|
|||
|
|
"Ě": "E",
|
|||
|
|
"Ň": "N",
|
|||
|
|
"Ř": "R",
|
|||
|
|
"Š": "S",
|
|||
|
|
"Ť": "T",
|
|||
|
|
"Ů": "U",
|
|||
|
|
"Ž": "Z",
|
|||
|
|
"ހ": "h",
|
|||
|
|
"ށ": "sh",
|
|||
|
|
"ނ": "n",
|
|||
|
|
"ރ": "r",
|
|||
|
|
"ބ": "b",
|
|||
|
|
"ޅ": "lh",
|
|||
|
|
"ކ": "k",
|
|||
|
|
"އ": "a",
|
|||
|
|
"ވ": "v",
|
|||
|
|
"މ": "m",
|
|||
|
|
"ފ": "f",
|
|||
|
|
"ދ": "dh",
|
|||
|
|
"ތ": "th",
|
|||
|
|
"ލ": "l",
|
|||
|
|
"ގ": "g",
|
|||
|
|
"ޏ": "gn",
|
|||
|
|
"ސ": "s",
|
|||
|
|
"ޑ": "d",
|
|||
|
|
"ޒ": "z",
|
|||
|
|
"ޓ": "t",
|
|||
|
|
"ޔ": "y",
|
|||
|
|
"ޕ": "p",
|
|||
|
|
"ޖ": "j",
|
|||
|
|
"ޗ": "ch",
|
|||
|
|
"ޘ": "tt",
|
|||
|
|
"ޙ": "hh",
|
|||
|
|
"ޚ": "kh",
|
|||
|
|
"ޛ": "th",
|
|||
|
|
"ޜ": "z",
|
|||
|
|
"ޝ": "sh",
|
|||
|
|
"ޞ": "s",
|
|||
|
|
"ޟ": "d",
|
|||
|
|
"ޠ": "t",
|
|||
|
|
"ޡ": "z",
|
|||
|
|
"ޢ": "a",
|
|||
|
|
"ޣ": "gh",
|
|||
|
|
"ޤ": "q",
|
|||
|
|
"ޥ": "w",
|
|||
|
|
"ަ": "a",
|
|||
|
|
"ާ": "aa",
|
|||
|
|
"ި": "i",
|
|||
|
|
"ީ": "ee",
|
|||
|
|
"ު": "u",
|
|||
|
|
"ޫ": "oo",
|
|||
|
|
"ެ": "e",
|
|||
|
|
"ޭ": "ey",
|
|||
|
|
"ޮ": "o",
|
|||
|
|
"ޯ": "oa",
|
|||
|
|
"ް": "",
|
|||
|
|
"ა": "a",
|
|||
|
|
"ბ": "b",
|
|||
|
|
"გ": "g",
|
|||
|
|
"დ": "d",
|
|||
|
|
"ე": "e",
|
|||
|
|
"ვ": "v",
|
|||
|
|
"ზ": "z",
|
|||
|
|
"თ": "t",
|
|||
|
|
"ი": "i",
|
|||
|
|
"კ": "k",
|
|||
|
|
"ლ": "l",
|
|||
|
|
"მ": "m",
|
|||
|
|
"ნ": "n",
|
|||
|
|
"ო": "o",
|
|||
|
|
"პ": "p",
|
|||
|
|
"ჟ": "zh",
|
|||
|
|
"რ": "r",
|
|||
|
|
"ს": "s",
|
|||
|
|
"ტ": "t",
|
|||
|
|
"უ": "u",
|
|||
|
|
"ფ": "p",
|
|||
|
|
"ქ": "k",
|
|||
|
|
"ღ": "gh",
|
|||
|
|
"ყ": "q",
|
|||
|
|
"შ": "sh",
|
|||
|
|
"ჩ": "ch",
|
|||
|
|
"ც": "ts",
|
|||
|
|
"ძ": "dz",
|
|||
|
|
"წ": "ts",
|
|||
|
|
"ჭ": "ch",
|
|||
|
|
"ხ": "kh",
|
|||
|
|
"ჯ": "j",
|
|||
|
|
"ჰ": "h",
|
|||
|
|
"α": "a",
|
|||
|
|
"β": "v",
|
|||
|
|
"γ": "g",
|
|||
|
|
"δ": "d",
|
|||
|
|
"ε": "e",
|
|||
|
|
"ζ": "z",
|
|||
|
|
"η": "i",
|
|||
|
|
"θ": "th",
|
|||
|
|
"ι": "i",
|
|||
|
|
"κ": "k",
|
|||
|
|
"λ": "l",
|
|||
|
|
"μ": "m",
|
|||
|
|
"ν": "n",
|
|||
|
|
"ξ": "ks",
|
|||
|
|
"ο": "o",
|
|||
|
|
"π": "p",
|
|||
|
|
"ρ": "r",
|
|||
|
|
"σ": "s",
|
|||
|
|
"τ": "t",
|
|||
|
|
"υ": "y",
|
|||
|
|
"φ": "f",
|
|||
|
|
"χ": "x",
|
|||
|
|
"ψ": "ps",
|
|||
|
|
"ω": "o",
|
|||
|
|
"ά": "a",
|
|||
|
|
"έ": "e",
|
|||
|
|
"ί": "i",
|
|||
|
|
"ό": "o",
|
|||
|
|
"ύ": "y",
|
|||
|
|
"ή": "i",
|
|||
|
|
"ώ": "o",
|
|||
|
|
"ς": "s",
|
|||
|
|
"ϊ": "i",
|
|||
|
|
"ΰ": "y",
|
|||
|
|
"ϋ": "y",
|
|||
|
|
"ΐ": "i",
|
|||
|
|
"Α": "A",
|
|||
|
|
"Β": "B",
|
|||
|
|
"Γ": "G",
|
|||
|
|
"Δ": "D",
|
|||
|
|
"Ε": "E",
|
|||
|
|
"Ζ": "Z",
|
|||
|
|
"Η": "I",
|
|||
|
|
"Θ": "TH",
|
|||
|
|
"Ι": "I",
|
|||
|
|
"Κ": "K",
|
|||
|
|
"Λ": "L",
|
|||
|
|
"Μ": "M",
|
|||
|
|
"Ν": "N",
|
|||
|
|
"Ξ": "KS",
|
|||
|
|
"Ο": "O",
|
|||
|
|
"Π": "P",
|
|||
|
|
"Ρ": "R",
|
|||
|
|
"Σ": "S",
|
|||
|
|
"Τ": "T",
|
|||
|
|
"Υ": "Y",
|
|||
|
|
"Φ": "F",
|
|||
|
|
"Χ": "X",
|
|||
|
|
"Ψ": "PS",
|
|||
|
|
"Ω": "O",
|
|||
|
|
"Ά": "A",
|
|||
|
|
"Έ": "E",
|
|||
|
|
"Ί": "I",
|
|||
|
|
"Ό": "O",
|
|||
|
|
"Ύ": "Y",
|
|||
|
|
"Ή": "I",
|
|||
|
|
"Ώ": "O",
|
|||
|
|
"Ϊ": "I",
|
|||
|
|
"Ϋ": "Y",
|
|||
|
|
"ā": "a",
|
|||
|
|
"ē": "e",
|
|||
|
|
"ģ": "g",
|
|||
|
|
"ī": "i",
|
|||
|
|
"ķ": "k",
|
|||
|
|
"ļ": "l",
|
|||
|
|
"ņ": "n",
|
|||
|
|
"ū": "u",
|
|||
|
|
"Ā": "A",
|
|||
|
|
"Ē": "E",
|
|||
|
|
"Ģ": "G",
|
|||
|
|
"Ī": "I",
|
|||
|
|
"Ķ": "k",
|
|||
|
|
"Ļ": "L",
|
|||
|
|
"Ņ": "N",
|
|||
|
|
"Ū": "U",
|
|||
|
|
"Ќ": "Kj",
|
|||
|
|
"ќ": "kj",
|
|||
|
|
"Љ": "Lj",
|
|||
|
|
"љ": "lj",
|
|||
|
|
"Њ": "Nj",
|
|||
|
|
"њ": "nj",
|
|||
|
|
"Тс": "Ts",
|
|||
|
|
"тс": "ts",
|
|||
|
|
"ą": "a",
|
|||
|
|
"ć": "c",
|
|||
|
|
"ę": "e",
|
|||
|
|
"ł": "l",
|
|||
|
|
"ń": "n",
|
|||
|
|
"ś": "s",
|
|||
|
|
"ź": "z",
|
|||
|
|
"ż": "z",
|
|||
|
|
"Ą": "A",
|
|||
|
|
"Ć": "C",
|
|||
|
|
"Ę": "E",
|
|||
|
|
"Ł": "L",
|
|||
|
|
"Ń": "N",
|
|||
|
|
"Ś": "S",
|
|||
|
|
"Ź": "Z",
|
|||
|
|
"Ż": "Z",
|
|||
|
|
"Є": "Ye",
|
|||
|
|
"І": "I",
|
|||
|
|
"Ї": "Yi",
|
|||
|
|
"Ґ": "G",
|
|||
|
|
"є": "ye",
|
|||
|
|
"і": "i",
|
|||
|
|
"ї": "yi",
|
|||
|
|
"ґ": "g",
|
|||
|
|
"ă": "a",
|
|||
|
|
"Ă": "A",
|
|||
|
|
"ș": "s",
|
|||
|
|
"Ș": "S",
|
|||
|
|
"ț": "t",
|
|||
|
|
"Ț": "T",
|
|||
|
|
"ţ": "t",
|
|||
|
|
"Ţ": "T",
|
|||
|
|
"а": "a",
|
|||
|
|
"б": "b",
|
|||
|
|
"в": "v",
|
|||
|
|
"г": "g",
|
|||
|
|
"д": "d",
|
|||
|
|
"е": "e",
|
|||
|
|
"ё": "yo",
|
|||
|
|
"ж": "zh",
|
|||
|
|
"з": "z",
|
|||
|
|
"и": "i",
|
|||
|
|
"й": "i",
|
|||
|
|
"к": "k",
|
|||
|
|
"л": "l",
|
|||
|
|
"м": "m",
|
|||
|
|
"н": "n",
|
|||
|
|
"о": "o",
|
|||
|
|
"п": "p",
|
|||
|
|
"р": "r",
|
|||
|
|
"с": "s",
|
|||
|
|
"т": "t",
|
|||
|
|
"у": "u",
|
|||
|
|
"ф": "f",
|
|||
|
|
"х": "kh",
|
|||
|
|
"ц": "c",
|
|||
|
|
"ч": "ch",
|
|||
|
|
"ш": "sh",
|
|||
|
|
"щ": "sh",
|
|||
|
|
"ъ": "",
|
|||
|
|
"ы": "y",
|
|||
|
|
"ь": "",
|
|||
|
|
"э": "e",
|
|||
|
|
"ю": "yu",
|
|||
|
|
"я": "ya",
|
|||
|
|
"А": "A",
|
|||
|
|
"Б": "B",
|
|||
|
|
"В": "V",
|
|||
|
|
"Г": "G",
|
|||
|
|
"Д": "D",
|
|||
|
|
"Е": "E",
|
|||
|
|
"Ё": "Yo",
|
|||
|
|
"Ж": "Zh",
|
|||
|
|
"З": "Z",
|
|||
|
|
"И": "I",
|
|||
|
|
"Й": "I",
|
|||
|
|
"К": "K",
|
|||
|
|
"Л": "L",
|
|||
|
|
"М": "M",
|
|||
|
|
"Н": "N",
|
|||
|
|
"О": "O",
|
|||
|
|
"П": "P",
|
|||
|
|
"Р": "R",
|
|||
|
|
"С": "S",
|
|||
|
|
"Т": "T",
|
|||
|
|
"У": "U",
|
|||
|
|
"Ф": "F",
|
|||
|
|
"Х": "Kh",
|
|||
|
|
"Ц": "C",
|
|||
|
|
"Ч": "Ch",
|
|||
|
|
"Ш": "Sh",
|
|||
|
|
"Щ": "Sh",
|
|||
|
|
"Ъ": "",
|
|||
|
|
"Ы": "Y",
|
|||
|
|
"Ь": "",
|
|||
|
|
"Э": "E",
|
|||
|
|
"Ю": "Yu",
|
|||
|
|
"Я": "Ya",
|
|||
|
|
"ђ": "dj",
|
|||
|
|
"ј": "j",
|
|||
|
|
"ћ": "c",
|
|||
|
|
"џ": "dz",
|
|||
|
|
"Ђ": "Dj",
|
|||
|
|
"Ј": "j",
|
|||
|
|
"Ћ": "C",
|
|||
|
|
"Џ": "Dz",
|
|||
|
|
"ľ": "l",
|
|||
|
|
"ĺ": "l",
|
|||
|
|
"ŕ": "r",
|
|||
|
|
"Ľ": "L",
|
|||
|
|
"Ĺ": "L",
|
|||
|
|
"Ŕ": "R",
|
|||
|
|
"ş": "s",
|
|||
|
|
"Ş": "S",
|
|||
|
|
"ı": "i",
|
|||
|
|
"İ": "I",
|
|||
|
|
"ğ": "g",
|
|||
|
|
"Ğ": "G",
|
|||
|
|
"ả": "a",
|
|||
|
|
"Ả": "A",
|
|||
|
|
"ẳ": "a",
|
|||
|
|
"Ẳ": "A",
|
|||
|
|
"ẩ": "a",
|
|||
|
|
"Ẩ": "A",
|
|||
|
|
"đ": "d",
|
|||
|
|
"Đ": "D",
|
|||
|
|
"ẹ": "e",
|
|||
|
|
"Ẹ": "E",
|
|||
|
|
"ẽ": "e",
|
|||
|
|
"Ẽ": "E",
|
|||
|
|
"ẻ": "e",
|
|||
|
|
"Ẻ": "E",
|
|||
|
|
"ế": "e",
|
|||
|
|
"Ế": "E",
|
|||
|
|
"ề": "e",
|
|||
|
|
"Ề": "E",
|
|||
|
|
"ệ": "e",
|
|||
|
|
"Ệ": "E",
|
|||
|
|
"ễ": "e",
|
|||
|
|
"Ễ": "E",
|
|||
|
|
"ể": "e",
|
|||
|
|
"Ể": "E",
|
|||
|
|
"ỏ": "o",
|
|||
|
|
"ọ": "o",
|
|||
|
|
"Ọ": "o",
|
|||
|
|
"ố": "o",
|
|||
|
|
"Ố": "O",
|
|||
|
|
"ồ": "o",
|
|||
|
|
"Ồ": "O",
|
|||
|
|
"ổ": "o",
|
|||
|
|
"Ổ": "O",
|
|||
|
|
"ộ": "o",
|
|||
|
|
"Ộ": "O",
|
|||
|
|
"ỗ": "o",
|
|||
|
|
"Ỗ": "O",
|
|||
|
|
"ơ": "o",
|
|||
|
|
"Ơ": "O",
|
|||
|
|
"ớ": "o",
|
|||
|
|
"Ớ": "O",
|
|||
|
|
"ờ": "o",
|
|||
|
|
"Ờ": "O",
|
|||
|
|
"ợ": "o",
|
|||
|
|
"Ợ": "O",
|
|||
|
|
"ỡ": "o",
|
|||
|
|
"Ỡ": "O",
|
|||
|
|
"Ở": "o",
|
|||
|
|
"ở": "o",
|
|||
|
|
"ị": "i",
|
|||
|
|
"Ị": "I",
|
|||
|
|
"ĩ": "i",
|
|||
|
|
"Ĩ": "I",
|
|||
|
|
"ỉ": "i",
|
|||
|
|
"Ỉ": "i",
|
|||
|
|
"ủ": "u",
|
|||
|
|
"Ủ": "U",
|
|||
|
|
"ụ": "u",
|
|||
|
|
"Ụ": "U",
|
|||
|
|
"ũ": "u",
|
|||
|
|
"Ũ": "U",
|
|||
|
|
"ư": "u",
|
|||
|
|
"Ư": "U",
|
|||
|
|
"ứ": "u",
|
|||
|
|
"Ứ": "U",
|
|||
|
|
"ừ": "u",
|
|||
|
|
"Ừ": "U",
|
|||
|
|
"ự": "u",
|
|||
|
|
"Ự": "U",
|
|||
|
|
"ữ": "u",
|
|||
|
|
"Ữ": "U",
|
|||
|
|
"ử": "u",
|
|||
|
|
"Ử": "ư",
|
|||
|
|
"ỷ": "y",
|
|||
|
|
"Ỷ": "y",
|
|||
|
|
"ỳ": "y",
|
|||
|
|
"Ỳ": "Y",
|
|||
|
|
"ỵ": "y",
|
|||
|
|
"Ỵ": "Y",
|
|||
|
|
"ỹ": "y",
|
|||
|
|
"Ỹ": "Y",
|
|||
|
|
"ạ": "a",
|
|||
|
|
"Ạ": "A",
|
|||
|
|
"ấ": "a",
|
|||
|
|
"Ấ": "A",
|
|||
|
|
"ầ": "a",
|
|||
|
|
"Ầ": "A",
|
|||
|
|
"ậ": "a",
|
|||
|
|
"Ậ": "A",
|
|||
|
|
"ẫ": "a",
|
|||
|
|
"Ẫ": "A",
|
|||
|
|
"ắ": "a",
|
|||
|
|
"Ắ": "A",
|
|||
|
|
"ằ": "a",
|
|||
|
|
"Ằ": "A",
|
|||
|
|
"ặ": "a",
|
|||
|
|
"Ặ": "A",
|
|||
|
|
"ẵ": "a",
|
|||
|
|
"Ẵ": "A",
|
|||
|
|
"⓪": "0",
|
|||
|
|
"①": "1",
|
|||
|
|
"②": "2",
|
|||
|
|
"③": "3",
|
|||
|
|
"④": "4",
|
|||
|
|
"⑤": "5",
|
|||
|
|
"⑥": "6",
|
|||
|
|
"⑦": "7",
|
|||
|
|
"⑧": "8",
|
|||
|
|
"⑨": "9",
|
|||
|
|
"⑩": "10",
|
|||
|
|
"⑪": "11",
|
|||
|
|
"⑫": "12",
|
|||
|
|
"⑬": "13",
|
|||
|
|
"⑭": "14",
|
|||
|
|
"⑮": "15",
|
|||
|
|
"⑯": "16",
|
|||
|
|
"⑰": "17",
|
|||
|
|
"⑱": "18",
|
|||
|
|
"⑲": "18",
|
|||
|
|
"⑳": "18",
|
|||
|
|
"⓵": "1",
|
|||
|
|
"⓶": "2",
|
|||
|
|
"⓷": "3",
|
|||
|
|
"⓸": "4",
|
|||
|
|
"⓹": "5",
|
|||
|
|
"⓺": "6",
|
|||
|
|
"⓻": "7",
|
|||
|
|
"⓼": "8",
|
|||
|
|
"⓽": "9",
|
|||
|
|
"⓾": "10",
|
|||
|
|
"⓿": "0",
|
|||
|
|
"⓫": "11",
|
|||
|
|
"⓬": "12",
|
|||
|
|
"⓭": "13",
|
|||
|
|
"⓮": "14",
|
|||
|
|
"⓯": "15",
|
|||
|
|
"⓰": "16",
|
|||
|
|
"⓱": "17",
|
|||
|
|
"⓲": "18",
|
|||
|
|
"⓳": "19",
|
|||
|
|
"⓴": "20",
|
|||
|
|
"Ⓐ": "A",
|
|||
|
|
"Ⓑ": "B",
|
|||
|
|
"Ⓒ": "C",
|
|||
|
|
"Ⓓ": "D",
|
|||
|
|
"Ⓔ": "E",
|
|||
|
|
"Ⓕ": "F",
|
|||
|
|
"Ⓖ": "G",
|
|||
|
|
"Ⓗ": "H",
|
|||
|
|
"Ⓘ": "I",
|
|||
|
|
"Ⓙ": "J",
|
|||
|
|
"Ⓚ": "K",
|
|||
|
|
"Ⓛ": "L",
|
|||
|
|
"Ⓜ": "M",
|
|||
|
|
"Ⓝ": "N",
|
|||
|
|
"Ⓞ": "O",
|
|||
|
|
"Ⓟ": "P",
|
|||
|
|
"Ⓠ": "Q",
|
|||
|
|
"Ⓡ": "R",
|
|||
|
|
"Ⓢ": "S",
|
|||
|
|
"Ⓣ": "T",
|
|||
|
|
"Ⓤ": "U",
|
|||
|
|
"Ⓥ": "V",
|
|||
|
|
"Ⓦ": "W",
|
|||
|
|
"Ⓧ": "X",
|
|||
|
|
"Ⓨ": "Y",
|
|||
|
|
"Ⓩ": "Z",
|
|||
|
|
"ⓐ": "a",
|
|||
|
|
"ⓑ": "b",
|
|||
|
|
"ⓒ": "c",
|
|||
|
|
"ⓓ": "d",
|
|||
|
|
"ⓔ": "e",
|
|||
|
|
"ⓕ": "f",
|
|||
|
|
"ⓖ": "g",
|
|||
|
|
"ⓗ": "h",
|
|||
|
|
"ⓘ": "i",
|
|||
|
|
"ⓙ": "j",
|
|||
|
|
"ⓚ": "k",
|
|||
|
|
"ⓛ": "l",
|
|||
|
|
"ⓜ": "m",
|
|||
|
|
"ⓝ": "n",
|
|||
|
|
"ⓞ": "o",
|
|||
|
|
"ⓟ": "p",
|
|||
|
|
"ⓠ": "q",
|
|||
|
|
"ⓡ": "r",
|
|||
|
|
"ⓢ": "s",
|
|||
|
|
"ⓣ": "t",
|
|||
|
|
"ⓤ": "u",
|
|||
|
|
"ⓦ": "v",
|
|||
|
|
"ⓥ": "w",
|
|||
|
|
"ⓧ": "x",
|
|||
|
|
"ⓨ": "y",
|
|||
|
|
"ⓩ": "z",
|
|||
|
|
"“": "\"",
|
|||
|
|
"”": "\"",
|
|||
|
|
"‘": "'",
|
|||
|
|
"’": "'",
|
|||
|
|
"∂": "d",
|
|||
|
|
"ƒ": "f",
|
|||
|
|
"™": "(TM)",
|
|||
|
|
"©": "(C)",
|
|||
|
|
"œ": "oe",
|
|||
|
|
"Œ": "OE",
|
|||
|
|
"®": "(R)",
|
|||
|
|
"†": "+",
|
|||
|
|
"℠": "(SM)",
|
|||
|
|
"…": "...",
|
|||
|
|
"˚": "o",
|
|||
|
|
"º": "o",
|
|||
|
|
"ª": "a",
|
|||
|
|
"•": "*",
|
|||
|
|
"၊": ",",
|
|||
|
|
"။": ".",
|
|||
|
|
"$": "USD",
|
|||
|
|
"€": "EUR",
|
|||
|
|
"₢": "BRN",
|
|||
|
|
"₣": "FRF",
|
|||
|
|
"£": "GBP",
|
|||
|
|
"₤": "ITL",
|
|||
|
|
"₦": "NGN",
|
|||
|
|
"₧": "ESP",
|
|||
|
|
"₩": "KRW",
|
|||
|
|
"₪": "ILS",
|
|||
|
|
"₫": "VND",
|
|||
|
|
"₭": "LAK",
|
|||
|
|
"₮": "MNT",
|
|||
|
|
"₯": "GRD",
|
|||
|
|
"₱": "ARS",
|
|||
|
|
"₲": "PYG",
|
|||
|
|
"₳": "ARA",
|
|||
|
|
"₴": "UAH",
|
|||
|
|
"₵": "GHS",
|
|||
|
|
"¢": "cent",
|
|||
|
|
"¥": "CNY",
|
|||
|
|
"元": "CNY",
|
|||
|
|
"円": "YEN",
|
|||
|
|
"﷼": "IRR",
|
|||
|
|
"₠": "EWE",
|
|||
|
|
"฿": "THB",
|
|||
|
|
"₨": "INR",
|
|||
|
|
"₹": "INR",
|
|||
|
|
"₰": "PF",
|
|||
|
|
"₺": "TRY",
|
|||
|
|
"؋": "AFN",
|
|||
|
|
"₼": "AZN",
|
|||
|
|
"лв": "BGN",
|
|||
|
|
"៛": "KHR",
|
|||
|
|
"₡": "CRC",
|
|||
|
|
"₸": "KZT",
|
|||
|
|
"ден": "MKD",
|
|||
|
|
"zł": "PLN",
|
|||
|
|
"₽": "RUB",
|
|||
|
|
"₾": "GEL"
|
|||
|
|
};
|
|||
|
|
/**
|
|||
|
|
* special look ahead character array
|
|||
|
|
* These characters form with consonants to become 'single'/consonant combo
|
|||
|
|
* @type [Array]
|
|||
|
|
*/
|
|||
|
|
var lookAheadCharArray = ["်", "ް"];
|
|||
|
|
/**
|
|||
|
|
* diatricMap for languages where transliteration changes entirely as more diatrics are added
|
|||
|
|
* @type {Object}
|
|||
|
|
*/
|
|||
|
|
var diatricMap = {
|
|||
|
|
"ာ": "a",
|
|||
|
|
"ါ": "a",
|
|||
|
|
"ေ": "e",
|
|||
|
|
"ဲ": "e",
|
|||
|
|
"ိ": "i",
|
|||
|
|
"ီ": "i",
|
|||
|
|
"ို": "o",
|
|||
|
|
"ု": "u",
|
|||
|
|
"ူ": "u",
|
|||
|
|
"ေါင်": "aung",
|
|||
|
|
"ော": "aw",
|
|||
|
|
"ော်": "aw",
|
|||
|
|
"ေါ": "aw",
|
|||
|
|
"ေါ်": "aw",
|
|||
|
|
"်": "်",
|
|||
|
|
"က်": "et",
|
|||
|
|
"ိုက်": "aik",
|
|||
|
|
"ောက်": "auk",
|
|||
|
|
"င်": "in",
|
|||
|
|
"ိုင်": "aing",
|
|||
|
|
"ောင်": "aung",
|
|||
|
|
"စ်": "it",
|
|||
|
|
"ည်": "i",
|
|||
|
|
"တ်": "at",
|
|||
|
|
"ိတ်": "eik",
|
|||
|
|
"ုတ်": "ok",
|
|||
|
|
"ွတ်": "ut",
|
|||
|
|
"ေတ်": "it",
|
|||
|
|
"ဒ်": "d",
|
|||
|
|
"ိုဒ်": "ok",
|
|||
|
|
"ုဒ်": "ait",
|
|||
|
|
"န်": "an",
|
|||
|
|
"ာန်": "an",
|
|||
|
|
"ိန်": "ein",
|
|||
|
|
"ုန်": "on",
|
|||
|
|
"ွန်": "un",
|
|||
|
|
"ပ်": "at",
|
|||
|
|
"ိပ်": "eik",
|
|||
|
|
"ုပ်": "ok",
|
|||
|
|
"ွပ်": "ut",
|
|||
|
|
"န်ုပ်": "nub",
|
|||
|
|
"မ်": "an",
|
|||
|
|
"ိမ်": "ein",
|
|||
|
|
"ုမ်": "on",
|
|||
|
|
"ွမ်": "un",
|
|||
|
|
"ယ်": "e",
|
|||
|
|
"ိုလ်": "ol",
|
|||
|
|
"ဉ်": "in",
|
|||
|
|
"ံ": "an",
|
|||
|
|
"ိံ": "ein",
|
|||
|
|
"ုံ": "on",
|
|||
|
|
"ައް": "ah",
|
|||
|
|
"ަށް": "ah"
|
|||
|
|
};
|
|||
|
|
/**
|
|||
|
|
* langCharMap language specific characters translations
|
|||
|
|
* @type {Object}
|
|||
|
|
*/
|
|||
|
|
var langCharMap = {
|
|||
|
|
"en": {},
|
|||
|
|
"az": {
|
|||
|
|
"ç": "c",
|
|||
|
|
"ə": "e",
|
|||
|
|
"ğ": "g",
|
|||
|
|
"ı": "i",
|
|||
|
|
"ö": "o",
|
|||
|
|
"ş": "s",
|
|||
|
|
"ü": "u",
|
|||
|
|
"Ç": "C",
|
|||
|
|
"Ə": "E",
|
|||
|
|
"Ğ": "G",
|
|||
|
|
"İ": "I",
|
|||
|
|
"Ö": "O",
|
|||
|
|
"Ş": "S",
|
|||
|
|
"Ü": "U"
|
|||
|
|
},
|
|||
|
|
"cs": {
|
|||
|
|
"č": "c",
|
|||
|
|
"ď": "d",
|
|||
|
|
"ě": "e",
|
|||
|
|
"ň": "n",
|
|||
|
|
"ř": "r",
|
|||
|
|
"š": "s",
|
|||
|
|
"ť": "t",
|
|||
|
|
"ů": "u",
|
|||
|
|
"ž": "z",
|
|||
|
|
"Č": "C",
|
|||
|
|
"Ď": "D",
|
|||
|
|
"Ě": "E",
|
|||
|
|
"Ň": "N",
|
|||
|
|
"Ř": "R",
|
|||
|
|
"Š": "S",
|
|||
|
|
"Ť": "T",
|
|||
|
|
"Ů": "U",
|
|||
|
|
"Ž": "Z"
|
|||
|
|
},
|
|||
|
|
"fi": {
|
|||
|
|
"ä": "a",
|
|||
|
|
"Ä": "A",
|
|||
|
|
"ö": "o",
|
|||
|
|
"Ö": "O"
|
|||
|
|
},
|
|||
|
|
"hu": {
|
|||
|
|
"ä": "a",
|
|||
|
|
"Ä": "A",
|
|||
|
|
"ö": "o",
|
|||
|
|
"Ö": "O",
|
|||
|
|
"ü": "u",
|
|||
|
|
"Ü": "U",
|
|||
|
|
"ű": "u",
|
|||
|
|
"Ű": "U"
|
|||
|
|
},
|
|||
|
|
"lt": {
|
|||
|
|
"ą": "a",
|
|||
|
|
"č": "c",
|
|||
|
|
"ę": "e",
|
|||
|
|
"ė": "e",
|
|||
|
|
"į": "i",
|
|||
|
|
"š": "s",
|
|||
|
|
"ų": "u",
|
|||
|
|
"ū": "u",
|
|||
|
|
"ž": "z",
|
|||
|
|
"Ą": "A",
|
|||
|
|
"Č": "C",
|
|||
|
|
"Ę": "E",
|
|||
|
|
"Ė": "E",
|
|||
|
|
"Į": "I",
|
|||
|
|
"Š": "S",
|
|||
|
|
"Ų": "U",
|
|||
|
|
"Ū": "U"
|
|||
|
|
},
|
|||
|
|
"lv": {
|
|||
|
|
"ā": "a",
|
|||
|
|
"č": "c",
|
|||
|
|
"ē": "e",
|
|||
|
|
"ģ": "g",
|
|||
|
|
"ī": "i",
|
|||
|
|
"ķ": "k",
|
|||
|
|
"ļ": "l",
|
|||
|
|
"ņ": "n",
|
|||
|
|
"š": "s",
|
|||
|
|
"ū": "u",
|
|||
|
|
"ž": "z",
|
|||
|
|
"Ā": "A",
|
|||
|
|
"Č": "C",
|
|||
|
|
"Ē": "E",
|
|||
|
|
"Ģ": "G",
|
|||
|
|
"Ī": "i",
|
|||
|
|
"Ķ": "k",
|
|||
|
|
"Ļ": "L",
|
|||
|
|
"Ņ": "N",
|
|||
|
|
"Š": "S",
|
|||
|
|
"Ū": "u",
|
|||
|
|
"Ž": "Z"
|
|||
|
|
},
|
|||
|
|
"pl": {
|
|||
|
|
"ą": "a",
|
|||
|
|
"ć": "c",
|
|||
|
|
"ę": "e",
|
|||
|
|
"ł": "l",
|
|||
|
|
"ń": "n",
|
|||
|
|
"ó": "o",
|
|||
|
|
"ś": "s",
|
|||
|
|
"ź": "z",
|
|||
|
|
"ż": "z",
|
|||
|
|
"Ą": "A",
|
|||
|
|
"Ć": "C",
|
|||
|
|
"Ę": "e",
|
|||
|
|
"Ł": "L",
|
|||
|
|
"Ń": "N",
|
|||
|
|
"Ó": "O",
|
|||
|
|
"Ś": "S",
|
|||
|
|
"Ź": "Z",
|
|||
|
|
"Ż": "Z"
|
|||
|
|
},
|
|||
|
|
"sv": {
|
|||
|
|
"ä": "a",
|
|||
|
|
"Ä": "A",
|
|||
|
|
"ö": "o",
|
|||
|
|
"Ö": "O"
|
|||
|
|
},
|
|||
|
|
"sk": {
|
|||
|
|
"ä": "a",
|
|||
|
|
"Ä": "A"
|
|||
|
|
},
|
|||
|
|
"sr": {
|
|||
|
|
"љ": "lj",
|
|||
|
|
"њ": "nj",
|
|||
|
|
"Љ": "Lj",
|
|||
|
|
"Њ": "Nj",
|
|||
|
|
"đ": "dj",
|
|||
|
|
"Đ": "Dj"
|
|||
|
|
},
|
|||
|
|
"tr": {
|
|||
|
|
"Ü": "U",
|
|||
|
|
"Ö": "O",
|
|||
|
|
"ü": "u",
|
|||
|
|
"ö": "o"
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
/**
|
|||
|
|
* symbolMap language specific symbol translations
|
|||
|
|
* translations must be transliterated already
|
|||
|
|
* @type {Object}
|
|||
|
|
*/
|
|||
|
|
var symbolMap = {
|
|||
|
|
"ar": {
|
|||
|
|
"∆": "delta",
|
|||
|
|
"∞": "la-nihaya",
|
|||
|
|
"♥": "hob",
|
|||
|
|
"&": "wa",
|
|||
|
|
"|": "aw",
|
|||
|
|
"<": "aqal-men",
|
|||
|
|
">": "akbar-men",
|
|||
|
|
"∑": "majmou",
|
|||
|
|
"¤": "omla"
|
|||
|
|
},
|
|||
|
|
"az": {},
|
|||
|
|
"ca": {
|
|||
|
|
"∆": "delta",
|
|||
|
|
"∞": "infinit",
|
|||
|
|
"♥": "amor",
|
|||
|
|
"&": "i",
|
|||
|
|
"|": "o",
|
|||
|
|
"<": "menys que",
|
|||
|
|
">": "mes que",
|
|||
|
|
"∑": "suma dels",
|
|||
|
|
"¤": "moneda"
|
|||
|
|
},
|
|||
|
|
"cs": {
|
|||
|
|
"∆": "delta",
|
|||
|
|
"∞": "nekonecno",
|
|||
|
|
"♥": "laska",
|
|||
|
|
"&": "a",
|
|||
|
|
"|": "nebo",
|
|||
|
|
"<": "mensi nez",
|
|||
|
|
">": "vetsi nez",
|
|||
|
|
"∑": "soucet",
|
|||
|
|
"¤": "mena"
|
|||
|
|
},
|
|||
|
|
"de": {
|
|||
|
|
"∆": "delta",
|
|||
|
|
"∞": "unendlich",
|
|||
|
|
"♥": "Liebe",
|
|||
|
|
"&": "und",
|
|||
|
|
"|": "oder",
|
|||
|
|
"<": "kleiner als",
|
|||
|
|
">": "groesser als",
|
|||
|
|
"∑": "Summe von",
|
|||
|
|
"¤": "Waehrung"
|
|||
|
|
},
|
|||
|
|
"dv": {
|
|||
|
|
"∆": "delta",
|
|||
|
|
"∞": "kolunulaa",
|
|||
|
|
"♥": "loabi",
|
|||
|
|
"&": "aai",
|
|||
|
|
"|": "noonee",
|
|||
|
|
"<": "ah vure kuda",
|
|||
|
|
">": "ah vure bodu",
|
|||
|
|
"∑": "jumula",
|
|||
|
|
"¤": "faisaa"
|
|||
|
|
},
|
|||
|
|
"en": {
|
|||
|
|
"∆": "delta",
|
|||
|
|
"∞": "infinity",
|
|||
|
|
"♥": "love",
|
|||
|
|
"&": "and",
|
|||
|
|
"|": "or",
|
|||
|
|
"<": "less than",
|
|||
|
|
">": "greater than",
|
|||
|
|
"∑": "sum",
|
|||
|
|
"¤": "currency"
|
|||
|
|
},
|
|||
|
|
"es": {
|
|||
|
|
"∆": "delta",
|
|||
|
|
"∞": "infinito",
|
|||
|
|
"♥": "amor",
|
|||
|
|
"&": "y",
|
|||
|
|
"|": "u",
|
|||
|
|
"<": "menos que",
|
|||
|
|
">": "mas que",
|
|||
|
|
"∑": "suma de los",
|
|||
|
|
"¤": "moneda"
|
|||
|
|
},
|
|||
|
|
"fa": {
|
|||
|
|
"∆": "delta",
|
|||
|
|
"∞": "bi-nahayat",
|
|||
|
|
"♥": "eshgh",
|
|||
|
|
"&": "va",
|
|||
|
|
"|": "ya",
|
|||
|
|
"<": "kamtar-az",
|
|||
|
|
">": "bishtar-az",
|
|||
|
|
"∑": "majmooe",
|
|||
|
|
"¤": "vahed"
|
|||
|
|
},
|
|||
|
|
"fi": {
|
|||
|
|
"∆": "delta",
|
|||
|
|
"∞": "aarettomyys",
|
|||
|
|
"♥": "rakkaus",
|
|||
|
|
"&": "ja",
|
|||
|
|
"|": "tai",
|
|||
|
|
"<": "pienempi kuin",
|
|||
|
|
">": "suurempi kuin",
|
|||
|
|
"∑": "summa",
|
|||
|
|
"¤": "valuutta"
|
|||
|
|
},
|
|||
|
|
"fr": {
|
|||
|
|
"∆": "delta",
|
|||
|
|
"∞": "infiniment",
|
|||
|
|
"♥": "Amour",
|
|||
|
|
"&": "et",
|
|||
|
|
"|": "ou",
|
|||
|
|
"<": "moins que",
|
|||
|
|
">": "superieure a",
|
|||
|
|
"∑": "somme des",
|
|||
|
|
"¤": "monnaie"
|
|||
|
|
},
|
|||
|
|
"ge": {
|
|||
|
|
"∆": "delta",
|
|||
|
|
"∞": "usasruloba",
|
|||
|
|
"♥": "siqvaruli",
|
|||
|
|
"&": "da",
|
|||
|
|
"|": "an",
|
|||
|
|
"<": "naklebi",
|
|||
|
|
">": "meti",
|
|||
|
|
"∑": "jami",
|
|||
|
|
"¤": "valuta"
|
|||
|
|
},
|
|||
|
|
"gr": {},
|
|||
|
|
"hu": {
|
|||
|
|
"∆": "delta",
|
|||
|
|
"∞": "vegtelen",
|
|||
|
|
"♥": "szerelem",
|
|||
|
|
"&": "es",
|
|||
|
|
"|": "vagy",
|
|||
|
|
"<": "kisebb mint",
|
|||
|
|
">": "nagyobb mint",
|
|||
|
|
"∑": "szumma",
|
|||
|
|
"¤": "penznem"
|
|||
|
|
},
|
|||
|
|
"it": {
|
|||
|
|
"∆": "delta",
|
|||
|
|
"∞": "infinito",
|
|||
|
|
"♥": "amore",
|
|||
|
|
"&": "e",
|
|||
|
|
"|": "o",
|
|||
|
|
"<": "minore di",
|
|||
|
|
">": "maggiore di",
|
|||
|
|
"∑": "somma",
|
|||
|
|
"¤": "moneta"
|
|||
|
|
},
|
|||
|
|
"lt": {
|
|||
|
|
"∆": "delta",
|
|||
|
|
"∞": "begalybe",
|
|||
|
|
"♥": "meile",
|
|||
|
|
"&": "ir",
|
|||
|
|
"|": "ar",
|
|||
|
|
"<": "maziau nei",
|
|||
|
|
">": "daugiau nei",
|
|||
|
|
"∑": "suma",
|
|||
|
|
"¤": "valiuta"
|
|||
|
|
},
|
|||
|
|
"lv": {
|
|||
|
|
"∆": "delta",
|
|||
|
|
"∞": "bezgaliba",
|
|||
|
|
"♥": "milestiba",
|
|||
|
|
"&": "un",
|
|||
|
|
"|": "vai",
|
|||
|
|
"<": "mazak neka",
|
|||
|
|
">": "lielaks neka",
|
|||
|
|
"∑": "summa",
|
|||
|
|
"¤": "valuta"
|
|||
|
|
},
|
|||
|
|
"my": {
|
|||
|
|
"∆": "kwahkhyaet",
|
|||
|
|
"∞": "asaonasme",
|
|||
|
|
"♥": "akhyait",
|
|||
|
|
"&": "nhin",
|
|||
|
|
"|": "tho",
|
|||
|
|
"<": "ngethaw",
|
|||
|
|
">": "kyithaw",
|
|||
|
|
"∑": "paungld",
|
|||
|
|
"¤": "ngwekye"
|
|||
|
|
},
|
|||
|
|
"mk": {},
|
|||
|
|
"nl": {
|
|||
|
|
"∆": "delta",
|
|||
|
|
"∞": "oneindig",
|
|||
|
|
"♥": "liefde",
|
|||
|
|
"&": "en",
|
|||
|
|
"|": "of",
|
|||
|
|
"<": "kleiner dan",
|
|||
|
|
">": "groter dan",
|
|||
|
|
"∑": "som",
|
|||
|
|
"¤": "valuta"
|
|||
|
|
},
|
|||
|
|
"pl": {
|
|||
|
|
"∆": "delta",
|
|||
|
|
"∞": "nieskonczonosc",
|
|||
|
|
"♥": "milosc",
|
|||
|
|
"&": "i",
|
|||
|
|
"|": "lub",
|
|||
|
|
"<": "mniejsze niz",
|
|||
|
|
">": "wieksze niz",
|
|||
|
|
"∑": "suma",
|
|||
|
|
"¤": "waluta"
|
|||
|
|
},
|
|||
|
|
"pt": {
|
|||
|
|
"∆": "delta",
|
|||
|
|
"∞": "infinito",
|
|||
|
|
"♥": "amor",
|
|||
|
|
"&": "e",
|
|||
|
|
"|": "ou",
|
|||
|
|
"<": "menor que",
|
|||
|
|
">": "maior que",
|
|||
|
|
"∑": "soma",
|
|||
|
|
"¤": "moeda"
|
|||
|
|
},
|
|||
|
|
"ro": {
|
|||
|
|
"∆": "delta",
|
|||
|
|
"∞": "infinit",
|
|||
|
|
"♥": "dragoste",
|
|||
|
|
"&": "si",
|
|||
|
|
"|": "sau",
|
|||
|
|
"<": "mai mic ca",
|
|||
|
|
">": "mai mare ca",
|
|||
|
|
"∑": "suma",
|
|||
|
|
"¤": "valuta"
|
|||
|
|
},
|
|||
|
|
"ru": {
|
|||
|
|
"∆": "delta",
|
|||
|
|
"∞": "beskonechno",
|
|||
|
|
"♥": "lubov",
|
|||
|
|
"&": "i",
|
|||
|
|
"|": "ili",
|
|||
|
|
"<": "menshe",
|
|||
|
|
">": "bolshe",
|
|||
|
|
"∑": "summa",
|
|||
|
|
"¤": "valjuta"
|
|||
|
|
},
|
|||
|
|
"sk": {
|
|||
|
|
"∆": "delta",
|
|||
|
|
"∞": "nekonecno",
|
|||
|
|
"♥": "laska",
|
|||
|
|
"&": "a",
|
|||
|
|
"|": "alebo",
|
|||
|
|
"<": "menej ako",
|
|||
|
|
">": "viac ako",
|
|||
|
|
"∑": "sucet",
|
|||
|
|
"¤": "mena"
|
|||
|
|
},
|
|||
|
|
"sr": {},
|
|||
|
|
"tr": {
|
|||
|
|
"∆": "delta",
|
|||
|
|
"∞": "sonsuzluk",
|
|||
|
|
"♥": "ask",
|
|||
|
|
"&": "ve",
|
|||
|
|
"|": "veya",
|
|||
|
|
"<": "kucuktur",
|
|||
|
|
">": "buyuktur",
|
|||
|
|
"∑": "toplam",
|
|||
|
|
"¤": "para birimi"
|
|||
|
|
},
|
|||
|
|
"uk": {
|
|||
|
|
"∆": "delta",
|
|||
|
|
"∞": "bezkinechnist",
|
|||
|
|
"♥": "lubov",
|
|||
|
|
"&": "i",
|
|||
|
|
"|": "abo",
|
|||
|
|
"<": "menshe",
|
|||
|
|
">": "bilshe",
|
|||
|
|
"∑": "suma",
|
|||
|
|
"¤": "valjuta"
|
|||
|
|
},
|
|||
|
|
"vn": {
|
|||
|
|
"∆": "delta",
|
|||
|
|
"∞": "vo cuc",
|
|||
|
|
"♥": "yeu",
|
|||
|
|
"&": "va",
|
|||
|
|
"|": "hoac",
|
|||
|
|
"<": "nho hon",
|
|||
|
|
">": "lon hon",
|
|||
|
|
"∑": "tong",
|
|||
|
|
"¤": "tien te"
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var uricChars = [
|
|||
|
|
";",
|
|||
|
|
"?",
|
|||
|
|
":",
|
|||
|
|
"@",
|
|||
|
|
"&",
|
|||
|
|
"=",
|
|||
|
|
"+",
|
|||
|
|
"$",
|
|||
|
|
",",
|
|||
|
|
"/"
|
|||
|
|
].join("");
|
|||
|
|
var uricNoSlashChars = [
|
|||
|
|
";",
|
|||
|
|
"?",
|
|||
|
|
":",
|
|||
|
|
"@",
|
|||
|
|
"&",
|
|||
|
|
"=",
|
|||
|
|
"+",
|
|||
|
|
"$",
|
|||
|
|
","
|
|||
|
|
].join("");
|
|||
|
|
var markChars = [
|
|||
|
|
".",
|
|||
|
|
"!",
|
|||
|
|
"~",
|
|||
|
|
"*",
|
|||
|
|
"'",
|
|||
|
|
"(",
|
|||
|
|
")"
|
|||
|
|
].join("");
|
|||
|
|
/**
|
|||
|
|
* getSlug
|
|||
|
|
* @param {string} input input string
|
|||
|
|
* @param {object|string} opts config object or separator string/char
|
|||
|
|
* @api public
|
|||
|
|
* @return {string} sluggified string
|
|||
|
|
*/
|
|||
|
|
var getSlug = function getSlug$1(input, opts) {
|
|||
|
|
var separator = "-";
|
|||
|
|
var result = "";
|
|||
|
|
var diatricString = "";
|
|||
|
|
var convertSymbols = true;
|
|||
|
|
var customReplacements = {};
|
|||
|
|
var maintainCase;
|
|||
|
|
var titleCase;
|
|||
|
|
var truncate;
|
|||
|
|
var uricFlag;
|
|||
|
|
var uricNoSlashFlag;
|
|||
|
|
var markFlag;
|
|||
|
|
var symbol;
|
|||
|
|
var langChar;
|
|||
|
|
var lucky;
|
|||
|
|
var i;
|
|||
|
|
var ch;
|
|||
|
|
var l;
|
|||
|
|
var lastCharWasSymbol;
|
|||
|
|
var lastCharWasDiatric;
|
|||
|
|
var allowedChars = "";
|
|||
|
|
if (typeof input !== "string") return "";
|
|||
|
|
if (typeof opts === "string") separator = opts;
|
|||
|
|
symbol = symbolMap.en;
|
|||
|
|
langChar = langCharMap.en;
|
|||
|
|
if (typeof opts === "object") {
|
|||
|
|
maintainCase = opts.maintainCase || false;
|
|||
|
|
customReplacements = opts.custom && typeof opts.custom === "object" ? opts.custom : customReplacements;
|
|||
|
|
truncate = +opts.truncate > 1 && opts.truncate || false;
|
|||
|
|
uricFlag = opts.uric || false;
|
|||
|
|
uricNoSlashFlag = opts.uricNoSlash || false;
|
|||
|
|
markFlag = opts.mark || false;
|
|||
|
|
convertSymbols = opts.symbols === false || opts.lang === false ? false : true;
|
|||
|
|
separator = opts.separator || separator;
|
|||
|
|
if (uricFlag) allowedChars += uricChars;
|
|||
|
|
if (uricNoSlashFlag) allowedChars += uricNoSlashChars;
|
|||
|
|
if (markFlag) allowedChars += markChars;
|
|||
|
|
symbol = opts.lang && symbolMap[opts.lang] && convertSymbols ? symbolMap[opts.lang] : convertSymbols ? symbolMap.en : {};
|
|||
|
|
langChar = opts.lang && langCharMap[opts.lang] ? langCharMap[opts.lang] : opts.lang === false || opts.lang === true ? {} : langCharMap.en;
|
|||
|
|
if (opts.titleCase && typeof opts.titleCase.length === "number" && Array.prototype.toString.call(opts.titleCase)) {
|
|||
|
|
opts.titleCase.forEach(function(v) {
|
|||
|
|
customReplacements[v + ""] = v + "";
|
|||
|
|
});
|
|||
|
|
titleCase = true;
|
|||
|
|
} else titleCase = !!opts.titleCase;
|
|||
|
|
if (opts.custom && typeof opts.custom.length === "number" && Array.prototype.toString.call(opts.custom)) opts.custom.forEach(function(v) {
|
|||
|
|
customReplacements[v + ""] = v + "";
|
|||
|
|
});
|
|||
|
|
Object.keys(customReplacements).forEach(function(v) {
|
|||
|
|
var r;
|
|||
|
|
if (v.length > 1) r = new RegExp("\\b" + escapeChars(v) + "\\b", "gi");
|
|||
|
|
else r = new RegExp(escapeChars(v), "gi");
|
|||
|
|
input = input.replace(r, customReplacements[v]);
|
|||
|
|
});
|
|||
|
|
for (ch in customReplacements) allowedChars += ch;
|
|||
|
|
}
|
|||
|
|
allowedChars += separator;
|
|||
|
|
allowedChars = escapeChars(allowedChars);
|
|||
|
|
input = input.replace(/(^\s+|\s+$)/g, "");
|
|||
|
|
lastCharWasSymbol = false;
|
|||
|
|
lastCharWasDiatric = false;
|
|||
|
|
for (i = 0, l = input.length; i < l; i++) {
|
|||
|
|
ch = input[i];
|
|||
|
|
if (isReplacedCustomChar(ch, customReplacements)) lastCharWasSymbol = false;
|
|||
|
|
else if (langChar[ch]) {
|
|||
|
|
ch = lastCharWasSymbol && langChar[ch].match(/[A-Za-z0-9]/) ? " " + langChar[ch] : langChar[ch];
|
|||
|
|
lastCharWasSymbol = false;
|
|||
|
|
} else if (ch in charMap) {
|
|||
|
|
if (i + 1 < l && lookAheadCharArray.indexOf(input[i + 1]) >= 0) {
|
|||
|
|
diatricString += ch;
|
|||
|
|
ch = "";
|
|||
|
|
} else if (lastCharWasDiatric === true) {
|
|||
|
|
ch = diatricMap[diatricString] + charMap[ch];
|
|||
|
|
diatricString = "";
|
|||
|
|
} else ch = lastCharWasSymbol && charMap[ch].match(/[A-Za-z0-9]/) ? " " + charMap[ch] : charMap[ch];
|
|||
|
|
lastCharWasSymbol = false;
|
|||
|
|
lastCharWasDiatric = false;
|
|||
|
|
} else if (ch in diatricMap) {
|
|||
|
|
diatricString += ch;
|
|||
|
|
ch = "";
|
|||
|
|
if (i === l - 1) ch = diatricMap[diatricString];
|
|||
|
|
lastCharWasDiatric = true;
|
|||
|
|
} else if (symbol[ch] && !(uricFlag && uricChars.indexOf(ch) !== -1) && !(uricNoSlashFlag && uricNoSlashChars.indexOf(ch) !== -1)) {
|
|||
|
|
ch = lastCharWasSymbol || result.substr(-1).match(/[A-Za-z0-9]/) ? separator + symbol[ch] : symbol[ch];
|
|||
|
|
ch += input[i + 1] !== void 0 && input[i + 1].match(/[A-Za-z0-9]/) ? separator : "";
|
|||
|
|
lastCharWasSymbol = true;
|
|||
|
|
} else {
|
|||
|
|
if (lastCharWasDiatric === true) {
|
|||
|
|
ch = diatricMap[diatricString] + ch;
|
|||
|
|
diatricString = "";
|
|||
|
|
lastCharWasDiatric = false;
|
|||
|
|
} else if (lastCharWasSymbol && (/[A-Za-z0-9]/.test(ch) || result.substr(-1).match(/A-Za-z0-9]/))) ch = " " + ch;
|
|||
|
|
lastCharWasSymbol = false;
|
|||
|
|
}
|
|||
|
|
result += ch.replace(new RegExp("[^\\w\\s" + allowedChars + "_-]", "g"), separator);
|
|||
|
|
}
|
|||
|
|
if (titleCase) result = result.replace(/(\w)(\S*)/g, function(_, i$1, r) {
|
|||
|
|
var j = i$1.toUpperCase() + (r !== null ? r : "");
|
|||
|
|
return Object.keys(customReplacements).indexOf(j.toLowerCase()) < 0 ? j : j.toLowerCase();
|
|||
|
|
});
|
|||
|
|
result = result.replace(/\s+/g, separator).replace(new RegExp("\\" + separator + "+", "g"), separator).replace(new RegExp("(^\\" + separator + "+|\\" + separator + "+$)", "g"), "");
|
|||
|
|
if (truncate && result.length > truncate) {
|
|||
|
|
lucky = result.charAt(truncate) === separator;
|
|||
|
|
result = result.slice(0, truncate);
|
|||
|
|
if (!lucky) result = result.slice(0, result.lastIndexOf(separator));
|
|||
|
|
}
|
|||
|
|
if (!maintainCase && !titleCase) result = result.toLowerCase();
|
|||
|
|
return result;
|
|||
|
|
};
|
|||
|
|
/**
|
|||
|
|
* createSlug curried(opts)(input)
|
|||
|
|
* @param {object|string} opts config object or input string
|
|||
|
|
* @return {Function} function getSlugWithConfig()
|
|||
|
|
**/
|
|||
|
|
var createSlug = function createSlug$1(opts) {
|
|||
|
|
/**
|
|||
|
|
* getSlugWithConfig
|
|||
|
|
* @param {string} input string
|
|||
|
|
* @return {string} slug string
|
|||
|
|
*/
|
|||
|
|
return function getSlugWithConfig(input) {
|
|||
|
|
return getSlug(input, opts);
|
|||
|
|
};
|
|||
|
|
};
|
|||
|
|
/**
|
|||
|
|
* escape Chars
|
|||
|
|
* @param {string} input string
|
|||
|
|
*/
|
|||
|
|
var escapeChars = function escapeChars$1(input) {
|
|||
|
|
return input.replace(/[-\\^$*+?.()|[\]{}\/]/g, "\\$&");
|
|||
|
|
};
|
|||
|
|
/**
|
|||
|
|
* check if the char is an already converted char from custom list
|
|||
|
|
* @param {char} ch character to check
|
|||
|
|
* @param {object} customReplacements custom translation map
|
|||
|
|
*/
|
|||
|
|
var isReplacedCustomChar = function(ch, customReplacements) {
|
|||
|
|
for (var c in customReplacements) if (customReplacements[c] === ch) return true;
|
|||
|
|
};
|
|||
|
|
if (typeof module !== "undefined" && module.exports) {
|
|||
|
|
module.exports = getSlug;
|
|||
|
|
module.exports.createSlug = createSlug;
|
|||
|
|
} else if (typeof define !== "undefined" && define.amd) define([], function() {
|
|||
|
|
return getSlug;
|
|||
|
|
});
|
|||
|
|
else try {
|
|||
|
|
if (root.getSlug || root.createSlug) throw "speakingurl: globals exists /(getSlug|createSlug)/";
|
|||
|
|
else {
|
|||
|
|
root.getSlug = getSlug;
|
|||
|
|
root.createSlug = createSlug;
|
|||
|
|
}
|
|||
|
|
} catch (e) {}
|
|||
|
|
})(exports);
|
|||
|
|
}) });
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region ../../node_modules/.pnpm/speakingurl@14.0.1/node_modules/speakingurl/index.js
|
|||
|
|
var require_speakingurl = /* @__PURE__ */ __commonJS({ "../../node_modules/.pnpm/speakingurl@14.0.1/node_modules/speakingurl/index.js": ((exports, module) => {
|
|||
|
|
module.exports = require_speakingurl$1();
|
|||
|
|
}) });
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/app/index.ts
|
|||
|
|
var import_speakingurl = /* @__PURE__ */ __toESM(require_speakingurl(), 1);
|
|||
|
|
const appRecordInfo = target.__VUE_DEVTOOLS_NEXT_APP_RECORD_INFO__ ??= {
|
|||
|
|
id: 0,
|
|||
|
|
appIds: /* @__PURE__ */ new Set()
|
|||
|
|
};
|
|||
|
|
function getAppRecordName(app, fallbackName) {
|
|||
|
|
return app?._component?.name || `App ${fallbackName}`;
|
|||
|
|
}
|
|||
|
|
function getAppRootInstance(app) {
|
|||
|
|
if (app._instance) return app._instance;
|
|||
|
|
else if (app._container?._vnode?.component) return app._container?._vnode?.component;
|
|||
|
|
}
|
|||
|
|
function removeAppRecordId(app) {
|
|||
|
|
const id = app.__VUE_DEVTOOLS_NEXT_APP_RECORD_ID__;
|
|||
|
|
if (id != null) {
|
|||
|
|
appRecordInfo.appIds.delete(id);
|
|||
|
|
appRecordInfo.id--;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
function getAppRecordId(app, defaultId) {
|
|||
|
|
if (app.__VUE_DEVTOOLS_NEXT_APP_RECORD_ID__ != null) return app.__VUE_DEVTOOLS_NEXT_APP_RECORD_ID__;
|
|||
|
|
let id = defaultId ?? (appRecordInfo.id++).toString();
|
|||
|
|
if (defaultId && appRecordInfo.appIds.has(id)) {
|
|||
|
|
let count = 1;
|
|||
|
|
while (appRecordInfo.appIds.has(`${defaultId}_${count}`)) count++;
|
|||
|
|
id = `${defaultId}_${count}`;
|
|||
|
|
}
|
|||
|
|
appRecordInfo.appIds.add(id);
|
|||
|
|
app.__VUE_DEVTOOLS_NEXT_APP_RECORD_ID__ = id;
|
|||
|
|
return id;
|
|||
|
|
}
|
|||
|
|
function createAppRecord(app, types) {
|
|||
|
|
const rootInstance = getAppRootInstance(app);
|
|||
|
|
if (rootInstance) {
|
|||
|
|
appRecordInfo.id++;
|
|||
|
|
const name = getAppRecordName(app, appRecordInfo.id.toString());
|
|||
|
|
const id = getAppRecordId(app, (0, import_speakingurl.default)(name));
|
|||
|
|
const [el] = getRootElementsFromComponentInstance(rootInstance);
|
|||
|
|
const record = {
|
|||
|
|
id,
|
|||
|
|
name,
|
|||
|
|
types,
|
|||
|
|
instanceMap: /* @__PURE__ */ new Map(),
|
|||
|
|
perfGroupIds: /* @__PURE__ */ new Map(),
|
|||
|
|
rootInstance,
|
|||
|
|
iframe: isBrowser && document !== el?.ownerDocument ? el?.ownerDocument?.location?.pathname : void 0
|
|||
|
|
};
|
|||
|
|
app.__VUE_DEVTOOLS_NEXT_APP_RECORD__ = record;
|
|||
|
|
const rootId = `${record.id}:root`;
|
|||
|
|
record.instanceMap.set(rootId, record.rootInstance);
|
|||
|
|
record.rootInstance.__VUE_DEVTOOLS_NEXT_UID__ = rootId;
|
|||
|
|
return record;
|
|||
|
|
} else return {};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/iframe/index.ts
|
|||
|
|
function detectIframeApp(target$1, inIframe = false) {
|
|||
|
|
if (inIframe) {
|
|||
|
|
function sendEventToParent(cb) {
|
|||
|
|
try {
|
|||
|
|
const hook$2 = window.parent.__VUE_DEVTOOLS_GLOBAL_HOOK__;
|
|||
|
|
if (hook$2) cb(hook$2);
|
|||
|
|
} catch (e) {}
|
|||
|
|
}
|
|||
|
|
const hook$1 = {
|
|||
|
|
id: "vue-devtools-next",
|
|||
|
|
devtoolsVersion: "7.0",
|
|||
|
|
on: (event, cb) => {
|
|||
|
|
sendEventToParent((hook$2) => {
|
|||
|
|
hook$2.on(event, cb);
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
once: (event, cb) => {
|
|||
|
|
sendEventToParent((hook$2) => {
|
|||
|
|
hook$2.once(event, cb);
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
off: (event, cb) => {
|
|||
|
|
sendEventToParent((hook$2) => {
|
|||
|
|
hook$2.off(event, cb);
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
emit: (event, ...payload) => {
|
|||
|
|
sendEventToParent((hook$2) => {
|
|||
|
|
hook$2.emit(event, ...payload);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
Object.defineProperty(target$1, "__VUE_DEVTOOLS_GLOBAL_HOOK__", {
|
|||
|
|
get() {
|
|||
|
|
return hook$1;
|
|||
|
|
},
|
|||
|
|
configurable: true
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
function injectVueHookToIframe(iframe) {
|
|||
|
|
if (iframe.__vdevtools__injected) return;
|
|||
|
|
try {
|
|||
|
|
iframe.__vdevtools__injected = true;
|
|||
|
|
const inject = () => {
|
|||
|
|
try {
|
|||
|
|
iframe.contentWindow.__VUE_DEVTOOLS_IFRAME__ = iframe;
|
|||
|
|
const script = iframe.contentDocument.createElement("script");
|
|||
|
|
script.textContent = `;(${detectIframeApp.toString()})(window, true)`;
|
|||
|
|
iframe.contentDocument.documentElement.appendChild(script);
|
|||
|
|
script.parentNode.removeChild(script);
|
|||
|
|
} catch (e) {}
|
|||
|
|
};
|
|||
|
|
inject();
|
|||
|
|
iframe.addEventListener("load", () => inject());
|
|||
|
|
} catch (e) {}
|
|||
|
|
}
|
|||
|
|
function injectVueHookToIframes() {
|
|||
|
|
if (typeof window === "undefined") return;
|
|||
|
|
const iframes = Array.from(document.querySelectorAll("iframe:not([data-vue-devtools-ignore])"));
|
|||
|
|
for (const iframe of iframes) injectVueHookToIframe(iframe);
|
|||
|
|
}
|
|||
|
|
injectVueHookToIframes();
|
|||
|
|
let iframeAppChecks = 0;
|
|||
|
|
const iframeAppCheckTimer = setInterval(() => {
|
|||
|
|
injectVueHookToIframes();
|
|||
|
|
iframeAppChecks++;
|
|||
|
|
if (iframeAppChecks >= 5) clearInterval(iframeAppCheckTimer);
|
|||
|
|
}, 1e3);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/index.ts
|
|||
|
|
function initDevTools() {
|
|||
|
|
detectIframeApp(target);
|
|||
|
|
updateDevToolsState({ vitePluginDetected: getDevToolsEnv().vitePluginDetected });
|
|||
|
|
const isDevToolsNext = target.__VUE_DEVTOOLS_GLOBAL_HOOK__?.id === "vue-devtools-next";
|
|||
|
|
if (target.__VUE_DEVTOOLS_GLOBAL_HOOK__ && isDevToolsNext) return;
|
|||
|
|
const _devtoolsHook = createDevToolsHook();
|
|||
|
|
if (target.__VUE_DEVTOOLS_HOOK_REPLAY__) try {
|
|||
|
|
target.__VUE_DEVTOOLS_HOOK_REPLAY__.forEach((cb) => cb(_devtoolsHook));
|
|||
|
|
target.__VUE_DEVTOOLS_HOOK_REPLAY__ = [];
|
|||
|
|
} catch (e) {
|
|||
|
|
console.error("[vue-devtools] Error during hook replay", e);
|
|||
|
|
}
|
|||
|
|
_devtoolsHook.once("init", (Vue) => {
|
|||
|
|
target.__VUE_DEVTOOLS_VUE2_APP_DETECTED__ = true;
|
|||
|
|
console.log("%c[_____Vue DevTools v7 log_____]", "color: red; font-bold: 600; font-size: 16px;");
|
|||
|
|
console.log("%cVue DevTools v7 detected in your Vue2 project. v7 only supports Vue3 and will not work.", "font-bold: 500; font-size: 14px;");
|
|||
|
|
const legacyChromeUrl = "https://chromewebstore.google.com/detail/vuejs-devtools/iaajmlceplecbljialhhkmedjlpdblhp";
|
|||
|
|
const legacyFirefoxUrl = "https://addons.mozilla.org/firefox/addon/vue-js-devtools-v6-legacy";
|
|||
|
|
console.log(`%cThe legacy version of chrome extension that supports both Vue 2 and Vue 3 has been moved to %c ${legacyChromeUrl}`, "font-size: 14px;", "text-decoration: underline; cursor: pointer;font-size: 14px;");
|
|||
|
|
console.log(`%cThe legacy version of firefox extension that supports both Vue 2 and Vue 3 has been moved to %c ${legacyFirefoxUrl}`, "font-size: 14px;", "text-decoration: underline; cursor: pointer;font-size: 14px;");
|
|||
|
|
console.log("%cPlease install and enable only the legacy version for your Vue2 app.", "font-bold: 500; font-size: 14px;");
|
|||
|
|
console.log("%c[_____Vue DevTools v7 log_____]", "color: red; font-bold: 600; font-size: 16px;");
|
|||
|
|
});
|
|||
|
|
hook.on.setupDevtoolsPlugin((pluginDescriptor, setupFn) => {
|
|||
|
|
addDevToolsPluginToBuffer(pluginDescriptor, setupFn);
|
|||
|
|
const { app } = activeAppRecord ?? {};
|
|||
|
|
if (pluginDescriptor.settings) initPluginSettings(pluginDescriptor.id, pluginDescriptor.settings);
|
|||
|
|
if (!app) return;
|
|||
|
|
callDevToolsPluginSetupFn([pluginDescriptor, setupFn], app);
|
|||
|
|
});
|
|||
|
|
onLegacyDevToolsPluginApiAvailable(() => {
|
|||
|
|
devtoolsPluginBuffer.filter(([item]) => item.id !== "components").forEach(([pluginDescriptor, setupFn]) => {
|
|||
|
|
_devtoolsHook.emit(DevToolsHooks.SETUP_DEVTOOLS_PLUGIN, pluginDescriptor, setupFn, { target: "legacy" });
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
hook.on.vueAppInit(async (app, version, types) => {
|
|||
|
|
const normalizedAppRecord = {
|
|||
|
|
...createAppRecord(app, types),
|
|||
|
|
app,
|
|||
|
|
version
|
|||
|
|
};
|
|||
|
|
addDevToolsAppRecord(normalizedAppRecord);
|
|||
|
|
if (devtoolsAppRecords.value.length === 1) {
|
|||
|
|
setActiveAppRecord(normalizedAppRecord);
|
|||
|
|
setActiveAppRecordId(normalizedAppRecord.id);
|
|||
|
|
normalizeRouterInfo(normalizedAppRecord, activeAppRecord);
|
|||
|
|
registerDevToolsPlugin(normalizedAppRecord.app);
|
|||
|
|
}
|
|||
|
|
setupDevToolsPlugin(...createComponentsDevToolsPlugin(normalizedAppRecord.app));
|
|||
|
|
updateDevToolsState({ connected: true });
|
|||
|
|
_devtoolsHook.apps.push(app);
|
|||
|
|
});
|
|||
|
|
hook.on.vueAppUnmount(async (app) => {
|
|||
|
|
const activeRecords = devtoolsAppRecords.value.filter((appRecord) => appRecord.app !== app);
|
|||
|
|
if (activeRecords.length === 0) updateDevToolsState({ connected: false });
|
|||
|
|
removeDevToolsAppRecord(app);
|
|||
|
|
removeAppRecordId(app);
|
|||
|
|
if (activeAppRecord.value.app === app) {
|
|||
|
|
setActiveAppRecord(activeRecords[0]);
|
|||
|
|
devtoolsContext.hooks.callHook(DevToolsMessagingHookKeys.SEND_ACTIVE_APP_UNMOUNTED_TO_CLIENT);
|
|||
|
|
}
|
|||
|
|
target.__VUE_DEVTOOLS_GLOBAL_HOOK__.apps.splice(target.__VUE_DEVTOOLS_GLOBAL_HOOK__.apps.indexOf(app), 1);
|
|||
|
|
removeRegisteredPluginApp(app);
|
|||
|
|
});
|
|||
|
|
subscribeDevToolsHook(_devtoolsHook);
|
|||
|
|
if (!target.__VUE_DEVTOOLS_GLOBAL_HOOK__) Object.defineProperty(target, "__VUE_DEVTOOLS_GLOBAL_HOOK__", {
|
|||
|
|
get() {
|
|||
|
|
return _devtoolsHook;
|
|||
|
|
},
|
|||
|
|
configurable: true
|
|||
|
|
});
|
|||
|
|
else if (!isNuxtApp) Object.assign(__VUE_DEVTOOLS_GLOBAL_HOOK__, _devtoolsHook);
|
|||
|
|
}
|
|||
|
|
function onDevToolsClientConnected(fn) {
|
|||
|
|
return new Promise((resolve) => {
|
|||
|
|
if (devtoolsState.connected && devtoolsState.clientConnected) {
|
|||
|
|
fn();
|
|||
|
|
resolve();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
devtoolsContext.hooks.hook(DevToolsMessagingHookKeys.DEVTOOLS_CONNECTED_UPDATED, ({ state }) => {
|
|||
|
|
if (state.connected && state.clientConnected) {
|
|||
|
|
fn();
|
|||
|
|
resolve();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/high-perf-mode/index.ts
|
|||
|
|
function toggleHighPerfMode(state) {
|
|||
|
|
devtoolsState.highPerfModeEnabled = state ?? !devtoolsState.highPerfModeEnabled;
|
|||
|
|
if (!state && activeAppRecord.value) registerDevToolsPlugin(activeAppRecord.value.app);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/component/state/reviver.ts
|
|||
|
|
function reviveSet(val) {
|
|||
|
|
const result = /* @__PURE__ */ new Set();
|
|||
|
|
const list = val._custom.value;
|
|||
|
|
for (let i = 0; i < list.length; i++) {
|
|||
|
|
const value = list[i];
|
|||
|
|
result.add(revive(value));
|
|||
|
|
}
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
function reviveMap(val) {
|
|||
|
|
const result = /* @__PURE__ */ new Map();
|
|||
|
|
const list = val._custom.value;
|
|||
|
|
for (let i = 0; i < list.length; i++) {
|
|||
|
|
const { key, value } = list[i];
|
|||
|
|
result.set(key, revive(value));
|
|||
|
|
}
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
function revive(val) {
|
|||
|
|
if (val === UNDEFINED) return;
|
|||
|
|
else if (val === INFINITY) return Number.POSITIVE_INFINITY;
|
|||
|
|
else if (val === NEGATIVE_INFINITY) return Number.NEGATIVE_INFINITY;
|
|||
|
|
else if (val === NAN) return NaN;
|
|||
|
|
else if (val && val._custom) {
|
|||
|
|
const { _custom: custom } = val;
|
|||
|
|
if (custom.type === "component") return activeAppRecord.value.instanceMap.get(custom.id);
|
|||
|
|
else if (custom.type === "map") return reviveMap(val);
|
|||
|
|
else if (custom.type === "set") return reviveSet(val);
|
|||
|
|
else if (custom.type === "bigint") return BigInt(custom.value);
|
|||
|
|
else return revive(custom.value);
|
|||
|
|
} else if (symbolRE.test(val)) {
|
|||
|
|
const [, string] = symbolRE.exec(val);
|
|||
|
|
return Symbol.for(string);
|
|||
|
|
} else if (specialTypeRE.test(val)) {
|
|||
|
|
const [, type, string, , details] = specialTypeRE.exec(val);
|
|||
|
|
const result = new target[type](string);
|
|||
|
|
if (type === "Error" && details) result.stack = details;
|
|||
|
|
return result;
|
|||
|
|
} else return val;
|
|||
|
|
}
|
|||
|
|
function reviver(key, value) {
|
|||
|
|
return revive(value);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/component/state/format.ts
|
|||
|
|
function getInspectorStateValueType(value, raw = true) {
|
|||
|
|
const type = typeof value;
|
|||
|
|
if (value == null || value === UNDEFINED || value === "undefined") return "null";
|
|||
|
|
else if (type === "boolean" || type === "number" || value === INFINITY || value === NEGATIVE_INFINITY || value === NAN) return "literal";
|
|||
|
|
else if (value?._custom) if (raw || value._custom.display != null || value._custom.displayText != null) return "custom";
|
|||
|
|
else return getInspectorStateValueType(value._custom.value);
|
|||
|
|
else if (typeof value === "string") {
|
|||
|
|
const typeMatch = specialTypeRE.exec(value);
|
|||
|
|
if (typeMatch) {
|
|||
|
|
const [, type$1] = typeMatch;
|
|||
|
|
return `native ${type$1}`;
|
|||
|
|
} else return "string";
|
|||
|
|
} else if (Array.isArray(value) || value?._isArray) return "array";
|
|||
|
|
else if (isPlainObject(value)) return "plain-object";
|
|||
|
|
else return "unknown";
|
|||
|
|
}
|
|||
|
|
function formatInspectorStateValue(value, quotes = false, options) {
|
|||
|
|
const { customClass } = options ?? {};
|
|||
|
|
let result;
|
|||
|
|
const type = getInspectorStateValueType(value, false);
|
|||
|
|
if (type !== "custom" && value?._custom) value = value._custom.value;
|
|||
|
|
if (result = internalStateTokenToString(value)) return result;
|
|||
|
|
else if (type === "custom") return value._custom.value?._custom && formatInspectorStateValue(value._custom.value, quotes, options) || value._custom.displayText || value._custom.display;
|
|||
|
|
else if (type === "array") return `Array[${value.length}]`;
|
|||
|
|
else if (type === "plain-object") return `Object${Object.keys(value).length ? "" : " (empty)"}`;
|
|||
|
|
else if (type?.includes("native")) return escape(specialTypeRE.exec(value)?.[2]);
|
|||
|
|
else if (typeof value === "string") {
|
|||
|
|
const typeMatch = value.match(rawTypeRE);
|
|||
|
|
if (typeMatch) value = escapeString(typeMatch[1]);
|
|||
|
|
else if (quotes) value = `<span>"</span>${customClass?.string ? `<span class=${customClass.string}>${escapeString(value)}</span>` : escapeString(value)}<span>"</span>`;
|
|||
|
|
else value = customClass?.string ? `<span class="${customClass?.string ?? ""}">${escapeString(value)}</span>` : escapeString(value);
|
|||
|
|
}
|
|||
|
|
return value;
|
|||
|
|
}
|
|||
|
|
function escapeString(value) {
|
|||
|
|
return escape(value).replace(/ /g, " ").replace(/\n/g, "<span>\\n</span>");
|
|||
|
|
}
|
|||
|
|
function getRaw(value) {
|
|||
|
|
let customType;
|
|||
|
|
const isCustom = getInspectorStateValueType(value) === "custom";
|
|||
|
|
let inherit = {};
|
|||
|
|
if (isCustom) {
|
|||
|
|
const data = value;
|
|||
|
|
const customValue = data._custom?.value;
|
|||
|
|
const currentCustomType = data._custom?.type;
|
|||
|
|
const nestedCustom = typeof customValue === "object" && customValue !== null && "_custom" in customValue ? getRaw(customValue) : {
|
|||
|
|
inherit: void 0,
|
|||
|
|
value: void 0,
|
|||
|
|
customType: void 0
|
|||
|
|
};
|
|||
|
|
inherit = nestedCustom.inherit || data._custom?.fields || {};
|
|||
|
|
value = nestedCustom.value || customValue;
|
|||
|
|
customType = nestedCustom.customType || currentCustomType;
|
|||
|
|
}
|
|||
|
|
if (value && value._isArray) value = value.items;
|
|||
|
|
return {
|
|||
|
|
value,
|
|||
|
|
inherit,
|
|||
|
|
customType
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
function toEdit(value, customType) {
|
|||
|
|
if (customType === "bigint") return value;
|
|||
|
|
if (customType === "date") return value;
|
|||
|
|
return replaceTokenToString(JSON.stringify(value));
|
|||
|
|
}
|
|||
|
|
function toSubmit(value, customType) {
|
|||
|
|
if (customType === "bigint") return BigInt(value);
|
|||
|
|
if (customType === "date") return new Date(value);
|
|||
|
|
return JSON.parse(replaceStringToToken(value), reviver);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/devtools-client/detected.ts
|
|||
|
|
function updateDevToolsClientDetected(params) {
|
|||
|
|
devtoolsState.devtoolsClientDetected = {
|
|||
|
|
...devtoolsState.devtoolsClientDetected,
|
|||
|
|
...params
|
|||
|
|
};
|
|||
|
|
toggleHighPerfMode(!Object.values(devtoolsState.devtoolsClientDetected).some(Boolean));
|
|||
|
|
}
|
|||
|
|
target.__VUE_DEVTOOLS_UPDATE_CLIENT_DETECTED__ ??= updateDevToolsClientDetected;
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region ../../node_modules/.pnpm/superjson@2.2.2/node_modules/superjson/dist/double-indexed-kv.js
|
|||
|
|
var DoubleIndexedKV = class {
|
|||
|
|
constructor() {
|
|||
|
|
this.keyToValue = /* @__PURE__ */ new Map();
|
|||
|
|
this.valueToKey = /* @__PURE__ */ new Map();
|
|||
|
|
}
|
|||
|
|
set(key, value) {
|
|||
|
|
this.keyToValue.set(key, value);
|
|||
|
|
this.valueToKey.set(value, key);
|
|||
|
|
}
|
|||
|
|
getByKey(key) {
|
|||
|
|
return this.keyToValue.get(key);
|
|||
|
|
}
|
|||
|
|
getByValue(value) {
|
|||
|
|
return this.valueToKey.get(value);
|
|||
|
|
}
|
|||
|
|
clear() {
|
|||
|
|
this.keyToValue.clear();
|
|||
|
|
this.valueToKey.clear();
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region ../../node_modules/.pnpm/superjson@2.2.2/node_modules/superjson/dist/registry.js
|
|||
|
|
var Registry = class {
|
|||
|
|
constructor(generateIdentifier) {
|
|||
|
|
this.generateIdentifier = generateIdentifier;
|
|||
|
|
this.kv = new DoubleIndexedKV();
|
|||
|
|
}
|
|||
|
|
register(value, identifier) {
|
|||
|
|
if (this.kv.getByValue(value)) return;
|
|||
|
|
if (!identifier) identifier = this.generateIdentifier(value);
|
|||
|
|
this.kv.set(identifier, value);
|
|||
|
|
}
|
|||
|
|
clear() {
|
|||
|
|
this.kv.clear();
|
|||
|
|
}
|
|||
|
|
getIdentifier(value) {
|
|||
|
|
return this.kv.getByValue(value);
|
|||
|
|
}
|
|||
|
|
getValue(identifier) {
|
|||
|
|
return this.kv.getByKey(identifier);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region ../../node_modules/.pnpm/superjson@2.2.2/node_modules/superjson/dist/class-registry.js
|
|||
|
|
var ClassRegistry = class extends Registry {
|
|||
|
|
constructor() {
|
|||
|
|
super((c) => c.name);
|
|||
|
|
this.classToAllowedProps = /* @__PURE__ */ new Map();
|
|||
|
|
}
|
|||
|
|
register(value, options) {
|
|||
|
|
if (typeof options === "object") {
|
|||
|
|
if (options.allowProps) this.classToAllowedProps.set(value, options.allowProps);
|
|||
|
|
super.register(value, options.identifier);
|
|||
|
|
} else super.register(value, options);
|
|||
|
|
}
|
|||
|
|
getAllowedProps(value) {
|
|||
|
|
return this.classToAllowedProps.get(value);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region ../../node_modules/.pnpm/superjson@2.2.2/node_modules/superjson/dist/util.js
|
|||
|
|
function valuesOfObj(record) {
|
|||
|
|
if ("values" in Object) return Object.values(record);
|
|||
|
|
const values = [];
|
|||
|
|
for (const key in record) if (record.hasOwnProperty(key)) values.push(record[key]);
|
|||
|
|
return values;
|
|||
|
|
}
|
|||
|
|
function find(record, predicate) {
|
|||
|
|
const values = valuesOfObj(record);
|
|||
|
|
if ("find" in values) return values.find(predicate);
|
|||
|
|
const valuesNotNever = values;
|
|||
|
|
for (let i = 0; i < valuesNotNever.length; i++) {
|
|||
|
|
const value = valuesNotNever[i];
|
|||
|
|
if (predicate(value)) return value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
function forEach(record, run) {
|
|||
|
|
Object.entries(record).forEach(([key, value]) => run(value, key));
|
|||
|
|
}
|
|||
|
|
function includes(arr, value) {
|
|||
|
|
return arr.indexOf(value) !== -1;
|
|||
|
|
}
|
|||
|
|
function findArr(record, predicate) {
|
|||
|
|
for (let i = 0; i < record.length; i++) {
|
|||
|
|
const value = record[i];
|
|||
|
|
if (predicate(value)) return value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region ../../node_modules/.pnpm/superjson@2.2.2/node_modules/superjson/dist/custom-transformer-registry.js
|
|||
|
|
var CustomTransformerRegistry = class {
|
|||
|
|
constructor() {
|
|||
|
|
this.transfomers = {};
|
|||
|
|
}
|
|||
|
|
register(transformer) {
|
|||
|
|
this.transfomers[transformer.name] = transformer;
|
|||
|
|
}
|
|||
|
|
findApplicable(v) {
|
|||
|
|
return find(this.transfomers, (transformer) => transformer.isApplicable(v));
|
|||
|
|
}
|
|||
|
|
findByName(name) {
|
|||
|
|
return this.transfomers[name];
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region ../../node_modules/.pnpm/superjson@2.2.2/node_modules/superjson/dist/is.js
|
|||
|
|
const getType$1 = (payload) => Object.prototype.toString.call(payload).slice(8, -1);
|
|||
|
|
const isUndefined$1 = (payload) => typeof payload === "undefined";
|
|||
|
|
const isNull$1 = (payload) => payload === null;
|
|||
|
|
const isPlainObject$2 = (payload) => {
|
|||
|
|
if (typeof payload !== "object" || payload === null) return false;
|
|||
|
|
if (payload === Object.prototype) return false;
|
|||
|
|
if (Object.getPrototypeOf(payload) === null) return true;
|
|||
|
|
return Object.getPrototypeOf(payload) === Object.prototype;
|
|||
|
|
};
|
|||
|
|
const isEmptyObject = (payload) => isPlainObject$2(payload) && Object.keys(payload).length === 0;
|
|||
|
|
const isArray$2 = (payload) => Array.isArray(payload);
|
|||
|
|
const isString = (payload) => typeof payload === "string";
|
|||
|
|
const isNumber = (payload) => typeof payload === "number" && !isNaN(payload);
|
|||
|
|
const isBoolean = (payload) => typeof payload === "boolean";
|
|||
|
|
const isRegExp = (payload) => payload instanceof RegExp;
|
|||
|
|
const isMap = (payload) => payload instanceof Map;
|
|||
|
|
const isSet = (payload) => payload instanceof Set;
|
|||
|
|
const isSymbol = (payload) => getType$1(payload) === "Symbol";
|
|||
|
|
const isDate = (payload) => payload instanceof Date && !isNaN(payload.valueOf());
|
|||
|
|
const isError = (payload) => payload instanceof Error;
|
|||
|
|
const isNaNValue = (payload) => typeof payload === "number" && isNaN(payload);
|
|||
|
|
const isPrimitive = (payload) => isBoolean(payload) || isNull$1(payload) || isUndefined$1(payload) || isNumber(payload) || isString(payload) || isSymbol(payload);
|
|||
|
|
const isBigint = (payload) => typeof payload === "bigint";
|
|||
|
|
const isInfinite = (payload) => payload === Infinity || payload === -Infinity;
|
|||
|
|
const isTypedArray = (payload) => ArrayBuffer.isView(payload) && !(payload instanceof DataView);
|
|||
|
|
const isURL = (payload) => payload instanceof URL;
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region ../../node_modules/.pnpm/superjson@2.2.2/node_modules/superjson/dist/pathstringifier.js
|
|||
|
|
const escapeKey = (key) => key.replace(/\./g, "\\.");
|
|||
|
|
const stringifyPath = (path) => path.map(String).map(escapeKey).join(".");
|
|||
|
|
const parsePath = (string) => {
|
|||
|
|
const result = [];
|
|||
|
|
let segment = "";
|
|||
|
|
for (let i = 0; i < string.length; i++) {
|
|||
|
|
let char = string.charAt(i);
|
|||
|
|
if (char === "\\" && string.charAt(i + 1) === ".") {
|
|||
|
|
segment += ".";
|
|||
|
|
i++;
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
if (char === ".") {
|
|||
|
|
result.push(segment);
|
|||
|
|
segment = "";
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
segment += char;
|
|||
|
|
}
|
|||
|
|
const lastSegment = segment;
|
|||
|
|
result.push(lastSegment);
|
|||
|
|
return result;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region ../../node_modules/.pnpm/superjson@2.2.2/node_modules/superjson/dist/transformer.js
|
|||
|
|
function simpleTransformation(isApplicable, annotation, transform, untransform) {
|
|||
|
|
return {
|
|||
|
|
isApplicable,
|
|||
|
|
annotation,
|
|||
|
|
transform,
|
|||
|
|
untransform
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
const simpleRules = [
|
|||
|
|
simpleTransformation(isUndefined$1, "undefined", () => null, () => void 0),
|
|||
|
|
simpleTransformation(isBigint, "bigint", (v) => v.toString(), (v) => {
|
|||
|
|
if (typeof BigInt !== "undefined") return BigInt(v);
|
|||
|
|
console.error("Please add a BigInt polyfill.");
|
|||
|
|
return v;
|
|||
|
|
}),
|
|||
|
|
simpleTransformation(isDate, "Date", (v) => v.toISOString(), (v) => new Date(v)),
|
|||
|
|
simpleTransformation(isError, "Error", (v, superJson) => {
|
|||
|
|
const baseError = {
|
|||
|
|
name: v.name,
|
|||
|
|
message: v.message
|
|||
|
|
};
|
|||
|
|
superJson.allowedErrorProps.forEach((prop) => {
|
|||
|
|
baseError[prop] = v[prop];
|
|||
|
|
});
|
|||
|
|
return baseError;
|
|||
|
|
}, (v, superJson) => {
|
|||
|
|
const e = new Error(v.message);
|
|||
|
|
e.name = v.name;
|
|||
|
|
e.stack = v.stack;
|
|||
|
|
superJson.allowedErrorProps.forEach((prop) => {
|
|||
|
|
e[prop] = v[prop];
|
|||
|
|
});
|
|||
|
|
return e;
|
|||
|
|
}),
|
|||
|
|
simpleTransformation(isRegExp, "regexp", (v) => "" + v, (regex) => {
|
|||
|
|
const body = regex.slice(1, regex.lastIndexOf("/"));
|
|||
|
|
const flags = regex.slice(regex.lastIndexOf("/") + 1);
|
|||
|
|
return new RegExp(body, flags);
|
|||
|
|
}),
|
|||
|
|
simpleTransformation(isSet, "set", (v) => [...v.values()], (v) => new Set(v)),
|
|||
|
|
simpleTransformation(isMap, "map", (v) => [...v.entries()], (v) => new Map(v)),
|
|||
|
|
simpleTransformation((v) => isNaNValue(v) || isInfinite(v), "number", (v) => {
|
|||
|
|
if (isNaNValue(v)) return "NaN";
|
|||
|
|
if (v > 0) return "Infinity";
|
|||
|
|
else return "-Infinity";
|
|||
|
|
}, Number),
|
|||
|
|
simpleTransformation((v) => v === 0 && 1 / v === -Infinity, "number", () => {
|
|||
|
|
return "-0";
|
|||
|
|
}, Number),
|
|||
|
|
simpleTransformation(isURL, "URL", (v) => v.toString(), (v) => new URL(v))
|
|||
|
|
];
|
|||
|
|
function compositeTransformation(isApplicable, annotation, transform, untransform) {
|
|||
|
|
return {
|
|||
|
|
isApplicable,
|
|||
|
|
annotation,
|
|||
|
|
transform,
|
|||
|
|
untransform
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
const symbolRule = compositeTransformation((s, superJson) => {
|
|||
|
|
if (isSymbol(s)) return !!superJson.symbolRegistry.getIdentifier(s);
|
|||
|
|
return false;
|
|||
|
|
}, (s, superJson) => {
|
|||
|
|
return ["symbol", superJson.symbolRegistry.getIdentifier(s)];
|
|||
|
|
}, (v) => v.description, (_, a, superJson) => {
|
|||
|
|
const value = superJson.symbolRegistry.getValue(a[1]);
|
|||
|
|
if (!value) throw new Error("Trying to deserialize unknown symbol");
|
|||
|
|
return value;
|
|||
|
|
});
|
|||
|
|
const constructorToName = [
|
|||
|
|
Int8Array,
|
|||
|
|
Uint8Array,
|
|||
|
|
Int16Array,
|
|||
|
|
Uint16Array,
|
|||
|
|
Int32Array,
|
|||
|
|
Uint32Array,
|
|||
|
|
Float32Array,
|
|||
|
|
Float64Array,
|
|||
|
|
Uint8ClampedArray
|
|||
|
|
].reduce((obj, ctor) => {
|
|||
|
|
obj[ctor.name] = ctor;
|
|||
|
|
return obj;
|
|||
|
|
}, {});
|
|||
|
|
const typedArrayRule = compositeTransformation(isTypedArray, (v) => ["typed-array", v.constructor.name], (v) => [...v], (v, a) => {
|
|||
|
|
const ctor = constructorToName[a[1]];
|
|||
|
|
if (!ctor) throw new Error("Trying to deserialize unknown typed array");
|
|||
|
|
return new ctor(v);
|
|||
|
|
});
|
|||
|
|
function isInstanceOfRegisteredClass(potentialClass, superJson) {
|
|||
|
|
if (potentialClass?.constructor) return !!superJson.classRegistry.getIdentifier(potentialClass.constructor);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
const classRule = compositeTransformation(isInstanceOfRegisteredClass, (clazz, superJson) => {
|
|||
|
|
return ["class", superJson.classRegistry.getIdentifier(clazz.constructor)];
|
|||
|
|
}, (clazz, superJson) => {
|
|||
|
|
const allowedProps = superJson.classRegistry.getAllowedProps(clazz.constructor);
|
|||
|
|
if (!allowedProps) return { ...clazz };
|
|||
|
|
const result = {};
|
|||
|
|
allowedProps.forEach((prop) => {
|
|||
|
|
result[prop] = clazz[prop];
|
|||
|
|
});
|
|||
|
|
return result;
|
|||
|
|
}, (v, a, superJson) => {
|
|||
|
|
const clazz = superJson.classRegistry.getValue(a[1]);
|
|||
|
|
if (!clazz) throw new Error(`Trying to deserialize unknown class '${a[1]}' - check https://github.com/blitz-js/superjson/issues/116#issuecomment-773996564`);
|
|||
|
|
return Object.assign(Object.create(clazz.prototype), v);
|
|||
|
|
});
|
|||
|
|
const customRule = compositeTransformation((value, superJson) => {
|
|||
|
|
return !!superJson.customTransformerRegistry.findApplicable(value);
|
|||
|
|
}, (value, superJson) => {
|
|||
|
|
return ["custom", superJson.customTransformerRegistry.findApplicable(value).name];
|
|||
|
|
}, (value, superJson) => {
|
|||
|
|
return superJson.customTransformerRegistry.findApplicable(value).serialize(value);
|
|||
|
|
}, (v, a, superJson) => {
|
|||
|
|
const transformer = superJson.customTransformerRegistry.findByName(a[1]);
|
|||
|
|
if (!transformer) throw new Error("Trying to deserialize unknown custom value");
|
|||
|
|
return transformer.deserialize(v);
|
|||
|
|
});
|
|||
|
|
const compositeRules = [
|
|||
|
|
classRule,
|
|||
|
|
symbolRule,
|
|||
|
|
customRule,
|
|||
|
|
typedArrayRule
|
|||
|
|
];
|
|||
|
|
const transformValue = (value, superJson) => {
|
|||
|
|
const applicableCompositeRule = findArr(compositeRules, (rule) => rule.isApplicable(value, superJson));
|
|||
|
|
if (applicableCompositeRule) return {
|
|||
|
|
value: applicableCompositeRule.transform(value, superJson),
|
|||
|
|
type: applicableCompositeRule.annotation(value, superJson)
|
|||
|
|
};
|
|||
|
|
const applicableSimpleRule = findArr(simpleRules, (rule) => rule.isApplicable(value, superJson));
|
|||
|
|
if (applicableSimpleRule) return {
|
|||
|
|
value: applicableSimpleRule.transform(value, superJson),
|
|||
|
|
type: applicableSimpleRule.annotation
|
|||
|
|
};
|
|||
|
|
};
|
|||
|
|
const simpleRulesByAnnotation = {};
|
|||
|
|
simpleRules.forEach((rule) => {
|
|||
|
|
simpleRulesByAnnotation[rule.annotation] = rule;
|
|||
|
|
});
|
|||
|
|
const untransformValue = (json, type, superJson) => {
|
|||
|
|
if (isArray$2(type)) switch (type[0]) {
|
|||
|
|
case "symbol": return symbolRule.untransform(json, type, superJson);
|
|||
|
|
case "class": return classRule.untransform(json, type, superJson);
|
|||
|
|
case "custom": return customRule.untransform(json, type, superJson);
|
|||
|
|
case "typed-array": return typedArrayRule.untransform(json, type, superJson);
|
|||
|
|
default: throw new Error("Unknown transformation: " + type);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
const transformation = simpleRulesByAnnotation[type];
|
|||
|
|
if (!transformation) throw new Error("Unknown transformation: " + type);
|
|||
|
|
return transformation.untransform(json, superJson);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region ../../node_modules/.pnpm/superjson@2.2.2/node_modules/superjson/dist/accessDeep.js
|
|||
|
|
const getNthKey = (value, n) => {
|
|||
|
|
if (n > value.size) throw new Error("index out of bounds");
|
|||
|
|
const keys = value.keys();
|
|||
|
|
while (n > 0) {
|
|||
|
|
keys.next();
|
|||
|
|
n--;
|
|||
|
|
}
|
|||
|
|
return keys.next().value;
|
|||
|
|
};
|
|||
|
|
function validatePath(path) {
|
|||
|
|
if (includes(path, "__proto__")) throw new Error("__proto__ is not allowed as a property");
|
|||
|
|
if (includes(path, "prototype")) throw new Error("prototype is not allowed as a property");
|
|||
|
|
if (includes(path, "constructor")) throw new Error("constructor is not allowed as a property");
|
|||
|
|
}
|
|||
|
|
const getDeep = (object, path) => {
|
|||
|
|
validatePath(path);
|
|||
|
|
for (let i = 0; i < path.length; i++) {
|
|||
|
|
const key = path[i];
|
|||
|
|
if (isSet(object)) object = getNthKey(object, +key);
|
|||
|
|
else if (isMap(object)) {
|
|||
|
|
const row = +key;
|
|||
|
|
const type = +path[++i] === 0 ? "key" : "value";
|
|||
|
|
const keyOfRow = getNthKey(object, row);
|
|||
|
|
switch (type) {
|
|||
|
|
case "key":
|
|||
|
|
object = keyOfRow;
|
|||
|
|
break;
|
|||
|
|
case "value":
|
|||
|
|
object = object.get(keyOfRow);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
} else object = object[key];
|
|||
|
|
}
|
|||
|
|
return object;
|
|||
|
|
};
|
|||
|
|
const setDeep = (object, path, mapper) => {
|
|||
|
|
validatePath(path);
|
|||
|
|
if (path.length === 0) return mapper(object);
|
|||
|
|
let parent = object;
|
|||
|
|
for (let i = 0; i < path.length - 1; i++) {
|
|||
|
|
const key = path[i];
|
|||
|
|
if (isArray$2(parent)) {
|
|||
|
|
const index = +key;
|
|||
|
|
parent = parent[index];
|
|||
|
|
} else if (isPlainObject$2(parent)) parent = parent[key];
|
|||
|
|
else if (isSet(parent)) {
|
|||
|
|
const row = +key;
|
|||
|
|
parent = getNthKey(parent, row);
|
|||
|
|
} else if (isMap(parent)) {
|
|||
|
|
if (i === path.length - 2) break;
|
|||
|
|
const row = +key;
|
|||
|
|
const type = +path[++i] === 0 ? "key" : "value";
|
|||
|
|
const keyOfRow = getNthKey(parent, row);
|
|||
|
|
switch (type) {
|
|||
|
|
case "key":
|
|||
|
|
parent = keyOfRow;
|
|||
|
|
break;
|
|||
|
|
case "value":
|
|||
|
|
parent = parent.get(keyOfRow);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
const lastKey = path[path.length - 1];
|
|||
|
|
if (isArray$2(parent)) parent[+lastKey] = mapper(parent[+lastKey]);
|
|||
|
|
else if (isPlainObject$2(parent)) parent[lastKey] = mapper(parent[lastKey]);
|
|||
|
|
if (isSet(parent)) {
|
|||
|
|
const oldValue = getNthKey(parent, +lastKey);
|
|||
|
|
const newValue = mapper(oldValue);
|
|||
|
|
if (oldValue !== newValue) {
|
|||
|
|
parent.delete(oldValue);
|
|||
|
|
parent.add(newValue);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (isMap(parent)) {
|
|||
|
|
const row = +path[path.length - 2];
|
|||
|
|
const keyToRow = getNthKey(parent, row);
|
|||
|
|
switch (+lastKey === 0 ? "key" : "value") {
|
|||
|
|
case "key": {
|
|||
|
|
const newKey = mapper(keyToRow);
|
|||
|
|
parent.set(newKey, parent.get(keyToRow));
|
|||
|
|
if (newKey !== keyToRow) parent.delete(keyToRow);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
case "value":
|
|||
|
|
parent.set(keyToRow, mapper(parent.get(keyToRow)));
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return object;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region ../../node_modules/.pnpm/superjson@2.2.2/node_modules/superjson/dist/plainer.js
|
|||
|
|
function traverse(tree, walker$1, origin = []) {
|
|||
|
|
if (!tree) return;
|
|||
|
|
if (!isArray$2(tree)) {
|
|||
|
|
forEach(tree, (subtree, key) => traverse(subtree, walker$1, [...origin, ...parsePath(key)]));
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
const [nodeValue, children] = tree;
|
|||
|
|
if (children) forEach(children, (child, key) => {
|
|||
|
|
traverse(child, walker$1, [...origin, ...parsePath(key)]);
|
|||
|
|
});
|
|||
|
|
walker$1(nodeValue, origin);
|
|||
|
|
}
|
|||
|
|
function applyValueAnnotations(plain, annotations, superJson) {
|
|||
|
|
traverse(annotations, (type, path) => {
|
|||
|
|
plain = setDeep(plain, path, (v) => untransformValue(v, type, superJson));
|
|||
|
|
});
|
|||
|
|
return plain;
|
|||
|
|
}
|
|||
|
|
function applyReferentialEqualityAnnotations(plain, annotations) {
|
|||
|
|
function apply(identicalPaths, path) {
|
|||
|
|
const object = getDeep(plain, parsePath(path));
|
|||
|
|
identicalPaths.map(parsePath).forEach((identicalObjectPath) => {
|
|||
|
|
plain = setDeep(plain, identicalObjectPath, () => object);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
if (isArray$2(annotations)) {
|
|||
|
|
const [root, other] = annotations;
|
|||
|
|
root.forEach((identicalPath) => {
|
|||
|
|
plain = setDeep(plain, parsePath(identicalPath), () => plain);
|
|||
|
|
});
|
|||
|
|
if (other) forEach(other, apply);
|
|||
|
|
} else forEach(annotations, apply);
|
|||
|
|
return plain;
|
|||
|
|
}
|
|||
|
|
const isDeep = (object, superJson) => isPlainObject$2(object) || isArray$2(object) || isMap(object) || isSet(object) || isInstanceOfRegisteredClass(object, superJson);
|
|||
|
|
function addIdentity(object, path, identities) {
|
|||
|
|
const existingSet = identities.get(object);
|
|||
|
|
if (existingSet) existingSet.push(path);
|
|||
|
|
else identities.set(object, [path]);
|
|||
|
|
}
|
|||
|
|
function generateReferentialEqualityAnnotations(identitites, dedupe) {
|
|||
|
|
const result = {};
|
|||
|
|
let rootEqualityPaths = void 0;
|
|||
|
|
identitites.forEach((paths) => {
|
|||
|
|
if (paths.length <= 1) return;
|
|||
|
|
if (!dedupe) paths = paths.map((path) => path.map(String)).sort((a, b) => a.length - b.length);
|
|||
|
|
const [representativePath, ...identicalPaths] = paths;
|
|||
|
|
if (representativePath.length === 0) rootEqualityPaths = identicalPaths.map(stringifyPath);
|
|||
|
|
else result[stringifyPath(representativePath)] = identicalPaths.map(stringifyPath);
|
|||
|
|
});
|
|||
|
|
if (rootEqualityPaths) if (isEmptyObject(result)) return [rootEqualityPaths];
|
|||
|
|
else return [rootEqualityPaths, result];
|
|||
|
|
else return isEmptyObject(result) ? void 0 : result;
|
|||
|
|
}
|
|||
|
|
const walker = (object, identities, superJson, dedupe, path = [], objectsInThisPath = [], seenObjects = /* @__PURE__ */ new Map()) => {
|
|||
|
|
const primitive = isPrimitive(object);
|
|||
|
|
if (!primitive) {
|
|||
|
|
addIdentity(object, path, identities);
|
|||
|
|
const seen = seenObjects.get(object);
|
|||
|
|
if (seen) return dedupe ? { transformedValue: null } : seen;
|
|||
|
|
}
|
|||
|
|
if (!isDeep(object, superJson)) {
|
|||
|
|
const transformed$1 = transformValue(object, superJson);
|
|||
|
|
const result$1 = transformed$1 ? {
|
|||
|
|
transformedValue: transformed$1.value,
|
|||
|
|
annotations: [transformed$1.type]
|
|||
|
|
} : { transformedValue: object };
|
|||
|
|
if (!primitive) seenObjects.set(object, result$1);
|
|||
|
|
return result$1;
|
|||
|
|
}
|
|||
|
|
if (includes(objectsInThisPath, object)) return { transformedValue: null };
|
|||
|
|
const transformationResult = transformValue(object, superJson);
|
|||
|
|
const transformed = transformationResult?.value ?? object;
|
|||
|
|
const transformedValue = isArray$2(transformed) ? [] : {};
|
|||
|
|
const innerAnnotations = {};
|
|||
|
|
forEach(transformed, (value, index) => {
|
|||
|
|
if (index === "__proto__" || index === "constructor" || index === "prototype") throw new Error(`Detected property ${index}. This is a prototype pollution risk, please remove it from your object.`);
|
|||
|
|
const recursiveResult = walker(value, identities, superJson, dedupe, [...path, index], [...objectsInThisPath, object], seenObjects);
|
|||
|
|
transformedValue[index] = recursiveResult.transformedValue;
|
|||
|
|
if (isArray$2(recursiveResult.annotations)) innerAnnotations[index] = recursiveResult.annotations;
|
|||
|
|
else if (isPlainObject$2(recursiveResult.annotations)) forEach(recursiveResult.annotations, (tree, key) => {
|
|||
|
|
innerAnnotations[escapeKey(index) + "." + key] = tree;
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
const result = isEmptyObject(innerAnnotations) ? {
|
|||
|
|
transformedValue,
|
|||
|
|
annotations: !!transformationResult ? [transformationResult.type] : void 0
|
|||
|
|
} : {
|
|||
|
|
transformedValue,
|
|||
|
|
annotations: !!transformationResult ? [transformationResult.type, innerAnnotations] : innerAnnotations
|
|||
|
|
};
|
|||
|
|
if (!primitive) seenObjects.set(object, result);
|
|||
|
|
return result;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region ../../node_modules/.pnpm/is-what@4.1.16/node_modules/is-what/dist/index.js
|
|||
|
|
function getType(payload) {
|
|||
|
|
return Object.prototype.toString.call(payload).slice(8, -1);
|
|||
|
|
}
|
|||
|
|
function isArray$1(payload) {
|
|||
|
|
return getType(payload) === "Array";
|
|||
|
|
}
|
|||
|
|
function isPlainObject$1(payload) {
|
|||
|
|
if (getType(payload) !== "Object") return false;
|
|||
|
|
const prototype = Object.getPrototypeOf(payload);
|
|||
|
|
return !!prototype && prototype.constructor === Object && prototype === Object.prototype;
|
|||
|
|
}
|
|||
|
|
function isNull(payload) {
|
|||
|
|
return getType(payload) === "Null";
|
|||
|
|
}
|
|||
|
|
function isOneOf(a, b, c, d, e) {
|
|||
|
|
return (value) => a(value) || b(value) || !!c && c(value) || !!d && d(value) || !!e && e(value);
|
|||
|
|
}
|
|||
|
|
function isUndefined(payload) {
|
|||
|
|
return getType(payload) === "Undefined";
|
|||
|
|
}
|
|||
|
|
const isNullOrUndefined = isOneOf(isNull, isUndefined);
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region ../../node_modules/.pnpm/copy-anything@3.0.5/node_modules/copy-anything/dist/index.js
|
|||
|
|
function assignProp(carry, key, newVal, originalObject, includeNonenumerable) {
|
|||
|
|
const propType = {}.propertyIsEnumerable.call(originalObject, key) ? "enumerable" : "nonenumerable";
|
|||
|
|
if (propType === "enumerable") carry[key] = newVal;
|
|||
|
|
if (includeNonenumerable && propType === "nonenumerable") Object.defineProperty(carry, key, {
|
|||
|
|
value: newVal,
|
|||
|
|
enumerable: false,
|
|||
|
|
writable: true,
|
|||
|
|
configurable: true
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
function copy(target$1, options = {}) {
|
|||
|
|
if (isArray$1(target$1)) return target$1.map((item) => copy(item, options));
|
|||
|
|
if (!isPlainObject$1(target$1)) return target$1;
|
|||
|
|
const props = Object.getOwnPropertyNames(target$1);
|
|||
|
|
const symbols = Object.getOwnPropertySymbols(target$1);
|
|||
|
|
return [...props, ...symbols].reduce((carry, key) => {
|
|||
|
|
if (isArray$1(options.props) && !options.props.includes(key)) return carry;
|
|||
|
|
const val = target$1[key];
|
|||
|
|
assignProp(carry, key, copy(val, options), target$1, options.nonenumerable);
|
|||
|
|
return carry;
|
|||
|
|
}, {});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region ../../node_modules/.pnpm/superjson@2.2.2/node_modules/superjson/dist/index.js
|
|||
|
|
var SuperJSON = class {
|
|||
|
|
/**
|
|||
|
|
* @param dedupeReferentialEqualities If true, SuperJSON will make sure only one instance of referentially equal objects are serialized and the rest are replaced with `null`.
|
|||
|
|
*/
|
|||
|
|
constructor({ dedupe = false } = {}) {
|
|||
|
|
this.classRegistry = new ClassRegistry();
|
|||
|
|
this.symbolRegistry = new Registry((s) => s.description ?? "");
|
|||
|
|
this.customTransformerRegistry = new CustomTransformerRegistry();
|
|||
|
|
this.allowedErrorProps = [];
|
|||
|
|
this.dedupe = dedupe;
|
|||
|
|
}
|
|||
|
|
serialize(object) {
|
|||
|
|
const identities = /* @__PURE__ */ new Map();
|
|||
|
|
const output = walker(object, identities, this, this.dedupe);
|
|||
|
|
const res = { json: output.transformedValue };
|
|||
|
|
if (output.annotations) res.meta = {
|
|||
|
|
...res.meta,
|
|||
|
|
values: output.annotations
|
|||
|
|
};
|
|||
|
|
const equalityAnnotations = generateReferentialEqualityAnnotations(identities, this.dedupe);
|
|||
|
|
if (equalityAnnotations) res.meta = {
|
|||
|
|
...res.meta,
|
|||
|
|
referentialEqualities: equalityAnnotations
|
|||
|
|
};
|
|||
|
|
return res;
|
|||
|
|
}
|
|||
|
|
deserialize(payload) {
|
|||
|
|
const { json, meta } = payload;
|
|||
|
|
let result = copy(json);
|
|||
|
|
if (meta?.values) result = applyValueAnnotations(result, meta.values, this);
|
|||
|
|
if (meta?.referentialEqualities) result = applyReferentialEqualityAnnotations(result, meta.referentialEqualities);
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
stringify(object) {
|
|||
|
|
return JSON.stringify(this.serialize(object));
|
|||
|
|
}
|
|||
|
|
parse(string) {
|
|||
|
|
return this.deserialize(JSON.parse(string));
|
|||
|
|
}
|
|||
|
|
registerClass(v, options) {
|
|||
|
|
this.classRegistry.register(v, options);
|
|||
|
|
}
|
|||
|
|
registerSymbol(v, identifier) {
|
|||
|
|
this.symbolRegistry.register(v, identifier);
|
|||
|
|
}
|
|||
|
|
registerCustom(transformer, name) {
|
|||
|
|
this.customTransformerRegistry.register({
|
|||
|
|
name,
|
|||
|
|
...transformer
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
allowErrorProps(...props) {
|
|||
|
|
this.allowedErrorProps.push(...props);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
SuperJSON.defaultInstance = new SuperJSON();
|
|||
|
|
SuperJSON.serialize = SuperJSON.defaultInstance.serialize.bind(SuperJSON.defaultInstance);
|
|||
|
|
SuperJSON.deserialize = SuperJSON.defaultInstance.deserialize.bind(SuperJSON.defaultInstance);
|
|||
|
|
SuperJSON.stringify = SuperJSON.defaultInstance.stringify.bind(SuperJSON.defaultInstance);
|
|||
|
|
SuperJSON.parse = SuperJSON.defaultInstance.parse.bind(SuperJSON.defaultInstance);
|
|||
|
|
SuperJSON.registerClass = SuperJSON.defaultInstance.registerClass.bind(SuperJSON.defaultInstance);
|
|||
|
|
SuperJSON.registerSymbol = SuperJSON.defaultInstance.registerSymbol.bind(SuperJSON.defaultInstance);
|
|||
|
|
SuperJSON.registerCustom = SuperJSON.defaultInstance.registerCustom.bind(SuperJSON.defaultInstance);
|
|||
|
|
SuperJSON.allowErrorProps = SuperJSON.defaultInstance.allowErrorProps.bind(SuperJSON.defaultInstance);
|
|||
|
|
const serialize = SuperJSON.serialize;
|
|||
|
|
const deserialize = SuperJSON.deserialize;
|
|||
|
|
const stringify$1 = SuperJSON.stringify;
|
|||
|
|
const parse$1 = SuperJSON.parse;
|
|||
|
|
const registerClass = SuperJSON.registerClass;
|
|||
|
|
const registerCustom = SuperJSON.registerCustom;
|
|||
|
|
const registerSymbol = SuperJSON.registerSymbol;
|
|||
|
|
const allowErrorProps = SuperJSON.allowErrorProps;
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/messaging/presets/broadcast-channel/context.ts
|
|||
|
|
const __DEVTOOLS_KIT_BROADCAST_MESSAGING_EVENT_KEY = "__devtools-kit-broadcast-messaging-event-key__";
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/messaging/presets/broadcast-channel/index.ts
|
|||
|
|
const BROADCAST_CHANNEL_NAME = "__devtools-kit:broadcast-channel__";
|
|||
|
|
function createBroadcastChannel() {
|
|||
|
|
const channel = new BroadcastChannel(BROADCAST_CHANNEL_NAME);
|
|||
|
|
return {
|
|||
|
|
post: (data) => {
|
|||
|
|
channel.postMessage(SuperJSON.stringify({
|
|||
|
|
event: __DEVTOOLS_KIT_BROADCAST_MESSAGING_EVENT_KEY,
|
|||
|
|
data
|
|||
|
|
}));
|
|||
|
|
},
|
|||
|
|
on: (handler) => {
|
|||
|
|
channel.onmessage = (event) => {
|
|||
|
|
const parsed = SuperJSON.parse(event.data);
|
|||
|
|
if (parsed.event === __DEVTOOLS_KIT_BROADCAST_MESSAGING_EVENT_KEY) handler(parsed.data);
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/messaging/presets/electron/context.ts
|
|||
|
|
const __ELECTRON_CLIENT_CONTEXT__ = "electron:client-context";
|
|||
|
|
const __ELECTRON_RPOXY_CONTEXT__ = "electron:proxy-context";
|
|||
|
|
const __ELECTRON_SERVER_CONTEXT__ = "electron:server-context";
|
|||
|
|
const __DEVTOOLS_KIT_ELECTRON_MESSAGING_EVENT_KEY__ = {
|
|||
|
|
CLIENT_TO_PROXY: "client->proxy",
|
|||
|
|
PROXY_TO_CLIENT: "proxy->client",
|
|||
|
|
PROXY_TO_SERVER: "proxy->server",
|
|||
|
|
SERVER_TO_PROXY: "server->proxy"
|
|||
|
|
};
|
|||
|
|
function getElectronClientContext() {
|
|||
|
|
return target[__ELECTRON_CLIENT_CONTEXT__];
|
|||
|
|
}
|
|||
|
|
function setElectronClientContext(context) {
|
|||
|
|
target[__ELECTRON_CLIENT_CONTEXT__] = context;
|
|||
|
|
}
|
|||
|
|
function getElectronProxyContext() {
|
|||
|
|
return target[__ELECTRON_RPOXY_CONTEXT__];
|
|||
|
|
}
|
|||
|
|
function setElectronProxyContext(context) {
|
|||
|
|
target[__ELECTRON_RPOXY_CONTEXT__] = context;
|
|||
|
|
}
|
|||
|
|
function getElectronServerContext() {
|
|||
|
|
return target[__ELECTRON_SERVER_CONTEXT__];
|
|||
|
|
}
|
|||
|
|
function setElectronServerContext(context) {
|
|||
|
|
target[__ELECTRON_SERVER_CONTEXT__] = context;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/messaging/presets/electron/client.ts
|
|||
|
|
function createElectronClientChannel() {
|
|||
|
|
const socket = getElectronClientContext();
|
|||
|
|
return {
|
|||
|
|
post: (data) => {
|
|||
|
|
socket.emit(__DEVTOOLS_KIT_ELECTRON_MESSAGING_EVENT_KEY__.CLIENT_TO_PROXY, SuperJSON.stringify(data));
|
|||
|
|
},
|
|||
|
|
on: (handler) => {
|
|||
|
|
socket.on(__DEVTOOLS_KIT_ELECTRON_MESSAGING_EVENT_KEY__.PROXY_TO_CLIENT, (e) => {
|
|||
|
|
handler(SuperJSON.parse(e));
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/messaging/presets/electron/proxy.ts
|
|||
|
|
function createElectronProxyChannel() {
|
|||
|
|
const socket = getElectronProxyContext();
|
|||
|
|
return {
|
|||
|
|
post: (data) => {},
|
|||
|
|
on: (handler) => {
|
|||
|
|
socket.on(__DEVTOOLS_KIT_ELECTRON_MESSAGING_EVENT_KEY__.SERVER_TO_PROXY, (data) => {
|
|||
|
|
socket.broadcast.emit(__DEVTOOLS_KIT_ELECTRON_MESSAGING_EVENT_KEY__.PROXY_TO_CLIENT, data);
|
|||
|
|
});
|
|||
|
|
socket.on(__DEVTOOLS_KIT_ELECTRON_MESSAGING_EVENT_KEY__.CLIENT_TO_PROXY, (data) => {
|
|||
|
|
socket.broadcast.emit(__DEVTOOLS_KIT_ELECTRON_MESSAGING_EVENT_KEY__.PROXY_TO_SERVER, data);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/messaging/presets/electron/server.ts
|
|||
|
|
function createElectronServerChannel() {
|
|||
|
|
const socket = getElectronServerContext();
|
|||
|
|
return {
|
|||
|
|
post: (data) => {
|
|||
|
|
socket.emit(__DEVTOOLS_KIT_ELECTRON_MESSAGING_EVENT_KEY__.SERVER_TO_PROXY, SuperJSON.stringify(data));
|
|||
|
|
},
|
|||
|
|
on: (handler) => {
|
|||
|
|
socket.on(__DEVTOOLS_KIT_ELECTRON_MESSAGING_EVENT_KEY__.PROXY_TO_SERVER, (data) => {
|
|||
|
|
handler(SuperJSON.parse(data));
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/messaging/presets/extension/context.ts
|
|||
|
|
const __EXTENSION_CLIENT_CONTEXT__ = "electron:client-context";
|
|||
|
|
const __DEVTOOLS_KIT_EXTENSION_MESSAGING_EVENT_KEY__ = {
|
|||
|
|
CLIENT_TO_PROXY: "client->proxy",
|
|||
|
|
PROXY_TO_CLIENT: "proxy->client",
|
|||
|
|
PROXY_TO_SERVER: "proxy->server",
|
|||
|
|
SERVER_TO_PROXY: "server->proxy"
|
|||
|
|
};
|
|||
|
|
function getExtensionClientContext() {
|
|||
|
|
return target[__EXTENSION_CLIENT_CONTEXT__];
|
|||
|
|
}
|
|||
|
|
function setExtensionClientContext(context) {
|
|||
|
|
target[__EXTENSION_CLIENT_CONTEXT__] = context;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/messaging/presets/extension/client.ts
|
|||
|
|
function createExtensionClientChannel() {
|
|||
|
|
let disconnected = false;
|
|||
|
|
let port = null;
|
|||
|
|
let reconnectTimer = null;
|
|||
|
|
let onMessageHandler = null;
|
|||
|
|
function connect() {
|
|||
|
|
try {
|
|||
|
|
clearTimeout(reconnectTimer);
|
|||
|
|
port = chrome.runtime.connect({ name: `${chrome.devtools.inspectedWindow.tabId}` });
|
|||
|
|
setExtensionClientContext(port);
|
|||
|
|
disconnected = false;
|
|||
|
|
port?.onMessage.addListener(onMessageHandler);
|
|||
|
|
port.onDisconnect.addListener(() => {
|
|||
|
|
disconnected = true;
|
|||
|
|
port?.onMessage.removeListener(onMessageHandler);
|
|||
|
|
reconnectTimer = setTimeout(connect, 1e3);
|
|||
|
|
});
|
|||
|
|
} catch (e) {
|
|||
|
|
disconnected = true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
connect();
|
|||
|
|
return {
|
|||
|
|
post: (data) => {
|
|||
|
|
if (disconnected) return;
|
|||
|
|
port?.postMessage(SuperJSON.stringify(data));
|
|||
|
|
},
|
|||
|
|
on: (handler) => {
|
|||
|
|
onMessageHandler = (data) => {
|
|||
|
|
if (disconnected) return;
|
|||
|
|
handler(SuperJSON.parse(data));
|
|||
|
|
};
|
|||
|
|
port?.onMessage.addListener(onMessageHandler);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/messaging/presets/extension/proxy.ts
|
|||
|
|
function createExtensionProxyChannel() {
|
|||
|
|
const port = chrome.runtime.connect({ name: "content-script" });
|
|||
|
|
function sendMessageToUserApp(payload) {
|
|||
|
|
window.postMessage({
|
|||
|
|
source: __DEVTOOLS_KIT_EXTENSION_MESSAGING_EVENT_KEY__.PROXY_TO_SERVER,
|
|||
|
|
payload
|
|||
|
|
}, "*");
|
|||
|
|
}
|
|||
|
|
function sendMessageToDevToolsClient(e) {
|
|||
|
|
if (e.data && e.data.source === __DEVTOOLS_KIT_EXTENSION_MESSAGING_EVENT_KEY__.SERVER_TO_PROXY) try {
|
|||
|
|
port.postMessage(e.data.payload);
|
|||
|
|
} catch (e$1) {}
|
|||
|
|
}
|
|||
|
|
port.onMessage.addListener(sendMessageToUserApp);
|
|||
|
|
window.addEventListener("message", sendMessageToDevToolsClient);
|
|||
|
|
port.onDisconnect.addListener(() => {
|
|||
|
|
window.removeEventListener("message", sendMessageToDevToolsClient);
|
|||
|
|
sendMessageToUserApp(SuperJSON.stringify({ event: "shutdown" }));
|
|||
|
|
});
|
|||
|
|
sendMessageToUserApp(SuperJSON.stringify({ event: "init" }));
|
|||
|
|
return {
|
|||
|
|
post: (data) => {},
|
|||
|
|
on: (handler) => {}
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/messaging/presets/extension/server.ts
|
|||
|
|
function createExtensionServerChannel() {
|
|||
|
|
return {
|
|||
|
|
post: (data) => {
|
|||
|
|
window.postMessage({
|
|||
|
|
source: __DEVTOOLS_KIT_EXTENSION_MESSAGING_EVENT_KEY__.SERVER_TO_PROXY,
|
|||
|
|
payload: SuperJSON.stringify(data)
|
|||
|
|
}, "*");
|
|||
|
|
},
|
|||
|
|
on: (handler) => {
|
|||
|
|
const listener = (event) => {
|
|||
|
|
if (event.data.source === __DEVTOOLS_KIT_EXTENSION_MESSAGING_EVENT_KEY__.PROXY_TO_SERVER && event.data.payload) handler(SuperJSON.parse(event.data.payload));
|
|||
|
|
};
|
|||
|
|
window.addEventListener("message", listener);
|
|||
|
|
return () => {
|
|||
|
|
window.removeEventListener("message", listener);
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/messaging/presets/iframe/context.ts
|
|||
|
|
const __DEVTOOLS_KIT_IFRAME_MESSAGING_EVENT_KEY = "__devtools-kit-iframe-messaging-event-key__";
|
|||
|
|
const __IFRAME_SERVER_CONTEXT__ = "iframe:server-context";
|
|||
|
|
function getIframeServerContext() {
|
|||
|
|
return target[__IFRAME_SERVER_CONTEXT__];
|
|||
|
|
}
|
|||
|
|
function setIframeServerContext(context) {
|
|||
|
|
target[__IFRAME_SERVER_CONTEXT__] = context;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/messaging/presets/iframe/client.ts
|
|||
|
|
function createIframeClientChannel() {
|
|||
|
|
if (!isBrowser) return {
|
|||
|
|
post: (data) => {},
|
|||
|
|
on: (handler) => {}
|
|||
|
|
};
|
|||
|
|
return {
|
|||
|
|
post: (data) => window.parent.postMessage(SuperJSON.stringify({
|
|||
|
|
event: __DEVTOOLS_KIT_IFRAME_MESSAGING_EVENT_KEY,
|
|||
|
|
data
|
|||
|
|
}), "*"),
|
|||
|
|
on: (handler) => window.addEventListener("message", (event) => {
|
|||
|
|
try {
|
|||
|
|
const parsed = SuperJSON.parse(event.data);
|
|||
|
|
if (event.source === window.parent && parsed.event === __DEVTOOLS_KIT_IFRAME_MESSAGING_EVENT_KEY) handler(parsed.data);
|
|||
|
|
} catch (e) {}
|
|||
|
|
})
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/messaging/presets/iframe/server.ts
|
|||
|
|
function createIframeServerChannel() {
|
|||
|
|
if (!isBrowser) return {
|
|||
|
|
post: (data) => {},
|
|||
|
|
on: (handler) => {}
|
|||
|
|
};
|
|||
|
|
return {
|
|||
|
|
post: (data) => {
|
|||
|
|
getIframeServerContext()?.contentWindow?.postMessage(SuperJSON.stringify({
|
|||
|
|
event: __DEVTOOLS_KIT_IFRAME_MESSAGING_EVENT_KEY,
|
|||
|
|
data
|
|||
|
|
}), "*");
|
|||
|
|
},
|
|||
|
|
on: (handler) => {
|
|||
|
|
window.addEventListener("message", (event) => {
|
|||
|
|
const iframe = getIframeServerContext();
|
|||
|
|
try {
|
|||
|
|
const parsed = SuperJSON.parse(event.data);
|
|||
|
|
if (event.source === iframe?.contentWindow && parsed.event === __DEVTOOLS_KIT_IFRAME_MESSAGING_EVENT_KEY) handler(parsed.data);
|
|||
|
|
} catch (e) {}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/messaging/presets/vite/context.ts
|
|||
|
|
const __DEVTOOLS_KIT_VITE_MESSAGING_EVENT_KEY = "__devtools-kit-vite-messaging-event-key__";
|
|||
|
|
const __VITE_CLIENT_CONTEXT__ = "vite:client-context";
|
|||
|
|
const __VITE_SERVER_CONTEXT__ = "vite:server-context";
|
|||
|
|
function getViteClientContext() {
|
|||
|
|
return target[__VITE_CLIENT_CONTEXT__];
|
|||
|
|
}
|
|||
|
|
function setViteClientContext(context) {
|
|||
|
|
target[__VITE_CLIENT_CONTEXT__] = context;
|
|||
|
|
}
|
|||
|
|
function getViteServerContext() {
|
|||
|
|
return target[__VITE_SERVER_CONTEXT__];
|
|||
|
|
}
|
|||
|
|
function setViteServerContext(context) {
|
|||
|
|
target[__VITE_SERVER_CONTEXT__] = context;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/messaging/presets/vite/client.ts
|
|||
|
|
function createViteClientChannel() {
|
|||
|
|
const client = getViteClientContext();
|
|||
|
|
return {
|
|||
|
|
post: (data) => {
|
|||
|
|
client?.send(__DEVTOOLS_KIT_VITE_MESSAGING_EVENT_KEY, SuperJSON.stringify(data));
|
|||
|
|
},
|
|||
|
|
on: (handler) => {
|
|||
|
|
client?.on(__DEVTOOLS_KIT_VITE_MESSAGING_EVENT_KEY, (event) => {
|
|||
|
|
handler(SuperJSON.parse(event));
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/messaging/presets/vite/server.ts
|
|||
|
|
function createViteServerChannel() {
|
|||
|
|
const viteServer = getViteServerContext();
|
|||
|
|
const ws = viteServer.hot ?? viteServer.ws;
|
|||
|
|
return {
|
|||
|
|
post: (data) => ws?.send(__DEVTOOLS_KIT_VITE_MESSAGING_EVENT_KEY, SuperJSON.stringify(data)),
|
|||
|
|
on: (handler) => ws?.on(__DEVTOOLS_KIT_VITE_MESSAGING_EVENT_KEY, (event) => {
|
|||
|
|
handler(SuperJSON.parse(event));
|
|||
|
|
})
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/messaging/index.ts
|
|||
|
|
target.__VUE_DEVTOOLS_KIT_MESSAGE_CHANNELS__ ??= [];
|
|||
|
|
target.__VUE_DEVTOOLS_KIT_RPC_CLIENT__ ??= null;
|
|||
|
|
target.__VUE_DEVTOOLS_KIT_RPC_SERVER__ ??= null;
|
|||
|
|
target.__VUE_DEVTOOLS_KIT_VITE_RPC_CLIENT__ ??= null;
|
|||
|
|
target.__VUE_DEVTOOLS_KIT_VITE_RPC_SERVER__ ??= null;
|
|||
|
|
target.__VUE_DEVTOOLS_KIT_BROADCAST_RPC_SERVER__ ??= null;
|
|||
|
|
function setRpcClientToGlobal(rpc) {
|
|||
|
|
target.__VUE_DEVTOOLS_KIT_RPC_CLIENT__ = rpc;
|
|||
|
|
}
|
|||
|
|
function setRpcServerToGlobal(rpc) {
|
|||
|
|
target.__VUE_DEVTOOLS_KIT_RPC_SERVER__ = rpc;
|
|||
|
|
}
|
|||
|
|
function getRpcClient() {
|
|||
|
|
return target.__VUE_DEVTOOLS_KIT_RPC_CLIENT__;
|
|||
|
|
}
|
|||
|
|
function getRpcServer() {
|
|||
|
|
return target.__VUE_DEVTOOLS_KIT_RPC_SERVER__;
|
|||
|
|
}
|
|||
|
|
function setViteRpcClientToGlobal(rpc) {
|
|||
|
|
target.__VUE_DEVTOOLS_KIT_VITE_RPC_CLIENT__ = rpc;
|
|||
|
|
}
|
|||
|
|
function setViteRpcServerToGlobal(rpc) {
|
|||
|
|
target.__VUE_DEVTOOLS_KIT_VITE_RPC_SERVER__ = rpc;
|
|||
|
|
}
|
|||
|
|
function getViteRpcClient() {
|
|||
|
|
return target.__VUE_DEVTOOLS_KIT_VITE_RPC_CLIENT__;
|
|||
|
|
}
|
|||
|
|
function getViteRpcServer() {
|
|||
|
|
return target.__VUE_DEVTOOLS_KIT_VITE_RPC_SERVER__;
|
|||
|
|
}
|
|||
|
|
function getChannel(preset, host = "client") {
|
|||
|
|
const channel = {
|
|||
|
|
iframe: {
|
|||
|
|
client: createIframeClientChannel,
|
|||
|
|
server: createIframeServerChannel
|
|||
|
|
}[host],
|
|||
|
|
electron: {
|
|||
|
|
client: createElectronClientChannel,
|
|||
|
|
proxy: createElectronProxyChannel,
|
|||
|
|
server: createElectronServerChannel
|
|||
|
|
}[host],
|
|||
|
|
vite: {
|
|||
|
|
client: createViteClientChannel,
|
|||
|
|
server: createViteServerChannel
|
|||
|
|
}[host],
|
|||
|
|
broadcast: {
|
|||
|
|
client: createBroadcastChannel,
|
|||
|
|
server: createBroadcastChannel
|
|||
|
|
}[host],
|
|||
|
|
extension: {
|
|||
|
|
client: createExtensionClientChannel,
|
|||
|
|
proxy: createExtensionProxyChannel,
|
|||
|
|
server: createExtensionServerChannel
|
|||
|
|
}[host]
|
|||
|
|
}[preset];
|
|||
|
|
return channel();
|
|||
|
|
}
|
|||
|
|
function createRpcClient(functions, options = {}) {
|
|||
|
|
const { channel: _channel, options: _options, preset } = options;
|
|||
|
|
const channel = preset ? getChannel(preset) : _channel;
|
|||
|
|
const rpc = createBirpc(functions, {
|
|||
|
|
..._options,
|
|||
|
|
...channel,
|
|||
|
|
timeout: -1
|
|||
|
|
});
|
|||
|
|
if (preset === "vite") {
|
|||
|
|
setViteRpcClientToGlobal(rpc);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
setRpcClientToGlobal(rpc);
|
|||
|
|
return rpc;
|
|||
|
|
}
|
|||
|
|
function createRpcServer(functions, options = {}) {
|
|||
|
|
const { channel: _channel, options: _options, preset } = options;
|
|||
|
|
const channel = preset ? getChannel(preset, "server") : _channel;
|
|||
|
|
const rpcServer = getRpcServer();
|
|||
|
|
if (!rpcServer) {
|
|||
|
|
const group = createBirpcGroup(functions, [channel], {
|
|||
|
|
..._options,
|
|||
|
|
timeout: -1
|
|||
|
|
});
|
|||
|
|
if (preset === "vite") {
|
|||
|
|
setViteRpcServerToGlobal(group);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
setRpcServerToGlobal(group);
|
|||
|
|
} else rpcServer.updateChannels((channels) => {
|
|||
|
|
channels.push(channel);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
function createRpcProxy(options = {}) {
|
|||
|
|
const { channel: _channel, options: _options, preset } = options;
|
|||
|
|
const channel = preset ? getChannel(preset, "proxy") : _channel;
|
|||
|
|
return createBirpc({}, {
|
|||
|
|
..._options,
|
|||
|
|
...channel,
|
|||
|
|
timeout: -1
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/component/state/custom.ts
|
|||
|
|
function getFunctionDetails(func) {
|
|||
|
|
let string = "";
|
|||
|
|
let matches = null;
|
|||
|
|
try {
|
|||
|
|
string = Function.prototype.toString.call(func);
|
|||
|
|
matches = String.prototype.match.call(string, /\([\s\S]*?\)/);
|
|||
|
|
} catch (e) {}
|
|||
|
|
const match = matches && matches[0];
|
|||
|
|
const args = typeof match === "string" ? match : "(?)";
|
|||
|
|
return { _custom: {
|
|||
|
|
type: "function",
|
|||
|
|
displayText: `<span style="opacity:.8;margin-right:5px;">function</span> <span style="white-space:nowrap;">${escape(typeof func.name === "string" ? func.name : "")}${args}</span>`,
|
|||
|
|
tooltipText: string.trim() ? `<pre>${string}</pre>` : null
|
|||
|
|
} };
|
|||
|
|
}
|
|||
|
|
function getBigIntDetails(val) {
|
|||
|
|
const stringifiedBigInt = BigInt.prototype.toString.call(val);
|
|||
|
|
return { _custom: {
|
|||
|
|
type: "bigint",
|
|||
|
|
displayText: `BigInt(${stringifiedBigInt})`,
|
|||
|
|
value: stringifiedBigInt
|
|||
|
|
} };
|
|||
|
|
}
|
|||
|
|
function getDateDetails(val) {
|
|||
|
|
const date = new Date(val.getTime());
|
|||
|
|
date.setMinutes(date.getMinutes() - date.getTimezoneOffset());
|
|||
|
|
return { _custom: {
|
|||
|
|
type: "date",
|
|||
|
|
displayText: Date.prototype.toString.call(val),
|
|||
|
|
value: date.toISOString().slice(0, -1)
|
|||
|
|
} };
|
|||
|
|
}
|
|||
|
|
function getMapDetails(val) {
|
|||
|
|
return { _custom: {
|
|||
|
|
type: "map",
|
|||
|
|
displayText: "Map",
|
|||
|
|
value: Object.fromEntries(val),
|
|||
|
|
readOnly: true,
|
|||
|
|
fields: { abstract: true }
|
|||
|
|
} };
|
|||
|
|
}
|
|||
|
|
function getSetDetails(val) {
|
|||
|
|
const list = Array.from(val);
|
|||
|
|
return { _custom: {
|
|||
|
|
type: "set",
|
|||
|
|
displayText: `Set[${list.length}]`,
|
|||
|
|
value: list,
|
|||
|
|
readOnly: true
|
|||
|
|
} };
|
|||
|
|
}
|
|||
|
|
function getCaughtGetters(store) {
|
|||
|
|
const getters = {};
|
|||
|
|
const origGetters = store.getters || {};
|
|||
|
|
const keys = Object.keys(origGetters);
|
|||
|
|
for (let i = 0; i < keys.length; i++) {
|
|||
|
|
const key = keys[i];
|
|||
|
|
Object.defineProperty(getters, key, {
|
|||
|
|
enumerable: true,
|
|||
|
|
get: () => {
|
|||
|
|
try {
|
|||
|
|
return origGetters[key];
|
|||
|
|
} catch (e) {
|
|||
|
|
return e;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
return getters;
|
|||
|
|
}
|
|||
|
|
function reduceStateList(list) {
|
|||
|
|
if (!list.length) return void 0;
|
|||
|
|
return list.reduce((map, item) => {
|
|||
|
|
const key = item.type || "data";
|
|||
|
|
const obj = map[key] = map[key] || {};
|
|||
|
|
obj[item.key] = item.value;
|
|||
|
|
return map;
|
|||
|
|
}, {});
|
|||
|
|
}
|
|||
|
|
function namedNodeMapToObject(map) {
|
|||
|
|
const result = {};
|
|||
|
|
const l = map.length;
|
|||
|
|
for (let i = 0; i < l; i++) {
|
|||
|
|
const node = map.item(i);
|
|||
|
|
result[node.name] = node.value;
|
|||
|
|
}
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
function getStoreDetails(store) {
|
|||
|
|
return { _custom: {
|
|||
|
|
type: "store",
|
|||
|
|
displayText: "Store",
|
|||
|
|
value: {
|
|||
|
|
state: store.state,
|
|||
|
|
getters: getCaughtGetters(store)
|
|||
|
|
},
|
|||
|
|
fields: { abstract: true }
|
|||
|
|
} };
|
|||
|
|
}
|
|||
|
|
function getRouterDetails(router) {
|
|||
|
|
return { _custom: {
|
|||
|
|
type: "router",
|
|||
|
|
displayText: "VueRouter",
|
|||
|
|
value: {
|
|||
|
|
options: router.options,
|
|||
|
|
currentRoute: router.currentRoute
|
|||
|
|
},
|
|||
|
|
fields: { abstract: true }
|
|||
|
|
} };
|
|||
|
|
}
|
|||
|
|
function getInstanceDetails(instance) {
|
|||
|
|
if (instance._) instance = instance._;
|
|||
|
|
const state = processInstanceState(instance);
|
|||
|
|
return { _custom: {
|
|||
|
|
type: "component",
|
|||
|
|
id: instance.__VUE_DEVTOOLS_NEXT_UID__,
|
|||
|
|
displayText: getInstanceName(instance),
|
|||
|
|
tooltipText: "Component instance",
|
|||
|
|
value: reduceStateList(state),
|
|||
|
|
fields: { abstract: true }
|
|||
|
|
} };
|
|||
|
|
}
|
|||
|
|
function getComponentDefinitionDetails(definition) {
|
|||
|
|
let display = getComponentName(definition);
|
|||
|
|
if (display) {
|
|||
|
|
if (definition.name && definition.__file) display += ` <span>(${definition.__file})</span>`;
|
|||
|
|
} else display = "<i>Unknown Component</i>";
|
|||
|
|
return { _custom: {
|
|||
|
|
type: "component-definition",
|
|||
|
|
displayText: display,
|
|||
|
|
tooltipText: "Component definition",
|
|||
|
|
...definition.__file ? { file: definition.__file } : {}
|
|||
|
|
} };
|
|||
|
|
}
|
|||
|
|
function getHTMLElementDetails(value) {
|
|||
|
|
try {
|
|||
|
|
return { _custom: {
|
|||
|
|
type: "HTMLElement",
|
|||
|
|
displayText: `<span class="opacity-30"><</span><span class="text-blue-500">${value.tagName.toLowerCase()}</span><span class="opacity-30">></span>`,
|
|||
|
|
value: namedNodeMapToObject(value.attributes)
|
|||
|
|
} };
|
|||
|
|
} catch (e) {
|
|||
|
|
return { _custom: {
|
|||
|
|
type: "HTMLElement",
|
|||
|
|
displayText: `<span class="text-blue-500">${String(value)}</span>`
|
|||
|
|
} };
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* - ObjectRefImpl, toRef({ foo: 'foo' }, 'foo'), `_value` is the actual value, (since 3.5.0)
|
|||
|
|
* - GetterRefImpl, toRef(() => state.foo), `_value` is the actual value, (since 3.5.0)
|
|||
|
|
* - RefImpl, ref('foo') / computed(() => 'foo'), `_value` is the actual value
|
|||
|
|
*/
|
|||
|
|
function tryGetRefValue(ref) {
|
|||
|
|
if (ensurePropertyExists(ref, "_value", true)) return ref._value;
|
|||
|
|
if (ensurePropertyExists(ref, "value", true)) return ref.value;
|
|||
|
|
}
|
|||
|
|
function getObjectDetails(object) {
|
|||
|
|
const info = getSetupStateType(object);
|
|||
|
|
if (info.ref || info.computed || info.reactive) {
|
|||
|
|
const stateTypeName = info.computed ? "Computed" : info.ref ? "Ref" : info.reactive ? "Reactive" : null;
|
|||
|
|
const value = toRaw(info.reactive ? object : tryGetRefValue(object));
|
|||
|
|
const raw = ensurePropertyExists(object, "effect") ? object.effect?.raw?.toString() || object.effect?.fn?.toString() : null;
|
|||
|
|
return { _custom: {
|
|||
|
|
type: stateTypeName?.toLowerCase(),
|
|||
|
|
stateTypeName,
|
|||
|
|
value,
|
|||
|
|
...raw ? { tooltipText: `<span class="font-mono">${raw}</span>` } : {}
|
|||
|
|
} };
|
|||
|
|
}
|
|||
|
|
if (ensurePropertyExists(object, "__asyncLoader") && typeof object.__asyncLoader === "function") return { _custom: {
|
|||
|
|
type: "component-definition",
|
|||
|
|
display: "Async component definition"
|
|||
|
|
} };
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/core/component/state/replacer.ts
|
|||
|
|
function stringifyReplacer(key, _value, depth, seenInstance) {
|
|||
|
|
if (key === "compilerOptions") return;
|
|||
|
|
const val = this[key];
|
|||
|
|
const type = typeof val;
|
|||
|
|
if (Array.isArray(val)) {
|
|||
|
|
const l = val.length;
|
|||
|
|
if (l > MAX_ARRAY_SIZE) return {
|
|||
|
|
_isArray: true,
|
|||
|
|
length: l,
|
|||
|
|
items: val.slice(0, MAX_ARRAY_SIZE)
|
|||
|
|
};
|
|||
|
|
return val;
|
|||
|
|
} else if (typeof val === "string") if (val.length > MAX_STRING_SIZE) return `${val.substring(0, MAX_STRING_SIZE)}... (${val.length} total length)`;
|
|||
|
|
else return val;
|
|||
|
|
else if (type === "undefined") return UNDEFINED;
|
|||
|
|
else if (val === Number.POSITIVE_INFINITY) return INFINITY;
|
|||
|
|
else if (val === Number.NEGATIVE_INFINITY) return NEGATIVE_INFINITY;
|
|||
|
|
else if (typeof val === "function") return getFunctionDetails(val);
|
|||
|
|
else if (type === "symbol") return `[native Symbol ${Symbol.prototype.toString.call(val)}]`;
|
|||
|
|
else if (typeof val === "bigint") return getBigIntDetails(val);
|
|||
|
|
else if (val !== null && typeof val === "object") {
|
|||
|
|
const proto = Object.prototype.toString.call(val);
|
|||
|
|
if (proto === "[object Map]") return getMapDetails(val);
|
|||
|
|
else if (proto === "[object Set]") return getSetDetails(val);
|
|||
|
|
else if (proto === "[object RegExp]") return `[native RegExp ${RegExp.prototype.toString.call(val)}]`;
|
|||
|
|
else if (proto === "[object Date]") return getDateDetails(val);
|
|||
|
|
else if (proto === "[object Error]") return `[native Error ${val.message}<>${val.stack}]`;
|
|||
|
|
else if (ensurePropertyExists(val, "state", true) && ensurePropertyExists(val, "_vm", true)) return getStoreDetails(val);
|
|||
|
|
else if (val.constructor && val.constructor.name === "VueRouter") return getRouterDetails(val);
|
|||
|
|
else if (isVueInstance(val)) {
|
|||
|
|
const componentVal = getInstanceDetails(val);
|
|||
|
|
const parentInstanceDepth = seenInstance?.get(val);
|
|||
|
|
if (parentInstanceDepth && parentInstanceDepth < depth) return `[[CircularRef]] <${componentVal._custom.displayText}>`;
|
|||
|
|
seenInstance?.set(val, depth);
|
|||
|
|
return componentVal;
|
|||
|
|
} else if (ensurePropertyExists(val, "render", true) && typeof val.render === "function") return getComponentDefinitionDetails(val);
|
|||
|
|
else if (val.constructor && val.constructor.name === "VNode") return `[native VNode <${val.tag}>]`;
|
|||
|
|
else if (typeof HTMLElement !== "undefined" && val instanceof HTMLElement) return getHTMLElementDetails(val);
|
|||
|
|
else if (val.constructor?.name === "Store" && "_wrappedGetters" in val) return "[object Store]";
|
|||
|
|
else if (ensurePropertyExists(val, "currentRoute", true)) return "[object Router]";
|
|||
|
|
const customDetails = getObjectDetails(val);
|
|||
|
|
if (customDetails != null) return customDetails;
|
|||
|
|
} else if (Number.isNaN(val)) return NAN;
|
|||
|
|
return sanitize(val);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/shared/transfer.ts
|
|||
|
|
const MAX_SERIALIZED_SIZE = 2 * 1024 * 1024;
|
|||
|
|
function isObject(_data, proto) {
|
|||
|
|
return proto === "[object Object]";
|
|||
|
|
}
|
|||
|
|
function isArray(_data, proto) {
|
|||
|
|
return proto === "[object Array]";
|
|||
|
|
}
|
|||
|
|
function isVueReactiveLinkNode(node) {
|
|||
|
|
const constructorName = node?.constructor?.name;
|
|||
|
|
return constructorName === "Dep" && "activeLink" in node || constructorName === "Link" && "dep" in node;
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* This function is used to serialize object with handling circular references.
|
|||
|
|
*
|
|||
|
|
* ```ts
|
|||
|
|
* const obj = { a: 1, b: { c: 2 }, d: obj }
|
|||
|
|
* const result = stringifyCircularAutoChunks(obj) // call `encode` inside
|
|||
|
|
* console.log(result) // [{"a":1,"b":2,"d":0},1,{"c":4},2]
|
|||
|
|
* ```
|
|||
|
|
*
|
|||
|
|
* Each object is stored in a list and the index is used to reference the object.
|
|||
|
|
* With seen map, we can check if the object is already stored in the list to avoid circular references.
|
|||
|
|
*
|
|||
|
|
* Note: here we have a special case for Vue instance.
|
|||
|
|
* We check if a vue instance includes itself in its properties and skip it
|
|||
|
|
* by using `seenVueInstance` and `depth` to avoid infinite loop.
|
|||
|
|
*/
|
|||
|
|
function encode(data, replacer, list, seen, depth = 0, seenVueInstance = /* @__PURE__ */ new Map()) {
|
|||
|
|
let stored;
|
|||
|
|
let key;
|
|||
|
|
let value;
|
|||
|
|
let i;
|
|||
|
|
let l;
|
|||
|
|
const seenIndex = seen.get(data);
|
|||
|
|
if (seenIndex != null) return seenIndex;
|
|||
|
|
const index = list.length;
|
|||
|
|
const proto = Object.prototype.toString.call(data);
|
|||
|
|
if (isObject(data, proto)) {
|
|||
|
|
if (isVueReactiveLinkNode(data)) return index;
|
|||
|
|
stored = {};
|
|||
|
|
seen.set(data, index);
|
|||
|
|
list.push(stored);
|
|||
|
|
const keys = Object.keys(data);
|
|||
|
|
for (i = 0, l = keys.length; i < l; i++) {
|
|||
|
|
key = keys[i];
|
|||
|
|
if (key === "compilerOptions") return index;
|
|||
|
|
value = data[key];
|
|||
|
|
const isVm = value != null && isObject(value, Object.prototype.toString.call(data)) && isVueInstance(value);
|
|||
|
|
try {
|
|||
|
|
if (replacer) value = replacer.call(data, key, value, depth, seenVueInstance);
|
|||
|
|
} catch (e) {
|
|||
|
|
value = e;
|
|||
|
|
}
|
|||
|
|
stored[key] = encode(value, replacer, list, seen, depth + 1, seenVueInstance);
|
|||
|
|
if (isVm) seenVueInstance.delete(value);
|
|||
|
|
}
|
|||
|
|
} else if (isArray(data, proto)) {
|
|||
|
|
stored = [];
|
|||
|
|
seen.set(data, index);
|
|||
|
|
list.push(stored);
|
|||
|
|
for (i = 0, l = data.length; i < l; i++) {
|
|||
|
|
try {
|
|||
|
|
value = data[i];
|
|||
|
|
if (replacer) value = replacer.call(data, i, value, depth, seenVueInstance);
|
|||
|
|
} catch (e) {
|
|||
|
|
value = e;
|
|||
|
|
}
|
|||
|
|
stored[i] = encode(value, replacer, list, seen, depth + 1, seenVueInstance);
|
|||
|
|
}
|
|||
|
|
} else list.push(data);
|
|||
|
|
return index;
|
|||
|
|
}
|
|||
|
|
function decode(list, reviver$1 = null) {
|
|||
|
|
let i = list.length;
|
|||
|
|
let j, k, data, key, value, proto;
|
|||
|
|
while (i--) {
|
|||
|
|
data = list[i];
|
|||
|
|
proto = Object.prototype.toString.call(data);
|
|||
|
|
if (proto === "[object Object]") {
|
|||
|
|
const keys = Object.keys(data);
|
|||
|
|
for (j = 0, k = keys.length; j < k; j++) {
|
|||
|
|
key = keys[j];
|
|||
|
|
value = list[data[key]];
|
|||
|
|
if (reviver$1) value = reviver$1.call(data, key, value);
|
|||
|
|
data[key] = value;
|
|||
|
|
}
|
|||
|
|
} else if (proto === "[object Array]") for (j = 0, k = data.length; j < k; j++) {
|
|||
|
|
value = list[data[j]];
|
|||
|
|
if (reviver$1) value = reviver$1.call(data, j, value);
|
|||
|
|
data[j] = value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
function stringifyCircularAutoChunks(data, replacer = null, space = null) {
|
|||
|
|
let result;
|
|||
|
|
try {
|
|||
|
|
result = arguments.length === 1 ? JSON.stringify(data) : JSON.stringify(data, (k, v) => replacer?.(k, v)?.call(this), space);
|
|||
|
|
} catch (e) {
|
|||
|
|
result = stringifyStrictCircularAutoChunks(data, replacer, space);
|
|||
|
|
}
|
|||
|
|
if (result.length > MAX_SERIALIZED_SIZE) {
|
|||
|
|
const chunkCount = Math.ceil(result.length / MAX_SERIALIZED_SIZE);
|
|||
|
|
const chunks = [];
|
|||
|
|
for (let i = 0; i < chunkCount; i++) chunks.push(result.slice(i * MAX_SERIALIZED_SIZE, (i + 1) * MAX_SERIALIZED_SIZE));
|
|||
|
|
return chunks;
|
|||
|
|
}
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
function stringifyStrictCircularAutoChunks(data, replacer = null, space = null) {
|
|||
|
|
const list = [];
|
|||
|
|
encode(data, replacer, list, /* @__PURE__ */ new Map());
|
|||
|
|
return space ? ` ${JSON.stringify(list, null, space)}` : ` ${JSON.stringify(list)}`;
|
|||
|
|
}
|
|||
|
|
function parseCircularAutoChunks(data, reviver$1 = null) {
|
|||
|
|
if (Array.isArray(data)) data = data.join("");
|
|||
|
|
if (!/^\s/.test(data)) return arguments.length === 1 ? JSON.parse(data) : JSON.parse(data, reviver$1);
|
|||
|
|
else {
|
|||
|
|
const list = JSON.parse(data);
|
|||
|
|
decode(list, reviver$1);
|
|||
|
|
return list[0];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/shared/util.ts
|
|||
|
|
function stringify(data) {
|
|||
|
|
return stringifyCircularAutoChunks(data, stringifyReplacer);
|
|||
|
|
}
|
|||
|
|
function parse(data, revive$1 = false) {
|
|||
|
|
if (data == void 0) return {};
|
|||
|
|
return revive$1 ? parseCircularAutoChunks(data, reviver) : parseCircularAutoChunks(data);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
//#region src/index.ts
|
|||
|
|
const devtools = {
|
|||
|
|
hook,
|
|||
|
|
init: () => {
|
|||
|
|
initDevTools();
|
|||
|
|
},
|
|||
|
|
get ctx() {
|
|||
|
|
return devtoolsContext;
|
|||
|
|
},
|
|||
|
|
get api() {
|
|||
|
|
return devtoolsContext.api;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
export { DevToolsContextHookKeys, DevToolsMessagingHookKeys, DevToolsV6PluginAPIHookKeys, INFINITY, NAN, NEGATIVE_INFINITY, ROUTER_INFO_KEY, ROUTER_KEY, UNDEFINED, activeAppRecord, addCustomCommand, addCustomTab, addDevToolsAppRecord, addDevToolsPluginToBuffer, addInspector, callConnectedUpdatedHook, callDevToolsPluginSetupFn, callInspectorUpdatedHook, callStateUpdatedHook, createComponentsDevToolsPlugin, createDevToolsApi, createDevToolsCtxHooks, createRpcClient, createRpcProxy, createRpcServer, devtools, devtoolsAppRecords, devtoolsContext, devtoolsInspector, devtoolsPluginBuffer, devtoolsRouter, devtoolsRouterInfo, devtoolsState, escape, formatInspectorStateValue, getActiveInspectors, getDevToolsEnv, getExtensionClientContext, getInspector, getInspectorActions, getInspectorInfo, getInspectorNodeActions, getInspectorStateValueType, getRaw, getRpcClient, getRpcServer, getViteRpcClient, getViteRpcServer, initDevTools, isPlainObject, onDevToolsClientConnected, onDevToolsConnected, parse, registerDevToolsPlugin, removeCustomCommand, removeDevToolsAppRecord, removeRegisteredPluginApp, resetDevToolsState, setActiveAppRecord, setActiveAppRecordId, setDevToolsEnv, setElectronClientContext, setElectronProxyContext, setElectronServerContext, setExtensionClientContext, setIframeServerContext, setOpenInEditorBaseUrl, setRpcServerToGlobal, setViteClientContext, setViteRpcClientToGlobal, setViteRpcServerToGlobal, setViteServerContext, setupDevToolsPlugin, stringify, toEdit, toSubmit, toggleClientConnected, toggleComponentInspectorEnabled, toggleHighPerfMode, updateDevToolsClientDetected, updateDevToolsState, updateTimelineLayersState };
|