@pinia/colada-devtools 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +2 -4
- package/dist/index.js +19 -20
- package/dist/index.js.map +1 -1
- package/dist-panel/{(unselected)-95MlHIGa.js → (unselected)-BvYXA0-7.js} +3 -3
- package/dist-panel/{(unselected)-95MlHIGa.js.map → (unselected)-BvYXA0-7.js.map} +1 -1
- package/dist-panel/{(unselected)-DcyIREPL.js → (unselected)-De_qnqOP.js} +3 -3
- package/dist-panel/{(unselected)-DcyIREPL.js.map → (unselected)-De_qnqOP.js.map} +1 -1
- package/dist-panel/_mutationId_-DJZUO9uK.js +307 -0
- package/dist-panel/_mutationId_-DJZUO9uK.js.map +1 -0
- package/dist-panel/{_queryId_-deTdMujv.js → _queryId_-OYxjQ3wF.js} +173 -178
- package/dist-panel/_queryId_-OYxjQ3wF.js.map +1 -0
- package/dist-panel/{circle-x-CRJfYoJo.js → circle-x-CKUVRuJV.js} +21 -20
- package/dist-panel/circle-x-CKUVRuJV.js.map +1 -0
- package/dist-panel/{index-CEuAAFs8.js → index-BDRe8hqi.js} +210 -210
- package/dist-panel/{index-CEuAAFs8.js.map → index-BDRe8hqi.js.map} +1 -1
- package/dist-panel/{index-DfoOd-Mi.js → index-CbhK8baV.js} +2 -2
- package/dist-panel/{index-DfoOd-Mi.js.map → index-CbhK8baV.js.map} +1 -1
- package/dist-panel/index.js +1 -1
- package/dist-panel/{loader-CiXOT2XE.js → loader-DUh7Y4gr.js} +2 -2
- package/dist-panel/loader-DUh7Y4gr.js.map +1 -0
- package/dist-panel/{mouse-pointer-click-CR81e5yZ.js → mouse-pointer-click-tLOKuf9h.js} +2 -2
- package/dist-panel/mouse-pointer-click-tLOKuf9h.js.map +1 -0
- package/dist-panel/{mutations-Dox_GA2-.js → mutations-DbP2-xaA.js} +4 -4
- package/dist-panel/{mutations-Dox_GA2-.js.map → mutations-DbP2-xaA.js.map} +1 -1
- package/dist-panel/{queries-15p7FQjG.js → queries-CfTVwyNe.js} +4 -4
- package/dist-panel/{queries-15p7FQjG.js.map → queries-CfTVwyNe.js.map} +1 -1
- package/dist-panel/{settings-DqjxZlKC.js → settings--jMqFgqF.js} +2 -2
- package/dist-panel/{settings-DqjxZlKC.js.map → settings--jMqFgqF.js.map} +1 -1
- package/dist-panel/{use-container-media-query-rzuTymhT.js → use-container-media-query-B1rNyopG.js} +2 -2
- package/dist-panel/{use-container-media-query-rzuTymhT.js.map → use-container-media-query-B1rNyopG.js.map} +1 -1
- package/dist-shared/index.js +1 -1
- package/dist-shared/index.js.map +1 -1
- package/package.json +5 -5
- package/dist-panel/_mutationId_-BfpMyZn5.js +0 -307
- package/dist-panel/_mutationId_-BfpMyZn5.js.map +0 -1
- package/dist-panel/_queryId_-deTdMujv.js.map +0 -1
- package/dist-panel/circle-x-CRJfYoJo.js.map +0 -1
- package/dist-panel/loader-CiXOT2XE.js.map +0 -1
- package/dist-panel/mouse-pointer-click-CR81e5yZ.js.map +0 -1
package/dist-shared/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/shared/query-serialized.ts","../src/shared/json.ts","../src/shared/rpc/custom-values.ts","../src/shared/rpc/index.ts","../src/shared/plugins/devtools-info.ts"],"sourcesContent":["import type { RefetchOnControl, UseQueryEntry, UseQueryOptionsWithDefaults } from '@pinia/colada'\nimport type { DEVTOOLS_INFO_KEY } from './plugins/devtools-info'\n\nexport interface UseQueryEntryPayload {\n keyHash: string\n\n key: UseQueryEntry['key']\n state: UseQueryEntry['state']['value']\n asyncStatus: UseQueryEntry['asyncStatus']['value']\n\n active: UseQueryEntry['active']\n stale: UseQueryEntry['stale']\n when: UseQueryEntry['when']\n options: UseQueryEntryPayloadOptions | null\n deps: UseQueryEntryPayloadDep[]\n gcTimeout: number | null\n\n devtools: UseQueryEntry[typeof DEVTOOLS_INFO_KEY]\n}\n\nexport interface UseQueryEntryPayloadDepComponent {\n type: 'component'\n uid: number\n name: string | undefined\n}\n\nexport interface UseQueryEntryPayloadDepEffect {\n type: 'effect'\n active: boolean\n detached: boolean\n}\n\nexport type UseQueryEntryPayloadDep =\n | UseQueryEntryPayloadDepComponent\n | UseQueryEntryPayloadDepEffect\n\nexport interface UseQueryEntryPayloadOptions extends Pick<\n UseQueryOptionsWithDefaults,\n 'gcTime' | 'staleTime'\n> {\n // manually overriden to extract only plain values\n enabled: boolean\n refetchOnMount: RefetchOnControl\n refetchOnReconnect: RefetchOnControl\n refetchOnWindowFocus: RefetchOnControl\n}\n\nexport function miniJsonParse(value: unknown): string {\n const isValidIdentifier = (key: string): boolean => /^[A-Z_$][\\w$]*$/i.test(key)\n\n const serialize = (val: unknown): string => {\n if (val === null) return 'null'\n if (typeof val === 'number') return val.toString()\n if (typeof val === 'string') return JSON.stringify(val)\n if (typeof val === 'boolean') return val ? 'true' : 'false'\n\n if (Array.isArray(val)) {\n return `[${val.map(serialize).join(',')}]`\n }\n\n if (typeof val === 'object') {\n const obj = val as Record<string, unknown>\n const entries = Object.keys(obj).map((key) => {\n const k = isValidIdentifier(key) ? key : JSON.stringify(key)\n const v = serialize(obj[key])\n return `${k}:${v}`\n })\n return `{${entries.join(',')}}`\n }\n\n return 'undefined' // or throw if you prefer to exclude unsupported values\n }\n\n return serialize(value)\n}\n","// NOTE: copied from pinia colada src/utils.ts\n\n/**\n * Valid primitives that can be stringified with `JSON.stringify`.\n *\n * @internal\n */\nexport type JSONPrimitive = string | number | boolean | null | undefined\n\n/**\n * Checks if a value is a valid JSON primitive.\n *\n * @param value - The value to check\n */\nexport function isJSONPrimitive(value: unknown): value is JSONPrimitive {\n return (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n value == null // null or undefined\n )\n}\n\n/**\n * Utility type to represent a flat object that can be stringified with\n * `JSON.stringify` no matter the order of keys.\n *\n * @internal\n */\nexport interface ObjectFlat {\n [key: string]: JSONPrimitive | Array<JSONPrimitive>\n}\n\n/**\n * Valid values that can be stringified with `JSON.stringify`.\n *\n * @internal\n */\nexport type JSONValue = JSONPrimitive | JSONValue[] | { [key: string]: JSONValue }\n\nexport function isJSONValue(value: unknown): value is JSONValue {\n if (isJSONPrimitive(value)) return true\n if (Array.isArray(value)) {\n return value.every(isJSONValue)\n }\n if (isPlainObject(value)) {\n return Object.values(value).every(isJSONValue)\n }\n return false\n}\n\nfunction isCollection(\n value: unknown,\n): value is Iterable<unknown> & ({ length: number } | { size: number }) {\n return (\n value != null &&\n typeof value === 'object' &&\n ('length' in value || 'size' in value) &&\n Symbol.iterator in value\n )\n}\n\nfunction formatCollection(value: { length: number } | { size: number }) {\n const size = 'length' in value ? value.length : value.size\n return `${value.constructor.name}[${size}]`\n}\n\nexport const isObject = (val: unknown): val is Record<any, any> =>\n val !== null && typeof val === 'object'\n\nexport function formatValue(value: unknown) {\n if (value === null) return 'null'\n if (value === undefined) return 'undefined'\n if (typeof value === 'string') return `\"${value}\"`\n if (typeof value === 'bigint') return `${value}n`\n if (typeof value === 'function') return `[Function ${value.name || 'anonymous'}]`\n if (isObject(value)) {\n if (value instanceof Date) return `Date(${value.toISOString()})`\n if (value instanceof RegExp) return value.toString()\n if (value instanceof Error) return `Error(${value.message})`\n if (isCollection(value)) return formatCollection(value)\n if (isPlainObject(value)) return `Object${Object.keys(value).length === 0 ? ' (empty)' : ''}`\n return `[${value.constructor.name}]`\n }\n return String(value)\n}\n\nexport function isPlainObject(value: unknown): value is { constructor?: typeof Object } {\n return isObject(value) && (value.constructor === Object || Object.getPrototypeOf(value) == null)\n}\n\nexport function getValueType(value: unknown) {\n if (value === null) return 'null'\n if (Array.isArray(value)) return 'array'\n if (value instanceof Date) return 'date'\n if (value instanceof RegExp) return 'regexp'\n if (value instanceof Error) return 'error'\n return typeof value\n}\n\nconst VALUE_TYPE_CSS_CLASS = {\n string: 'text-(--devtools-syntax-green)',\n boolean: 'text-(--devtools-syntax-orange)',\n number: 'text-(--devtools-syntax-orange)',\n null: 'text-(--devtools-syntax-purple)',\n undefined: 'text-(--devtools-syntax-purple)',\n array: 'text-(--ui-text)',\n function: 'text-(--ui-text)',\n object: 'text-(--ui-text)',\n symbol: 'text-(--devtools-syntax-orange)',\n bigint: 'text-(--devtools-syntax-sapphire)',\n date: 'text-(--devtools-syntax-sapphire)',\n regexp: 'text-(--devtools-syntax-orange)',\n error: 'text-(--devtools-syntax-red)',\n} satisfies Partial<Record<ReturnType<typeof getValueType>, string>>\n\nexport function getValueTypeClass(value: unknown): string | undefined {\n return VALUE_TYPE_CSS_CLASS[getValueType(value)] || '--ui-text'\n}\n","import { isPlainObject } from '../json'\n\nexport interface NonSerializableValue_Base {\n __custom: '@@pc-non-serializable'\n __type: string\n value: unknown\n}\n\nexport interface NonSerializableValue_Function extends NonSerializableValue_Base {\n __type: 'function'\n value: string\n}\n\nexport interface NonSerializableValue_Symbol extends NonSerializableValue_Base {\n __type: 'symbol'\n value: string\n}\n\nexport interface NonSerializableValue_BigInt extends NonSerializableValue_Base {\n __type: 'bigint'\n value: string\n}\n\nexport interface NonSerializableValue_RegExp extends NonSerializableValue_Base {\n __type: 'regexp'\n value: { source: string; flags: string }\n}\n\nexport interface NonSerializableValue_Map extends NonSerializableValue_Base {\n __type: 'map'\n value: Array<[unknown, unknown]>\n}\n\nexport interface NonSerializableValue_Set extends NonSerializableValue_Base {\n __type: 'set'\n value: unknown[]\n}\n\nexport interface NonSerializableValue_WeakMap extends NonSerializableValue_Base {\n __type: 'weakmap'\n value: null\n}\n\nexport interface NonSerializableValue_WeakSet extends NonSerializableValue_Base {\n __type: 'weakset'\n value: null\n}\n\nexport interface NonSerializableValue_Date extends NonSerializableValue_Base {\n __type: 'date'\n value: string\n}\n\nexport interface NonSerializableValue_ArrayBuffer extends NonSerializableValue_Base {\n __type: 'arraybuffer'\n value: { byteLength: number }\n}\n\nexport interface NonSerializableValue_TypedArray extends NonSerializableValue_Base {\n __type: 'typedarray'\n value: { arrayType: string; byteLength: number }\n}\n\nexport interface NonSerializableValue_Promise extends NonSerializableValue_Base {\n __type: 'promise'\n value: null\n}\n\nexport interface NonSerializableValue_Error extends NonSerializableValue_Base {\n __type: 'error'\n value: { name: string; message: string; stack?: string }\n}\n\nexport interface NonSerializableValue_Object extends NonSerializableValue_Base {\n __type: 'object'\n value: { constructorName: string; properties: unknown }\n}\n\nexport type NonSerializableValue =\n | NonSerializableValue_Function\n | NonSerializableValue_Symbol\n | NonSerializableValue_BigInt\n | NonSerializableValue_RegExp\n | NonSerializableValue_Map\n | NonSerializableValue_Set\n | NonSerializableValue_WeakMap\n | NonSerializableValue_WeakSet\n | NonSerializableValue_Date\n | NonSerializableValue_ArrayBuffer\n | NonSerializableValue_TypedArray\n | NonSerializableValue_Promise\n | NonSerializableValue_Error\n | NonSerializableValue_Object\n\n// Helper function to recursively serialize values that might contain non-serializable data\nfunction safeSerializeRecursive(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => safeSerializeRecursive(item))\n }\n if (isPlainObject(value)) {\n // Try to serialize with safeSerialize first\n const serialized = safeSerialize(value)\n if (serialized !== value) {\n // It was a non-serializable value, return the serialized version\n return serialized\n }\n // It's a regular object, recursively serialize its properties\n const result: Record<string, unknown> = {}\n for (const [key, val] of Object.entries(value)) {\n result[key] = safeSerializeRecursive(val)\n }\n return result\n }\n return value\n}\n\n// Custom error for serialization issues\nclass SerializationError extends Error {\n constructor(\n message: string,\n public originalError?: unknown,\n ) {\n super(message)\n this.name = 'SerializationError'\n }\n}\n\n// Custom placeholder class for binary data display\nclass BinaryDataPlaceholder {\n constructor(\n public readonly type: string,\n public readonly byteLength: number,\n public readonly arrayType?: string,\n ) {}\n\n toString() {\n if (this.arrayType) {\n return `[${this.arrayType} ${this.byteLength} bytes]`\n }\n return `[${this.type} ${this.byteLength} bytes]`\n }\n}\n\nexport function safeSerialize(value: (...args: unknown[]) => unknown): NonSerializableValue_Function\nexport function safeSerialize(value: symbol): NonSerializableValue_Symbol\nexport function safeSerialize(value: bigint): NonSerializableValue_BigInt\nexport function safeSerialize(value: RegExp): NonSerializableValue_RegExp\nexport function safeSerialize(value: Map<unknown, unknown>): NonSerializableValue_Map\nexport function safeSerialize(value: Set<unknown>): NonSerializableValue_Set\nexport function safeSerialize(value: WeakMap<object, unknown>): NonSerializableValue_WeakMap\nexport function safeSerialize(value: WeakSet<object>): NonSerializableValue_WeakSet\nexport function safeSerialize(value: Date): NonSerializableValue_Date\nexport function safeSerialize(value: ArrayBuffer): NonSerializableValue_ArrayBuffer\nexport function safeSerialize(value: ArrayBufferView): NonSerializableValue_TypedArray\nexport function safeSerialize(value: Promise<unknown>): NonSerializableValue_Promise\nexport function safeSerialize(value: Error): NonSerializableValue_Error\nexport function safeSerialize<T>(value: T): T\nexport function safeSerialize(value: unknown) {\n if (typeof value === 'function') {\n return {\n __custom: '@@pc-non-serializable',\n __type: 'function',\n value: `[Function: ${value.name || 'anonymous'}]`,\n } satisfies NonSerializableValue_Function\n } else if (typeof value === 'symbol') {\n return {\n __custom: '@@pc-non-serializable',\n __type: 'symbol',\n value: value.description || '',\n } satisfies NonSerializableValue_Symbol\n } else if (typeof value === 'bigint') {\n return {\n __custom: '@@pc-non-serializable',\n __type: 'bigint',\n value: String(value),\n } satisfies NonSerializableValue_BigInt\n } else if (value instanceof RegExp) {\n return {\n __custom: '@@pc-non-serializable',\n __type: 'regexp',\n value: { source: value.source, flags: value.flags },\n } satisfies NonSerializableValue_RegExp\n } else if (value instanceof Map) {\n return {\n __custom: '@@pc-non-serializable',\n __type: 'map',\n value: Array.from(value.entries()).map(([k, v]) => [\n safeSerializeRecursive(k),\n safeSerializeRecursive(v),\n ]),\n } satisfies NonSerializableValue_Map\n } else if (value instanceof Set) {\n return {\n __custom: '@@pc-non-serializable',\n __type: 'set',\n value: Array.from(value.values()).map((v) => safeSerializeRecursive(v)),\n } satisfies NonSerializableValue_Set\n } else if (value instanceof WeakMap) {\n return {\n __custom: '@@pc-non-serializable',\n __type: 'weakmap',\n value: null,\n } satisfies NonSerializableValue_WeakMap\n } else if (value instanceof WeakSet) {\n return {\n __custom: '@@pc-non-serializable',\n __type: 'weakset',\n value: null,\n } satisfies NonSerializableValue_WeakSet\n } else if (value instanceof Date) {\n return {\n __custom: '@@pc-non-serializable',\n __type: 'date',\n value: value.toISOString(),\n } satisfies NonSerializableValue_Date\n } else if (value instanceof ArrayBuffer) {\n return {\n __custom: '@@pc-non-serializable',\n __type: 'arraybuffer',\n value: { byteLength: value.byteLength },\n } satisfies NonSerializableValue_ArrayBuffer\n } else if (ArrayBuffer.isView(value)) {\n // Handle TypedArrays and DataView\n const typeName = value.constructor.name\n return {\n __custom: '@@pc-non-serializable',\n __type: 'typedarray',\n value: { arrayType: typeName, byteLength: value.byteLength },\n } satisfies NonSerializableValue_TypedArray\n } else if (value instanceof Promise) {\n return {\n __custom: '@@pc-non-serializable',\n __type: 'promise',\n value: null,\n } satisfies NonSerializableValue_Promise\n } else if (value instanceof Error) {\n return {\n __custom: '@@pc-non-serializable',\n __type: 'error',\n value: {\n name: value.name,\n message: value.message,\n stack: value.stack,\n },\n } satisfies NonSerializableValue_Error\n } else if (\n value &&\n typeof value === 'object' &&\n value.constructor &&\n value.constructor !== Object &&\n value.constructor !== Array\n ) {\n // Handle custom class instances\n const constructorName = value.constructor.name\n // Recursively serialize enumerable properties\n const properties = safeSerializeRecursive({ ...value })\n return {\n __custom: '@@pc-non-serializable',\n __type: 'object',\n value: { constructorName, properties },\n } satisfies NonSerializableValue_Object\n }\n\n // value that cannot be serialized\n return value\n}\n\nexport function isNonSerializableValue(value: unknown): value is NonSerializableValue {\n return (\n !!value &&\n typeof value === 'object' &&\n '__custom' in value &&\n value.__custom === '@@pc-non-serializable' &&\n '__type' in value &&\n typeof value.__type === 'string' &&\n 'value' in value\n )\n}\n\nfunction restoreClonedValue(value: NonSerializableValue) {\n if (value.__type === 'function') {\n return () => {}\n } else if (value.__type === 'symbol') {\n return Symbol(value.value)\n } else if (value.__type === 'bigint') {\n // BigInt() throws an error if the value is not a valid bigint string\n try {\n return BigInt(value.value)\n } catch (err) {\n return new SerializationError(`Invalid bigint value: ${value.value}`, err)\n }\n } else if (value.__type === 'regexp') {\n try {\n const { source, flags } = value.value\n return new RegExp(source, flags)\n } catch (err) {\n return new SerializationError(`Invalid regexp value: ${JSON.stringify(value.value)}`, err)\n }\n } else if (value.__type === 'map') {\n const entries = value.value.map(\n ([k, v]) => [restoreClonedDeep(k), restoreClonedDeep(v)] as const,\n )\n return new Map(entries)\n } else if (value.__type === 'set') {\n const values = value.value.map((v) => restoreClonedDeep(v))\n return new Set(values)\n } else if (value.__type === 'weakmap') {\n return new WeakMap()\n } else if (value.__type === 'weakset') {\n return new WeakSet()\n } else if (value.__type === 'date') {\n try {\n return new Date(value.value)\n } catch (err) {\n return new SerializationError(`Invalid date value: ${value.value}`, err)\n }\n } else if (value.__type === 'arraybuffer') {\n return new BinaryDataPlaceholder('ArrayBuffer', value.value.byteLength)\n } else if (value.__type === 'typedarray') {\n return new BinaryDataPlaceholder('TypedArray', value.value.byteLength, value.value.arrayType)\n } else if (value.__type === 'promise') {\n return Promise.resolve()\n } else if (value.__type === 'error') {\n const error = new Error(value.value.message)\n error.name = value.value.name\n if (value.value.stack) {\n error.stack = value.value.stack\n }\n return error\n } else if (value.__type === 'object') {\n const properties = restoreClonedDeep(value.value.properties)\n return typeof properties === 'object' && properties !== null\n ? { ...properties, __constructorName: value.value.constructorName }\n : { __constructorName: value.value.constructorName }\n }\n // @ts-expect-error: type of value is never\n return new SerializationError(`Unknown non-serializable value type: ${value.__type}`)\n}\n\nexport function restoreClonedDeep<T>(val: T): T\nexport function restoreClonedDeep(val: unknown): unknown {\n if (Array.isArray(val)) {\n return val.map((item) => restoreClonedDeep(item))\n }\n if (isNonSerializableValue(val)) {\n return restoreClonedValue(val)\n }\n if (val && typeof val === 'object' && !isError(val)) {\n return Object.fromEntries(\n Object.entries(val).map(([key, value]) => [key, restoreClonedDeep(value)]),\n )\n }\n return val\n}\n\nexport function isError(err: unknown): err is Error {\n return 'isError' in Error && typeof Error.isError === 'function'\n ? Error.isError(err)\n : err instanceof Error\n}\n","import type {\n DataState,\n EntryKey,\n UseQueryEntryFilter,\n UseMutationEntryFilter,\n} from '@pinia/colada'\nimport type { UseQueryEntryPayload } from '../query-serialized'\nimport type { UseMutationEntryPayload } from '../mutation-serialized'\nimport { toRaw } from 'vue'\nimport { restoreClonedDeep, safeSerialize } from './custom-values'\nimport { isPlainObject } from '../json'\n\nexport { isNonSerializableValue } from './custom-values'\nexport type { NonSerializableValue } from './custom-values'\n\nexport class DuplexChannel<\n const Emits extends Record<EmitsKeys, any[]>,\n const Listens extends Record<ListensKeys, [...any[]]>,\n // TODO: this seems to be enough. Test it\n // const Emits extends Record<keyof Emits, [...any[]]>,\n // const Listens extends Record<keyof Listens, [...any[]]>,\n // NOTE: we need these two to avoid requiring the interface to have an index signature for string\n EmitsKeys extends keyof Emits = keyof Emits,\n ListensKeys extends keyof Listens = keyof Listens,\n> {\n protected listenersByEvent = new Map<keyof Listens, Set<(...args: any[]) => void>>()\n protected eventsController: null | AbortController = null\n\n constructor(protected port: MessagePort) {\n this.setPort(port)\n }\n\n setPort(port: MessagePort) {\n // remove the previous event listeners\n this.eventsController?.abort()\n const { signal } = (this.eventsController = new AbortController())\n this.port = port\n port.addEventListener('message', this.onMessage.bind(this), { signal })\n port.addEventListener('messageerror', this.onMessageError.bind(this), { signal })\n // needed when we call `addEventListener` instead of using `onmessage`\n port.start()\n }\n\n private onMessage(event: MessageEvent) {\n if (!event.data || typeof event.data !== 'object' || typeof event.data.id !== 'string') {\n console.error(`${this.constructor.name}: invalid message`, event.data)\n return\n }\n const listeners = this.listenersByEvent.get(event.data.id)\n if (!listeners) return\n\n const restoredData = restoreClonedDeep(event.data.data as Listens[keyof Listens])\n for (const listener of listeners.values()) {\n listener(...restoredData)\n }\n }\n\n private onMessageError(event: MessageEvent) {\n console.error(`${this.constructor.name}: message error`, event)\n }\n\n stop() {\n this.listenersByEvent.clear()\n this.eventsController?.abort()\n }\n\n emit<K extends keyof Emits>(event: K, ...args: NoInfer<Emits[K]>): void {\n const clonedData = args.map((arg) => toRawDeep(arg))\n this.port.postMessage({ id: event, data: clonedData })\n }\n\n on<K extends keyof Listens>(event: K, callback: (...args: Listens[K]) => void): () => void {\n let listeners = this.listenersByEvent.get(event)\n if (!listeners) {\n this.listenersByEvent.set(event, (listeners = new Set()))\n }\n listeners.add(callback)\n\n return () => {\n this.listenersByEvent.get(event)?.delete(callback)\n }\n }\n\n off<K extends keyof Listens>(event: K): void {\n this.listenersByEvent.delete(event)\n }\n}\n\nexport interface AppEmits {\n 'queries:all': [entries: UseQueryEntryPayload[]]\n 'queries:update': [entry: UseQueryEntryPayload]\n 'queries:delete': [entry: UseQueryEntryPayload]\n 'mutations:all': [entries: UseMutationEntryPayload[]]\n 'mutations:update': [entry: UseMutationEntryPayload]\n 'mutations:delete': [entry: UseMutationEntryPayload]\n}\n\nexport interface DevtoolsEmits {\n 'queries:clear': [] | [filters: UseQueryEntryFilter]\n 'queries:refetch': [entryKey: EntryKey]\n 'queries:invalidate': [entryKey: EntryKey]\n 'queries:reset': [entryKey: EntryKey]\n\n 'queries:simulate:error': [entryKey: EntryKey]\n 'queries:simulate:error:stop': [entryKey: EntryKey]\n 'queries:simulate:loading': [entryKey: EntryKey]\n 'queries:simulate:loading:stop': [entryKey: EntryKey]\n\n 'queries:set:state': [entryKey: EntryKey, state: DataState<unknown, unknown, unknown>]\n\n 'mutations:clear': [] | [filters: UseMutationEntryFilter]\n 'mutations:remove': [id: number]\n\n 'mutations:simulate:error': [id: number]\n 'mutations:simulate:error:stop': [id: number]\n 'mutations:simulate:loading': [id: number]\n 'mutations:simulate:loading:stop': [id: number]\n\n 'mutations:replay': [id: number]\n}\n\nexport function _testTypes() {\n // the app\n const client = new DuplexChannel<AppEmits, DevtoolsEmits>({} as any)\n // the devtools\n const server = new DuplexChannel<DevtoolsEmits, AppEmits>({} as any)\n\n client.emit('queries:all', [])\n // client.emit('queries:all', [{ id: '', active: false, asyncStatus: 'idle', }])\n client.on('queries:clear', () => {})\n client.on('queries:clear', (filters = {}) => {\n console.error('not implemented yet', filters.key)\n // ...\n })\n\n server.emit('queries:clear')\n server.emit('queries:clear', { key: [''] })\n}\n\nfunction toRawDeep<T>(val: T): T\nfunction toRawDeep(val: unknown): unknown {\n if (Array.isArray(val)) {\n return val.map((item) => toRawDeep(item))\n }\n // TODO: custom classes?\n if (isPlainObject(val)) {\n return Object.fromEntries(Object.entries(val).map(([key, value]) => [key, toRawDeep(value)]))\n }\n return safeSerialize(toRaw(val))\n}\n","/**\n * Pinia Colada plugin that counts how many times a query has been fetched, has resolved, rejected, etc.\n *\n */\nimport type { DataState, UseQueryEntry } from '@pinia/colada'\n\nexport const DEVTOOLS_INFO_KEY = Symbol('fetch-count-pinia-colada-plugin')\n\n/**\n * A single entry in the history of a query.\n * @see {UseQueryDevtoolsInfo.history}\n */\nexport interface UseQueryEntryHistoryEntry extends Pick<UseQueryEntry, 'key'> {\n /**\n * The unique ID of the entry in the history\n */\n id: number\n\n /**\n * The state of the entry at this point in time.\n */\n state: DataState<unknown, unknown, unknown>\n\n /**\n * When was the last time the entry was updated.\n */\n updatedAt: number\n\n /**\n * When was the entry created.\n */\n createdAt: number\n\n /**\n * The time it took to fetch the entry.\n */\n fetchTime: {\n start: number\n end: number | null\n } | null\n}\n\n/**\n * Common devtools info for both queries and mutations.\n */\nexport interface EntryDevtoolsInfo {\n /**\n * When was the last time the entry was updated.\n */\n updatedAt: number\n\n /**\n * When was this entry last inactive. 0 if it has never been inactive.\n */\n inactiveAt: number\n\n /**\n * Is this entry simulating an error or loading state.\n */\n simulate: 'error' | 'loading' | null\n}\n\n/**\n * Extended devtools info for queries.\n */\nexport interface UseQueryDevtoolsInfo extends EntryDevtoolsInfo {\n /**\n * How many times has this query been fetched, succeeded, errored, cancelled, etc.\n */\n count: {\n succeed: number\n errored: number\n cancelled: number\n total: number\n }\n\n /**\n * Only the last 10 entries are kept.\n */\n history: UseQueryEntryHistoryEntry[]\n}\n\n/**\n * Extended devtools info for mutations.\n */\nexport interface UseMutationDevtoolsInfo extends EntryDevtoolsInfo {}\n\ndeclare module '@pinia/colada' {\n // eslint-disable-next-line unused-imports/no-unused-vars\n interface UseQueryEntry<TData, TError, TDataInitial> {\n /**\n * Returns whether the query is currently delaying its `asyncStatus` from\n * becoming `'loading'`. Requires the {@link PiniaColadaDelay} plugin.\n */\n [DEVTOOLS_INFO_KEY]: UseQueryDevtoolsInfo\n }\n\n // eslint-disable-next-line unused-imports/no-unused-vars\n interface UseMutationEntry<TData, TVars, TError, TContext> {\n [DEVTOOLS_INFO_KEY]: UseMutationDevtoolsInfo\n }\n}\n"],"names":["miniJsonParse","value","isValidIdentifier","key","serialize","val","obj","k","v","isJSONPrimitive","isJSONValue","isPlainObject","isCollection","formatCollection","size","isObject","formatValue","getValueType","VALUE_TYPE_CSS_CLASS","getValueTypeClass","safeSerializeRecursive","item","serialized","safeSerialize","result","SerializationError","message","originalError","BinaryDataPlaceholder","type","byteLength","arrayType","constructorName","properties","isNonSerializableValue","restoreClonedValue","err","source","flags","entries","restoreClonedDeep","values","error","isError","DuplexChannel","port","signal","event","listeners","restoredData","listener","args","clonedData","arg","toRawDeep","callback","_testTypes","client","server","filters","toRaw","DEVTOOLS_INFO_KEY"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/shared/query-serialized.ts","../src/shared/json.ts","../src/shared/rpc/custom-values.ts","../src/shared/rpc/index.ts","../src/shared/plugins/devtools-info.ts"],"sourcesContent":["import type { RefetchOnControl, UseQueryEntry, UseQueryOptionsWithDefaults } from '@pinia/colada'\nimport type { DEVTOOLS_INFO_KEY } from './plugins/devtools-info'\n\nexport interface UseQueryEntryPayload {\n keyHash: string\n\n key: UseQueryEntry['key']\n state: UseQueryEntry['state']['value']\n asyncStatus: UseQueryEntry['asyncStatus']['value']\n\n active: UseQueryEntry['active']\n stale: UseQueryEntry['stale']\n when: UseQueryEntry['when']\n options: UseQueryEntryPayloadOptions | null\n deps: UseQueryEntryPayloadDep[]\n gcTimeout: number | null\n\n devtools: UseQueryEntry[typeof DEVTOOLS_INFO_KEY]\n}\n\nexport interface UseQueryEntryPayloadDepComponent {\n type: 'component'\n uid: number\n name: string | undefined\n}\n\nexport interface UseQueryEntryPayloadDepEffect {\n type: 'effect'\n active: boolean\n detached: boolean\n}\n\nexport type UseQueryEntryPayloadDep =\n | UseQueryEntryPayloadDepComponent\n | UseQueryEntryPayloadDepEffect\n\nexport interface UseQueryEntryPayloadOptions extends Pick<\n UseQueryOptionsWithDefaults,\n 'gcTime' | 'staleTime'\n> {\n // manually overriden to extract only plain values\n enabled: boolean\n refetchOnMount: RefetchOnControl\n refetchOnReconnect: RefetchOnControl\n refetchOnWindowFocus: RefetchOnControl\n}\n\nexport function miniJsonParse(value: unknown): string {\n const isValidIdentifier = (key: string): boolean => /^[A-Z_$][\\w$]*$/i.test(key)\n\n const serialize = (val: unknown): string => {\n if (val === null) return 'null'\n if (typeof val === 'number') return val.toString()\n if (typeof val === 'string') return JSON.stringify(val)\n if (typeof val === 'boolean') return val ? 'true' : 'false'\n\n if (Array.isArray(val)) {\n return `[${val.map(serialize).join(',')}]`\n }\n\n if (typeof val === 'object') {\n const obj = val as Record<string, unknown>\n const entries = Object.keys(obj).map((key) => {\n const k = isValidIdentifier(key) ? key : JSON.stringify(key)\n const v = serialize(obj[key])\n return `${k}:${v}`\n })\n return `{${entries.join(',')}}`\n }\n\n return 'undefined' // or throw if you prefer to exclude unsupported values\n }\n\n return serialize(value)\n}\n","// NOTE: copied from pinia colada src/utils.ts\n\n/**\n * Valid primitives that can be stringified with `JSON.stringify`.\n *\n * @internal\n */\nexport type JSONPrimitive = string | number | boolean | null | undefined\n\n/**\n * Checks if a value is a valid JSON primitive.\n *\n * @param value - The value to check\n */\nexport function isJSONPrimitive(value: unknown): value is JSONPrimitive {\n return (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n value == null // null or undefined\n )\n}\n\n/**\n * Utility type to represent a flat object that can be stringified with\n * `JSON.stringify` no matter the order of keys.\n *\n * @internal\n */\nexport interface ObjectFlat {\n [key: string]: JSONPrimitive | Array<JSONPrimitive>\n}\n\n/**\n * Valid values that can be stringified with `JSON.stringify`.\n *\n * @internal\n */\nexport type JSONValue = JSONPrimitive | JSONValue[] | { [key: string]: JSONValue }\n\nexport function isJSONValue(value: unknown): value is JSONValue {\n if (isJSONPrimitive(value)) return true\n if (Array.isArray(value)) {\n return value.every(isJSONValue)\n }\n if (isPlainObject(value)) {\n return Object.values(value).every(isJSONValue)\n }\n return false\n}\n\nfunction isCollection(\n value: unknown,\n): value is Iterable<unknown> & ({ length: number } | { size: number }) {\n return (\n value != null &&\n typeof value === 'object' &&\n ('length' in value || 'size' in value) &&\n Symbol.iterator in value\n )\n}\n\nfunction formatCollection(value: { length: number } | { size: number }) {\n const size = 'length' in value ? value.length : value.size\n return `${value.constructor.name}[${size}]`\n}\n\nexport const isObject = (val: unknown): val is Record<any, any> =>\n val !== null && typeof val === 'object'\n\nexport function formatValue(value: unknown) {\n if (value === null) return 'null'\n if (value === undefined) return 'undefined'\n if (typeof value === 'string') return `\"${value}\"`\n if (typeof value === 'bigint') return `${value}n`\n if (typeof value === 'function') return `[Function ${value.name || 'anonymous'}]`\n if (isObject(value)) {\n if (value instanceof Date) return `Date(${value.toISOString()})`\n if (value instanceof RegExp) return value.toString()\n if (value instanceof Error) return `Error(${value.message})`\n if (isCollection(value)) return formatCollection(value)\n if (isPlainObject(value)) return `Object${Object.keys(value).length === 0 ? ' (empty)' : ''}`\n return `[${value.constructor.name}]`\n }\n return String(value)\n}\n\nexport function isPlainObject(value: unknown): value is { constructor?: typeof Object } {\n return isObject(value) && (value.constructor === Object || Object.getPrototypeOf(value) == null)\n}\n\nexport function getValueType(value: unknown) {\n if (value === null) return 'null'\n if (Array.isArray(value)) return 'array'\n if (value instanceof Date) return 'date'\n if (value instanceof RegExp) return 'regexp'\n if (value instanceof Error) return 'error'\n return typeof value\n}\n\nconst VALUE_TYPE_CSS_CLASS = {\n string: 'text-(--devtools-syntax-green)',\n boolean: 'text-(--devtools-syntax-orange)',\n number: 'text-(--devtools-syntax-orange)',\n null: 'text-(--devtools-syntax-purple)',\n undefined: 'text-(--devtools-syntax-purple)',\n array: 'text-(--ui-text)',\n function: 'text-(--ui-text)',\n object: 'text-(--ui-text)',\n symbol: 'text-(--devtools-syntax-orange)',\n bigint: 'text-(--devtools-syntax-sapphire)',\n date: 'text-(--devtools-syntax-sapphire)',\n regexp: 'text-(--devtools-syntax-orange)',\n error: 'text-(--devtools-syntax-red)',\n} satisfies Partial<Record<ReturnType<typeof getValueType>, string>>\n\nexport function getValueTypeClass(value: unknown): string | undefined {\n return VALUE_TYPE_CSS_CLASS[getValueType(value)] || '--ui-text'\n}\n","import { isPlainObject } from '../json'\n\nexport interface NonSerializableValue_Base {\n __custom: '@@pc-non-serializable'\n __type: string\n value: unknown\n}\n\nexport interface NonSerializableValue_Function extends NonSerializableValue_Base {\n __type: 'function'\n value: string\n}\n\nexport interface NonSerializableValue_Symbol extends NonSerializableValue_Base {\n __type: 'symbol'\n value: string\n}\n\nexport interface NonSerializableValue_BigInt extends NonSerializableValue_Base {\n __type: 'bigint'\n value: string\n}\n\nexport interface NonSerializableValue_RegExp extends NonSerializableValue_Base {\n __type: 'regexp'\n value: { source: string; flags: string }\n}\n\nexport interface NonSerializableValue_Map extends NonSerializableValue_Base {\n __type: 'map'\n value: Array<[unknown, unknown]>\n}\n\nexport interface NonSerializableValue_Set extends NonSerializableValue_Base {\n __type: 'set'\n value: unknown[]\n}\n\nexport interface NonSerializableValue_WeakMap extends NonSerializableValue_Base {\n __type: 'weakmap'\n value: null\n}\n\nexport interface NonSerializableValue_WeakSet extends NonSerializableValue_Base {\n __type: 'weakset'\n value: null\n}\n\nexport interface NonSerializableValue_Date extends NonSerializableValue_Base {\n __type: 'date'\n value: string\n}\n\nexport interface NonSerializableValue_ArrayBuffer extends NonSerializableValue_Base {\n __type: 'arraybuffer'\n value: { byteLength: number }\n}\n\nexport interface NonSerializableValue_TypedArray extends NonSerializableValue_Base {\n __type: 'typedarray'\n value: { arrayType: string; byteLength: number }\n}\n\nexport interface NonSerializableValue_Promise extends NonSerializableValue_Base {\n __type: 'promise'\n value: null\n}\n\nexport interface NonSerializableValue_Error extends NonSerializableValue_Base {\n __type: 'error'\n value: { name: string; message: string; stack?: string }\n}\n\nexport interface NonSerializableValue_Object extends NonSerializableValue_Base {\n __type: 'object'\n value: { constructorName: string; properties: unknown }\n}\n\nexport type NonSerializableValue =\n | NonSerializableValue_Function\n | NonSerializableValue_Symbol\n | NonSerializableValue_BigInt\n | NonSerializableValue_RegExp\n | NonSerializableValue_Map\n | NonSerializableValue_Set\n | NonSerializableValue_WeakMap\n | NonSerializableValue_WeakSet\n | NonSerializableValue_Date\n | NonSerializableValue_ArrayBuffer\n | NonSerializableValue_TypedArray\n | NonSerializableValue_Promise\n | NonSerializableValue_Error\n | NonSerializableValue_Object\n\n// Helper function to recursively serialize values that might contain non-serializable data\nfunction safeSerializeRecursive(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => safeSerializeRecursive(item))\n }\n if (isPlainObject(value)) {\n // Try to serialize with safeSerialize first\n const serialized = safeSerialize(value)\n if (serialized !== value) {\n // It was a non-serializable value, return the serialized version\n return serialized\n }\n // It's a regular object, recursively serialize its properties\n const result: Record<string, unknown> = {}\n for (const [key, val] of Object.entries(value)) {\n result[key] = safeSerializeRecursive(val)\n }\n return result\n }\n return value\n}\n\n// Custom error for serialization issues\nclass SerializationError extends Error {\n constructor(\n message: string,\n public originalError?: unknown,\n ) {\n super(message)\n this.name = 'SerializationError'\n }\n}\n\n// Custom placeholder class for binary data display\nclass BinaryDataPlaceholder {\n constructor(\n public readonly type: string,\n public readonly byteLength: number,\n public readonly arrayType?: string,\n ) {}\n\n toString() {\n if (this.arrayType) {\n return `[${this.arrayType} ${this.byteLength} bytes]`\n }\n return `[${this.type} ${this.byteLength} bytes]`\n }\n}\n\nexport function safeSerialize(value: (...args: unknown[]) => unknown): NonSerializableValue_Function\nexport function safeSerialize(value: symbol): NonSerializableValue_Symbol\nexport function safeSerialize(value: bigint): NonSerializableValue_BigInt\nexport function safeSerialize(value: RegExp): NonSerializableValue_RegExp\nexport function safeSerialize(value: Map<unknown, unknown>): NonSerializableValue_Map\nexport function safeSerialize(value: Set<unknown>): NonSerializableValue_Set\nexport function safeSerialize(value: WeakMap<object, unknown>): NonSerializableValue_WeakMap\nexport function safeSerialize(value: WeakSet<object>): NonSerializableValue_WeakSet\nexport function safeSerialize(value: Date): NonSerializableValue_Date\nexport function safeSerialize(value: ArrayBuffer): NonSerializableValue_ArrayBuffer\nexport function safeSerialize(value: ArrayBufferView): NonSerializableValue_TypedArray\nexport function safeSerialize(value: Promise<unknown>): NonSerializableValue_Promise\nexport function safeSerialize(value: Error): NonSerializableValue_Error\nexport function safeSerialize<T>(value: T): T\nexport function safeSerialize(value: unknown) {\n if (typeof value === 'function') {\n return {\n __custom: '@@pc-non-serializable',\n __type: 'function',\n value: `[Function: ${value.name || 'anonymous'}]`,\n } satisfies NonSerializableValue_Function\n } else if (typeof value === 'symbol') {\n return {\n __custom: '@@pc-non-serializable',\n __type: 'symbol',\n value: value.description || '',\n } satisfies NonSerializableValue_Symbol\n } else if (typeof value === 'bigint') {\n return {\n __custom: '@@pc-non-serializable',\n __type: 'bigint',\n value: String(value),\n } satisfies NonSerializableValue_BigInt\n } else if (value instanceof RegExp) {\n return {\n __custom: '@@pc-non-serializable',\n __type: 'regexp',\n value: { source: value.source, flags: value.flags },\n } satisfies NonSerializableValue_RegExp\n } else if (value instanceof Map) {\n return {\n __custom: '@@pc-non-serializable',\n __type: 'map',\n value: Array.from(value.entries()).map(([k, v]) => [\n safeSerializeRecursive(k),\n safeSerializeRecursive(v),\n ]),\n } satisfies NonSerializableValue_Map\n } else if (value instanceof Set) {\n return {\n __custom: '@@pc-non-serializable',\n __type: 'set',\n value: Array.from(value.values()).map((v) => safeSerializeRecursive(v)),\n } satisfies NonSerializableValue_Set\n } else if (value instanceof WeakMap) {\n return {\n __custom: '@@pc-non-serializable',\n __type: 'weakmap',\n value: null,\n } satisfies NonSerializableValue_WeakMap\n } else if (value instanceof WeakSet) {\n return {\n __custom: '@@pc-non-serializable',\n __type: 'weakset',\n value: null,\n } satisfies NonSerializableValue_WeakSet\n } else if (value instanceof Date) {\n return {\n __custom: '@@pc-non-serializable',\n __type: 'date',\n value: value.toISOString(),\n } satisfies NonSerializableValue_Date\n } else if (value instanceof ArrayBuffer) {\n return {\n __custom: '@@pc-non-serializable',\n __type: 'arraybuffer',\n value: { byteLength: value.byteLength },\n } satisfies NonSerializableValue_ArrayBuffer\n } else if (ArrayBuffer.isView(value)) {\n // Handle TypedArrays and DataView\n const typeName = value.constructor.name\n return {\n __custom: '@@pc-non-serializable',\n __type: 'typedarray',\n value: { arrayType: typeName, byteLength: value.byteLength },\n } satisfies NonSerializableValue_TypedArray\n } else if (value instanceof Promise) {\n return {\n __custom: '@@pc-non-serializable',\n __type: 'promise',\n value: null,\n } satisfies NonSerializableValue_Promise\n } else if (value instanceof Error) {\n return {\n __custom: '@@pc-non-serializable',\n __type: 'error',\n value: {\n name: value.name,\n message: value.message,\n stack: value.stack,\n },\n } satisfies NonSerializableValue_Error\n } else if (\n value &&\n typeof value === 'object' &&\n value.constructor &&\n value.constructor !== Object &&\n value.constructor !== Array\n ) {\n // Handle custom class instances\n const constructorName = value.constructor.name\n // Recursively serialize enumerable properties\n const properties = safeSerializeRecursive({ ...value })\n return {\n __custom: '@@pc-non-serializable',\n __type: 'object',\n value: { constructorName, properties },\n } satisfies NonSerializableValue_Object\n }\n\n // value that cannot be serialized\n return value\n}\n\nexport function isNonSerializableValue(value: unknown): value is NonSerializableValue {\n return (\n !!value &&\n typeof value === 'object' &&\n '__custom' in value &&\n value.__custom === '@@pc-non-serializable' &&\n '__type' in value &&\n typeof value.__type === 'string' &&\n 'value' in value\n )\n}\n\nfunction restoreClonedValue(value: NonSerializableValue) {\n if (value.__type === 'function') {\n return () => {}\n } else if (value.__type === 'symbol') {\n return Symbol(value.value)\n } else if (value.__type === 'bigint') {\n // BigInt() throws an error if the value is not a valid bigint string\n try {\n return BigInt(value.value)\n } catch (err) {\n return new SerializationError(`Invalid bigint value: ${value.value}`, err)\n }\n } else if (value.__type === 'regexp') {\n try {\n const { source, flags } = value.value\n return new RegExp(source, flags)\n } catch (err) {\n return new SerializationError(`Invalid regexp value: ${JSON.stringify(value.value)}`, err)\n }\n } else if (value.__type === 'map') {\n const entries = value.value.map(\n ([k, v]) => [restoreClonedDeep(k), restoreClonedDeep(v)] as const,\n )\n return new Map(entries)\n } else if (value.__type === 'set') {\n const values = value.value.map((v) => restoreClonedDeep(v))\n return new Set(values)\n } else if (value.__type === 'weakmap') {\n return new WeakMap()\n } else if (value.__type === 'weakset') {\n return new WeakSet()\n } else if (value.__type === 'date') {\n try {\n return new Date(value.value)\n } catch (err) {\n return new SerializationError(`Invalid date value: ${value.value}`, err)\n }\n } else if (value.__type === 'arraybuffer') {\n return new BinaryDataPlaceholder('ArrayBuffer', value.value.byteLength)\n } else if (value.__type === 'typedarray') {\n return new BinaryDataPlaceholder('TypedArray', value.value.byteLength, value.value.arrayType)\n } else if (value.__type === 'promise') {\n return Promise.resolve()\n } else if (value.__type === 'error') {\n const error = new Error(value.value.message)\n error.name = value.value.name\n if (value.value.stack) {\n error.stack = value.value.stack\n }\n return error\n } else if (value.__type === 'object') {\n const properties = restoreClonedDeep(value.value.properties)\n return typeof properties === 'object' && properties !== null\n ? { ...properties, __constructorName: value.value.constructorName }\n : { __constructorName: value.value.constructorName }\n }\n // @ts-expect-error: type of value is never\n return new SerializationError(`Unknown non-serializable value type: ${value.__type}`)\n}\n\nexport function restoreClonedDeep<T>(val: T): T\nexport function restoreClonedDeep(val: unknown): unknown {\n if (Array.isArray(val)) {\n return val.map((item) => restoreClonedDeep(item))\n }\n if (isNonSerializableValue(val)) {\n return restoreClonedValue(val)\n }\n if (val && typeof val === 'object' && !isError(val)) {\n return Object.fromEntries(\n Object.entries(val).map(([key, value]) => [key, restoreClonedDeep(value)]),\n )\n }\n return val\n}\n\nexport function isError(err: unknown): err is Error {\n return 'isError' in Error && typeof Error.isError === 'function'\n ? Error.isError(err)\n : err instanceof Error\n}\n","import type {\n DataState,\n EntryKey,\n UseQueryEntryFilter,\n UseMutationEntryFilter,\n} from '@pinia/colada'\nimport type { UseQueryEntryPayload } from '../query-serialized'\nimport type { UseMutationEntryPayload } from '../mutation-serialized'\nimport { toRaw } from 'vue'\nimport { restoreClonedDeep, safeSerialize } from './custom-values'\nimport { isPlainObject } from '../json'\n\nexport { isNonSerializableValue } from './custom-values'\nexport type { NonSerializableValue } from './custom-values'\n\nexport class DuplexChannel<\n const Emits extends Record<EmitsKeys, any[]>,\n const Listens extends Record<ListensKeys, [...any[]]>,\n // TODO: this seems to be enough. Test it\n // const Emits extends Record<keyof Emits, [...any[]]>,\n // const Listens extends Record<keyof Listens, [...any[]]>,\n // NOTE: we need these two to avoid requiring the interface to have an index signature for string\n EmitsKeys extends keyof Emits = keyof Emits,\n ListensKeys extends keyof Listens = keyof Listens,\n> {\n protected listenersByEvent = new Map<keyof Listens, Set<(...args: any[]) => void>>()\n protected eventsController: null | AbortController = null\n\n constructor(protected port: MessagePort) {\n this.setPort(port)\n }\n\n setPort(port: MessagePort) {\n // remove the previous event listeners\n this.eventsController?.abort()\n const { signal } = (this.eventsController = new AbortController())\n this.port = port\n port.addEventListener('message', this.onMessage.bind(this), { signal })\n port.addEventListener('messageerror', this.onMessageError.bind(this), { signal })\n // needed when we call `addEventListener` instead of using `onmessage`\n port.start()\n }\n\n private onMessage(event: MessageEvent) {\n if (!event.data || typeof event.data !== 'object' || typeof event.data.id !== 'string') {\n console.error(`${this.constructor.name}: invalid message`, event.data)\n return\n }\n const listeners = this.listenersByEvent.get(event.data.id)\n if (!listeners) return\n\n const restoredData = restoreClonedDeep(event.data.data as Listens[keyof Listens])\n for (const listener of listeners.values()) {\n listener(...restoredData)\n }\n }\n\n private onMessageError(event: MessageEvent) {\n console.error(`${this.constructor.name}: message error`, event)\n }\n\n stop() {\n this.listenersByEvent.clear()\n this.eventsController?.abort()\n }\n\n emit<K extends keyof Emits>(event: K, ...args: NoInfer<Emits[K]>): void {\n const clonedData = args.map((arg) => toRawDeep(arg))\n this.port.postMessage({ id: event, data: clonedData })\n }\n\n on<K extends keyof Listens>(event: K, callback: (...args: Listens[K]) => void): () => void {\n let listeners = this.listenersByEvent.get(event)\n if (!listeners) {\n this.listenersByEvent.set(event, (listeners = new Set()))\n }\n listeners.add(callback)\n\n return () => {\n this.listenersByEvent.get(event)?.delete(callback)\n }\n }\n\n off<K extends keyof Listens>(event: K): void {\n this.listenersByEvent.delete(event)\n }\n}\n\nexport interface AppEmits {\n 'queries:all': [entries: UseQueryEntryPayload[]]\n 'queries:update': [entry: UseQueryEntryPayload]\n 'queries:delete': [entry: UseQueryEntryPayload]\n 'mutations:all': [entries: UseMutationEntryPayload[]]\n 'mutations:update': [entry: UseMutationEntryPayload]\n 'mutations:delete': [entry: UseMutationEntryPayload]\n}\n\nexport interface DevtoolsEmits {\n 'queries:clear': [] | [filters: UseQueryEntryFilter]\n 'queries:refetch': [entryKey: EntryKey]\n 'queries:invalidate': [entryKey: EntryKey]\n 'queries:reset': [entryKey: EntryKey]\n\n 'queries:simulate:error': [entryKey: EntryKey]\n 'queries:simulate:error:stop': [entryKey: EntryKey]\n 'queries:simulate:loading': [entryKey: EntryKey]\n 'queries:simulate:loading:stop': [entryKey: EntryKey]\n\n 'queries:set:state': [entryKey: EntryKey, state: DataState<unknown, unknown, unknown>]\n\n 'mutations:clear': [] | [filters: UseMutationEntryFilter]\n 'mutations:remove': [id: number]\n\n 'mutations:simulate:error': [id: number]\n 'mutations:simulate:error:stop': [id: number]\n 'mutations:simulate:loading': [id: number]\n 'mutations:simulate:loading:stop': [id: number]\n\n 'mutations:replay': [id: number]\n}\n\nexport function _testTypes() {\n // the app\n const client = new DuplexChannel<AppEmits, DevtoolsEmits>({} as any)\n // the devtools\n const server = new DuplexChannel<DevtoolsEmits, AppEmits>({} as any)\n\n client.emit('queries:all', [])\n // client.emit('queries:all', [{ id: '', active: false, asyncStatus: 'idle', }])\n client.on('queries:clear', () => {})\n client.on('queries:clear', (filters = {}) => {\n console.error('not implemented yet', filters.key)\n // ...\n })\n\n server.emit('queries:clear')\n server.emit('queries:clear', { key: [''] })\n}\n\nfunction toRawDeep<T>(val: T): T\nfunction toRawDeep(val: unknown): unknown {\n if (Array.isArray(val)) {\n return val.map((item) => toRawDeep(item))\n }\n // TODO: custom classes?\n if (isPlainObject(val)) {\n return Object.fromEntries(Object.entries(val).map(([key, value]) => [key, toRawDeep(value)]))\n }\n return safeSerialize(toRaw(val))\n}\n","/**\n * Pinia Colada plugin that counts how many times a query has been fetched, has resolved, rejected, etc.\n *\n */\nimport type { DataState, UseQueryEntry } from '@pinia/colada'\n\nexport const DEVTOOLS_INFO_KEY = Symbol('fetch-count-pinia-colada-plugin')\n\n/**\n * A single entry in the history of a query.\n * @see {UseQueryDevtoolsInfo.history}\n */\nexport interface UseQueryEntryHistoryEntry extends Pick<UseQueryEntry, 'key'> {\n /**\n * The unique ID of the entry in the history\n */\n id: number\n\n /**\n * The state of the entry at this point in time.\n */\n state: DataState<unknown, unknown, unknown>\n\n /**\n * When was the last time the entry was updated.\n */\n updatedAt: number\n\n /**\n * When was the entry created.\n */\n createdAt: number\n\n /**\n * The time it took to fetch the entry.\n */\n fetchTime: {\n start: number\n end: number | null\n } | null\n}\n\n/**\n * Common devtools info for both queries and mutations.\n */\nexport interface EntryDevtoolsInfo {\n /**\n * When was the last time the entry was updated.\n */\n updatedAt: number\n\n /**\n * When was this entry last inactive. 0 if it has never been inactive.\n */\n inactiveAt: number\n\n /**\n * Is this entry simulating an error or loading state.\n */\n simulate: 'error' | 'loading' | null\n}\n\n/**\n * Extended devtools info for queries.\n */\nexport interface UseQueryDevtoolsInfo extends EntryDevtoolsInfo {\n /**\n * How many times has this query been fetched, succeeded, errored, cancelled, etc.\n */\n count: {\n succeed: number\n errored: number\n cancelled: number\n total: number\n }\n\n /**\n * Only the last 10 entries are kept.\n */\n history: UseQueryEntryHistoryEntry[]\n}\n\n/**\n * Extended devtools info for mutations.\n */\nexport interface UseMutationDevtoolsInfo extends EntryDevtoolsInfo {}\n\ndeclare module '@pinia/colada' {\n // eslint-disable-next-line unused-imports/no-unused-vars\n interface UseQueryEntry<TData, TError, TDataInitial> {\n /**\n * Returns whether the query is currently delaying its `asyncStatus` from\n * becoming `'loading'`. Requires the {@link PiniaColadaDelay} plugin.\n */\n [DEVTOOLS_INFO_KEY]: UseQueryDevtoolsInfo\n }\n\n // eslint-disable-next-line unused-imports/no-unused-vars\n interface UseMutationEntry<TData, TVars, TError, TContext> {\n [DEVTOOLS_INFO_KEY]: UseMutationDevtoolsInfo\n }\n}\n"],"names":["miniJsonParse","value","isValidIdentifier","key","serialize","val","obj","k","v","isJSONPrimitive","isJSONValue","isPlainObject","isCollection","formatCollection","size","isObject","formatValue","getValueType","VALUE_TYPE_CSS_CLASS","getValueTypeClass","safeSerializeRecursive","item","serialized","safeSerialize","result","SerializationError","message","originalError","BinaryDataPlaceholder","type","byteLength","arrayType","constructorName","properties","isNonSerializableValue","restoreClonedValue","err","source","flags","entries","restoreClonedDeep","values","error","isError","DuplexChannel","port","signal","event","listeners","restoredData","listener","args","clonedData","arg","toRawDeep","callback","_testTypes","client","server","filters","toRaw","DEVTOOLS_INFO_KEY"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pinia/colada-devtools",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.3.0",
|
|
5
5
|
"description": "Devtools for Pinia Colada",
|
|
6
6
|
"publishConfig": {
|
|
7
7
|
"access": "public"
|
|
@@ -43,21 +43,21 @@
|
|
|
43
43
|
"dist-shared"
|
|
44
44
|
],
|
|
45
45
|
"devDependencies": {
|
|
46
|
-
"@iconify-json/lucide": "^1.2.
|
|
46
|
+
"@iconify-json/lucide": "^1.2.81",
|
|
47
47
|
"@posva/splitpanes": "^4.0.6",
|
|
48
|
-
"@tailwindcss/vite": "^4.1.
|
|
48
|
+
"@tailwindcss/vite": "^4.1.18",
|
|
49
49
|
"@vueuse/core": "^14.1.0",
|
|
50
50
|
"mande": "^2.0.9",
|
|
51
51
|
"match-container": "^0.1.0",
|
|
52
52
|
"pinia": "^3.0.4",
|
|
53
|
-
"tailwindcss": "^4.1.
|
|
53
|
+
"tailwindcss": "^4.1.18",
|
|
54
54
|
"unplugin-icons": "^22.5.0",
|
|
55
55
|
"unplugin-vue-components": "^30.0.0",
|
|
56
56
|
"unplugin-vue-router": "^0.19.0",
|
|
57
57
|
"vite-plugin-dts": "^4.5.4",
|
|
58
58
|
"vue": "^3.5.25",
|
|
59
59
|
"vue-router": "^4.5.1",
|
|
60
|
-
"vue-tsc": "^3.1.
|
|
60
|
+
"vue-tsc": "^3.1.8",
|
|
61
61
|
"@pinia/colada": "0.19.1"
|
|
62
62
|
},
|
|
63
63
|
"scripts": {
|
|
@@ -1,307 +0,0 @@
|
|
|
1
|
-
import { _ as L } from "./mouse-pointer-click-CR81e5yZ.js";
|
|
2
|
-
import { I as q, _ as G, a as H, b as J, c as P, d as X, e as K, f as Q, g as Y } from "./circle-x-CRJfYoJo.js";
|
|
3
|
-
import { m as V, c as u, o as a, a as o, d as Z, k as ee, b as te, s as oe, j as se, v as M, p as w, F as N, i as s, w as l, g as n, x as b, q as p, y as ne, u as ae, f as C, t as f, z as ie, A as le, e as x, B as ue } from "./index-CEuAAFs8.js";
|
|
4
|
-
import { _ as re, a as de } from "./loader-CiXOT2XE.js";
|
|
5
|
-
const pe = {
|
|
6
|
-
viewBox: "0 0 24 24",
|
|
7
|
-
width: "1.2em",
|
|
8
|
-
height: "1.2em"
|
|
9
|
-
};
|
|
10
|
-
function me(I, m) {
|
|
11
|
-
return a(), u("svg", pe, [...m[0] || (m[0] = [
|
|
12
|
-
o("g", {
|
|
13
|
-
fill: "none",
|
|
14
|
-
stroke: "currentColor",
|
|
15
|
-
"stroke-linecap": "round",
|
|
16
|
-
"stroke-linejoin": "round",
|
|
17
|
-
"stroke-width": "2"
|
|
18
|
-
}, [
|
|
19
|
-
o("path", { d: "m2 9l3-3l3 3" }),
|
|
20
|
-
o("path", { d: "M13 18H7a2 2 0 0 1-2-2V6m17 9l-3 3l-3-3" }),
|
|
21
|
-
o("path", { d: "M11 6h6a2 2 0 0 1 2 2v10" })
|
|
22
|
-
], -1)
|
|
23
|
-
])]);
|
|
24
|
-
}
|
|
25
|
-
const ce = V({ name: "lucide-repeat2", render: me }), _e = {
|
|
26
|
-
viewBox: "0 0 24 24",
|
|
27
|
-
width: "1.2em",
|
|
28
|
-
height: "1.2em"
|
|
29
|
-
};
|
|
30
|
-
function ve(I, m) {
|
|
31
|
-
return a(), u("svg", _e, [...m[0] || (m[0] = [
|
|
32
|
-
o("path", {
|
|
33
|
-
fill: "none",
|
|
34
|
-
stroke: "currentColor",
|
|
35
|
-
"stroke-linecap": "round",
|
|
36
|
-
"stroke-linejoin": "round",
|
|
37
|
-
"stroke-width": "2",
|
|
38
|
-
d: "M8 21s-4-3-4-9s4-9 4-9m8 0s4 3 4 9s-4 9-4 9M15 9l-6 6m0-6l6 6"
|
|
39
|
-
}, null, -1)
|
|
40
|
-
])]);
|
|
41
|
-
}
|
|
42
|
-
const fe = V({ name: "lucide-variable", render: ve }), ge = { class: "flex flex-col divide-y dark:divide-(--ui-border) divide-(--ui-border-accented)" }, ke = { class: "py-1 text-sm" }, xe = { class: "grid grid-cols-[auto_1fr] gap-1" }, ye = { class: "rounded bg-neutral-500/20 p-0.5" }, he = { class: "grid grid-cols-[auto_1fr] gap-1" }, we = { class: "flex items-center gap-1.5" }, be = { class: "rounded p-0.5 bg-neutral-500/20" }, Ce = {
|
|
43
|
-
key: 0,
|
|
44
|
-
class: "text-xs text-(--ui-text-muted) italic cursor-help",
|
|
45
|
-
title: "This mutation was created without a custom key"
|
|
46
|
-
}, Ie = {
|
|
47
|
-
class: "grid grid-cols-[auto_1fr] gap-x-2",
|
|
48
|
-
title: "When was the mutation last updated"
|
|
49
|
-
}, Se = { class: "font-bold" }, $e = {
|
|
50
|
-
key: 0,
|
|
51
|
-
class: "grid grid-cols-[auto_1fr] gap-x-2",
|
|
52
|
-
title: "When is this mutation entry garbage collected"
|
|
53
|
-
}, Re = { class: "font-bold" }, Be = { class: "py-2 gap-2 flex flex-wrap items-center justify-items-start" }, Te = { class: "py-1" }, Me = {
|
|
54
|
-
key: 0,
|
|
55
|
-
class: "rounded p-1 overflow-auto max-h-[1200px]"
|
|
56
|
-
}, Ne = {
|
|
57
|
-
key: 1,
|
|
58
|
-
class: "text-neutral-500/50"
|
|
59
|
-
}, Ve = { class: "py-1" }, Oe = {
|
|
60
|
-
key: 0,
|
|
61
|
-
class: "rounded bg-neutral-500/20 p-1 overflow-auto max-h-[1200px]"
|
|
62
|
-
}, ze = { key: 1 }, Ae = {
|
|
63
|
-
key: 1,
|
|
64
|
-
class: "py-6 mx-auto"
|
|
65
|
-
}, De = { class: "flex flex-col text-center items-center gap-2 text-lg px-2" }, We = /* @__PURE__ */ Z({
|
|
66
|
-
__name: "[mutationId]",
|
|
67
|
-
setup(I) {
|
|
68
|
-
const m = ne(), O = ae(), k = ee(), t = te(() => {
|
|
69
|
-
const i = m.params.mutationId;
|
|
70
|
-
return k.value.find((e) => e.id === Number(i)) ?? null;
|
|
71
|
-
}), S = {
|
|
72
|
-
showSecond: !0,
|
|
73
|
-
rounding: "floor",
|
|
74
|
-
max: 1e3 * 60 * 60 * 24
|
|
75
|
-
// 1 day
|
|
76
|
-
}, z = ie(() => t.value?.devtools.updatedAt ?? 0, {
|
|
77
|
-
...S,
|
|
78
|
-
updateInterval: 3e3
|
|
79
|
-
}), _ = oe();
|
|
80
|
-
let y = !1;
|
|
81
|
-
const A = se(0);
|
|
82
|
-
function D(i) {
|
|
83
|
-
A.value = k.value.length, y = !0, _.emit("mutations:replay", i);
|
|
84
|
-
}
|
|
85
|
-
M(
|
|
86
|
-
() => k.value,
|
|
87
|
-
() => {
|
|
88
|
-
if (y) {
|
|
89
|
-
const i = k.value.toSorted((e, d) => d.id - e.id)[0];
|
|
90
|
-
i && O.push({
|
|
91
|
-
name: "/mutations/[mutationId]",
|
|
92
|
-
params: { mutationId: i.id }
|
|
93
|
-
}), y = !1;
|
|
94
|
-
}
|
|
95
|
-
},
|
|
96
|
-
{
|
|
97
|
-
deep: !0
|
|
98
|
-
}
|
|
99
|
-
);
|
|
100
|
-
const c = w("pc:mutation:details:data:open", !1, {}), h = w("pc:mutation:details:vars:open", !0, {});
|
|
101
|
-
let $ = c.value, R = null;
|
|
102
|
-
const g = w("pc:mutation:details:error:open", !1, {});
|
|
103
|
-
return M(
|
|
104
|
-
() => t.value?.state,
|
|
105
|
-
(i) => {
|
|
106
|
-
!i || R === i.status || (R = i.status, i.status === "error" ? (g.value = !0, $ = c.value, c.value = !1) : i.status === "success" && (c.value = $, g.value = !1));
|
|
107
|
-
}
|
|
108
|
-
), (i, e) => {
|
|
109
|
-
const d = G, B = re, v = ue, E = de, U = K, j = ce, F = Q, T = Y, W = L;
|
|
110
|
-
return a(), u("div", ge, [
|
|
111
|
-
t.value ? (a(), u(N, { key: 0 }, [
|
|
112
|
-
s(d, {
|
|
113
|
-
title: "Details",
|
|
114
|
-
icon: n(q)
|
|
115
|
-
}, {
|
|
116
|
-
default: l(() => [
|
|
117
|
-
o("div", ke, [
|
|
118
|
-
o("p", xe, [
|
|
119
|
-
e[9] || (e[9] = o("span", null, "id:", -1)),
|
|
120
|
-
o("span", null, [
|
|
121
|
-
o("code", ye, f(t.value.id), 1)
|
|
122
|
-
])
|
|
123
|
-
]),
|
|
124
|
-
o("p", he, [
|
|
125
|
-
e[10] || (e[10] = o("span", null, "key:", -1)),
|
|
126
|
-
o("span", we, [
|
|
127
|
-
o("code", be, f(t.value.key ?? "undefined"), 1),
|
|
128
|
-
t.value.key ? C("", !0) : (a(), u("span", Ce, " (anonymous) "))
|
|
129
|
-
])
|
|
130
|
-
]),
|
|
131
|
-
o("p", Ie, [
|
|
132
|
-
e[11] || (e[11] = o("span", null, "Last update:", -1)),
|
|
133
|
-
o("span", Se, f(n(z)), 1)
|
|
134
|
-
]),
|
|
135
|
-
!t.value.active && t.value.options ? (a(), u("p", $e, [
|
|
136
|
-
typeof t.value.options.gcTime == "number" && Number.isFinite(t.value.options.gcTime) ? (a(), u(N, { key: 0 }, [
|
|
137
|
-
e[12] || (e[12] = o("span", null, [
|
|
138
|
-
p("Will be "),
|
|
139
|
-
o("i", null, "gced")
|
|
140
|
-
], -1)),
|
|
141
|
-
o("span", Re, f(n(le)(
|
|
142
|
-
new Date(t.value.devtools.inactiveAt + t.value.options.gcTime),
|
|
143
|
-
{
|
|
144
|
-
...S,
|
|
145
|
-
max: void 0
|
|
146
|
-
}
|
|
147
|
-
)), 1)
|
|
148
|
-
], 64)) : C("", !0)
|
|
149
|
-
])) : C("", !0)
|
|
150
|
-
])
|
|
151
|
-
]),
|
|
152
|
-
_: 1
|
|
153
|
-
}, 8, ["icon"]),
|
|
154
|
-
s(d, {
|
|
155
|
-
title: "Actions",
|
|
156
|
-
icon: n(H)
|
|
157
|
-
}, {
|
|
158
|
-
default: l(() => [
|
|
159
|
-
o("div", Be, [
|
|
160
|
-
t.value.devtools.simulate !== "loading" ? (a(), x(v, {
|
|
161
|
-
key: 0,
|
|
162
|
-
class: "theme-purple",
|
|
163
|
-
size: "sm",
|
|
164
|
-
title: "Simulate a loading state",
|
|
165
|
-
onClick: e[0] || (e[0] = (r) => n(_).emit("mutations:simulate:loading", t.value.id))
|
|
166
|
-
}, {
|
|
167
|
-
default: l(() => [
|
|
168
|
-
s(B),
|
|
169
|
-
e[13] || (e[13] = p(" Simulate loading ", -1))
|
|
170
|
-
]),
|
|
171
|
-
_: 1
|
|
172
|
-
})) : (a(), x(v, {
|
|
173
|
-
key: 1,
|
|
174
|
-
class: "theme-purple",
|
|
175
|
-
size: "sm",
|
|
176
|
-
title: "Stop simulating loading state",
|
|
177
|
-
onClick: e[1] || (e[1] = (r) => n(_).emit("mutations:simulate:loading:stop", t.value.id))
|
|
178
|
-
}, {
|
|
179
|
-
default: l(() => [
|
|
180
|
-
s(B, { class: "animate-spin" }),
|
|
181
|
-
e[14] || (e[14] = p(" Stop loading ", -1))
|
|
182
|
-
]),
|
|
183
|
-
_: 1
|
|
184
|
-
})),
|
|
185
|
-
t.value.devtools.simulate !== "error" ? (a(), x(v, {
|
|
186
|
-
key: 2,
|
|
187
|
-
class: "theme-error",
|
|
188
|
-
size: "sm",
|
|
189
|
-
title: "Simulate an Error state",
|
|
190
|
-
onClick: e[2] || (e[2] = (r) => n(_).emit("mutations:simulate:error", t.value.id))
|
|
191
|
-
}, {
|
|
192
|
-
default: l(() => [
|
|
193
|
-
s(E),
|
|
194
|
-
e[15] || (e[15] = p(" Simulate error ", -1))
|
|
195
|
-
]),
|
|
196
|
-
_: 1
|
|
197
|
-
})) : (a(), x(v, {
|
|
198
|
-
key: 3,
|
|
199
|
-
class: "theme-error",
|
|
200
|
-
size: "sm",
|
|
201
|
-
title: "Restore the previous state",
|
|
202
|
-
onClick: e[3] || (e[3] = (r) => n(_).emit("mutations:simulate:error:stop", t.value.id))
|
|
203
|
-
}, {
|
|
204
|
-
default: l(() => [
|
|
205
|
-
s(U),
|
|
206
|
-
e[16] || (e[16] = p(" Remove error ", -1))
|
|
207
|
-
]),
|
|
208
|
-
_: 1
|
|
209
|
-
})),
|
|
210
|
-
s(v, {
|
|
211
|
-
class: "theme-success",
|
|
212
|
-
size: "sm",
|
|
213
|
-
title: "Re-trigger this mutation with the same variables",
|
|
214
|
-
onClick: e[4] || (e[4] = (r) => D(t.value.id))
|
|
215
|
-
}, {
|
|
216
|
-
default: l(() => [
|
|
217
|
-
s(j),
|
|
218
|
-
e[17] || (e[17] = p(" Replay ", -1))
|
|
219
|
-
]),
|
|
220
|
-
_: 1
|
|
221
|
-
}),
|
|
222
|
-
s(v, {
|
|
223
|
-
class: "theme-warning",
|
|
224
|
-
size: "sm",
|
|
225
|
-
title: "Remove this mutation from the cache",
|
|
226
|
-
onClick: e[5] || (e[5] = (r) => n(_).emit("mutations:remove", t.value.id))
|
|
227
|
-
}, {
|
|
228
|
-
default: l(() => [
|
|
229
|
-
s(F),
|
|
230
|
-
e[18] || (e[18] = p(" Remove ", -1))
|
|
231
|
-
]),
|
|
232
|
-
_: 1
|
|
233
|
-
})
|
|
234
|
-
])
|
|
235
|
-
]),
|
|
236
|
-
_: 1
|
|
237
|
-
}, 8, ["icon"]),
|
|
238
|
-
s(d, {
|
|
239
|
-
open: n(h),
|
|
240
|
-
"onUpdate:open": e[6] || (e[6] = (r) => b(h) ? h.value = r : null),
|
|
241
|
-
title: "Variables",
|
|
242
|
-
icon: n(fe),
|
|
243
|
-
class: "font-mono",
|
|
244
|
-
"no-padding": ""
|
|
245
|
-
}, {
|
|
246
|
-
default: l(() => [
|
|
247
|
-
s(T, {
|
|
248
|
-
data: t.value.vars,
|
|
249
|
-
readonly: ""
|
|
250
|
-
}, null, 8, ["data"])
|
|
251
|
-
]),
|
|
252
|
-
_: 1
|
|
253
|
-
}, 8, ["open", "icon"]),
|
|
254
|
-
s(d, {
|
|
255
|
-
open: n(c),
|
|
256
|
-
"onUpdate:open": e[7] || (e[7] = (r) => b(c) ? c.value = r : null),
|
|
257
|
-
title: "Data",
|
|
258
|
-
icon: n(J),
|
|
259
|
-
class: "font-mono",
|
|
260
|
-
"no-padding": ""
|
|
261
|
-
}, {
|
|
262
|
-
default: l(() => [
|
|
263
|
-
s(T, {
|
|
264
|
-
data: t.value.state.data
|
|
265
|
-
}, null, 8, ["data"])
|
|
266
|
-
]),
|
|
267
|
-
_: 1
|
|
268
|
-
}, 8, ["open", "icon"]),
|
|
269
|
-
s(d, {
|
|
270
|
-
open: n(g),
|
|
271
|
-
"onUpdate:open": e[8] || (e[8] = (r) => b(g) ? g.value = r : null),
|
|
272
|
-
title: `Error${t.value.state.status === "error" ? " (!)" : ""}`,
|
|
273
|
-
icon: n(P)
|
|
274
|
-
}, {
|
|
275
|
-
default: l(() => [
|
|
276
|
-
o("div", Te, [
|
|
277
|
-
t.value.state.error ? (a(), u("pre", Me, f(t.value.state.error), 1)) : (a(), u("p", Ne, "No error"))
|
|
278
|
-
])
|
|
279
|
-
]),
|
|
280
|
-
_: 1
|
|
281
|
-
}, 8, ["open", "title", "icon"]),
|
|
282
|
-
s(d, {
|
|
283
|
-
title: "Options",
|
|
284
|
-
open: !1,
|
|
285
|
-
icon: n(X)
|
|
286
|
-
}, {
|
|
287
|
-
default: l(() => [
|
|
288
|
-
o("div", Ve, [
|
|
289
|
-
t.value.options ? (a(), u("pre", Oe, f(t.value.options), 1)) : (a(), u("p", ze, "No options configured for this mutation."))
|
|
290
|
-
])
|
|
291
|
-
]),
|
|
292
|
-
_: 1
|
|
293
|
-
}, 8, ["icon"])
|
|
294
|
-
], 64)) : (a(), u("div", Ae, [
|
|
295
|
-
o("p", De, [
|
|
296
|
-
e[19] || (e[19] = p(" Select a Mutation to inspect ", -1)),
|
|
297
|
-
s(W)
|
|
298
|
-
])
|
|
299
|
-
]))
|
|
300
|
-
]);
|
|
301
|
-
};
|
|
302
|
-
}
|
|
303
|
-
});
|
|
304
|
-
export {
|
|
305
|
-
We as default
|
|
306
|
-
};
|
|
307
|
-
//# sourceMappingURL=_mutationId_-BfpMyZn5.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_mutationId_-BfpMyZn5.js","sources":["../src/panel/pages/mutations/[mutationId].vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { UseMutationEntryPayload } from '@pinia/colada-devtools/shared'\nimport { computed, ref, watch } from 'vue'\nimport { useDuplexChannel, useMutationEntries } from '../../composables/duplex-channel'\nimport { useRoute, useRouter } from 'vue-router'\nimport type { DataStateStatus } from '@pinia/colada'\n\nimport IWrench from '~icons/lucide/wrench'\nimport IInfoCircle from '~icons/lucide/info'\nimport IFileText from '~icons/lucide/file-text'\nimport ICircleX from '~icons/lucide/circle-x'\nimport IBraces from '~icons/lucide/braces'\nimport IVariable from '~icons/lucide/variable'\nimport { useTimeAgo, useLocalStorage, formatTimeAgo } from '@vueuse/core'\nimport type { FormatTimeAgoOptions } from '@vueuse/core'\n\nconst route = useRoute()\nconst router = useRouter()\nconst mutations = useMutationEntries()\n\nconst selectedMutation = computed<UseMutationEntryPayload | null>(() => {\n const mutationId = route.params.mutationId\n return mutations.value.find((entry) => entry.id === Number(mutationId)) ?? null\n})\n\nconst TIME_AGO_OPTIONS: FormatTimeAgoOptions = {\n showSecond: true,\n rounding: 'floor',\n max: 1000 * 60 * 60 * 24, // 1 day\n}\n\nconst lastUpdate = useTimeAgo(() => selectedMutation.value?.devtools.updatedAt ?? 0, {\n ...TIME_AGO_OPTIONS,\n updateInterval: 3000,\n})\n\nconst channel = useDuplexChannel()\n\n// Track when we're replaying to auto-navigate to new mutation\nlet justReplayed = false\nconst mutationCountBeforeReplay = ref(0)\n\nfunction replayMutation(id: UseMutationEntryPayload['id']) {\n // Track state before replay\n mutationCountBeforeReplay.value = mutations.value.length\n justReplayed = true\n\n // Emit the replay event\n channel.emit('mutations:replay', id)\n}\n\n// FIXME: we should move this logic up and auto detect replays maybe with some linking\n// isReplayOf: mutationId\n// and we can display this in the interface too\nwatch(\n () => mutations.value,\n () => {\n if (justReplayed) {\n // Find the latest id\n const newest = mutations.value.toSorted((a, b) => b.id - a.id)[0]\n\n if (newest) {\n router.push({\n name: '/mutations/[mutationId]',\n params: { mutationId: newest.id },\n })\n }\n\n justReplayed = false\n }\n },\n {\n deep: true,\n },\n)\n\nconst isDataOpen = useLocalStorage<boolean>('pc:mutation:details:data:open', false, {})\nconst isVarsOpen = useLocalStorage<boolean>('pc:mutation:details:vars:open', true, {})\nlet wasDataOpen = isDataOpen.value\nlet lastStatus: DataStateStatus | null = null\nconst isErrorOpen = useLocalStorage<boolean>('pc:mutation:details:error:open', false, {})\n\nwatch(\n () => selectedMutation.value?.state,\n (state) => {\n if (!state || lastStatus === state.status) return\n lastStatus = state.status\n if (state.status === 'error') {\n isErrorOpen.value = true\n wasDataOpen = isDataOpen.value\n isDataOpen.value = false\n } else if (state.status === 'success') {\n isDataOpen.value = wasDataOpen\n isErrorOpen.value = false\n }\n },\n)\n</script>\n\n<template>\n <div class=\"flex flex-col divide-y dark:divide-(--ui-border) divide-(--ui-border-accented)\">\n <template v-if=\"selectedMutation\">\n <UCollapse title=\"Details\" :icon=\"IInfoCircle\">\n <div class=\"py-1 text-sm\">\n <p class=\"grid grid-cols-[auto_1fr] gap-1\">\n <span>id:</span>\n <span>\n <code class=\"rounded bg-neutral-500/20 p-0.5\">{{ selectedMutation.id }}</code>\n </span>\n </p>\n\n <p class=\"grid grid-cols-[auto_1fr] gap-1\">\n <span>key:</span>\n <span class=\"flex items-center gap-1.5\">\n <code class=\"rounded p-0.5 bg-neutral-500/20\">\n {{ selectedMutation.key ?? 'undefined' }}\n </code>\n <span\n v-if=\"!selectedMutation.key\"\n class=\"text-xs text-(--ui-text-muted) italic cursor-help\"\n title=\"This mutation was created without a custom key\"\n >\n (anonymous)\n </span>\n </span>\n </p>\n\n <p class=\"grid grid-cols-[auto_1fr] gap-x-2\" title=\"When was the mutation last updated\">\n <span>Last update:</span>\n <span class=\"font-bold\">{{ lastUpdate }}</span>\n </p>\n\n <p\n v-if=\"!selectedMutation.active && selectedMutation.options\"\n class=\"grid grid-cols-[auto_1fr] gap-x-2\"\n title=\"When is this mutation entry garbage collected\"\n >\n <template\n v-if=\"\n typeof selectedMutation.options.gcTime === 'number' &&\n Number.isFinite(selectedMutation.options.gcTime)\n \"\n >\n <span>Will be <i>gced</i></span>\n <span class=\"font-bold\">{{\n formatTimeAgo(\n new Date(selectedMutation.devtools.inactiveAt + selectedMutation.options.gcTime),\n {\n ...TIME_AGO_OPTIONS,\n max: undefined,\n },\n )\n }}</span>\n </template>\n </p>\n </div>\n </UCollapse>\n\n <UCollapse title=\"Actions\" :icon=\"IWrench\">\n <div class=\"py-2 gap-2 flex flex-wrap items-center justify-items-start\">\n <UButton\n v-if=\"selectedMutation.devtools.simulate !== 'loading'\"\n class=\"theme-purple\"\n size=\"sm\"\n title=\"Simulate a loading state\"\n @click=\"channel.emit('mutations:simulate:loading', selectedMutation.id)\"\n >\n <i-lucide-loader />\n Simulate loading\n </UButton>\n <UButton\n v-else\n class=\"theme-purple\"\n size=\"sm\"\n title=\"Stop simulating loading state\"\n @click=\"channel.emit('mutations:simulate:loading:stop', selectedMutation.id)\"\n >\n <i-lucide-loader class=\"animate-spin\" />\n Stop loading\n </UButton>\n\n <UButton\n v-if=\"selectedMutation.devtools.simulate !== 'error'\"\n class=\"theme-error\"\n size=\"sm\"\n title=\"Simulate an Error state\"\n @click=\"channel.emit('mutations:simulate:error', selectedMutation.id)\"\n >\n <i-lucide-x-octagon /> Simulate error\n </UButton>\n <UButton\n v-else\n class=\"theme-error\"\n size=\"sm\"\n title=\"Restore the previous state\"\n @click=\"channel.emit('mutations:simulate:error:stop', selectedMutation.id)\"\n >\n <i-lucide-rotate-ccw /> Remove error\n </UButton>\n\n <UButton\n class=\"theme-success\"\n size=\"sm\"\n title=\"Re-trigger this mutation with the same variables\"\n @click=\"replayMutation(selectedMutation.id)\"\n >\n <i-lucide-repeat-2 />\n Replay\n </UButton>\n\n <UButton\n class=\"theme-warning\"\n size=\"sm\"\n title=\"Remove this mutation from the cache\"\n @click=\"channel.emit('mutations:remove', selectedMutation.id)\"\n >\n <i-lucide-trash /> Remove\n </UButton>\n </div>\n </UCollapse>\n\n <UCollapse\n v-model:open=\"isVarsOpen\"\n title=\"Variables\"\n :icon=\"IVariable\"\n class=\"font-mono\"\n no-padding\n >\n <JsonViewer :data=\"selectedMutation.vars\" readonly />\n </UCollapse>\n\n <UCollapse\n v-model:open=\"isDataOpen\"\n title=\"Data\"\n :icon=\"IFileText\"\n class=\"font-mono\"\n no-padding\n >\n <JsonViewer :data=\"selectedMutation.state.data\" />\n </UCollapse>\n\n <UCollapse\n v-model:open=\"isErrorOpen\"\n :title=\"`Error${selectedMutation.state.status === 'error' ? ' (!)' : ''}`\"\n :icon=\"ICircleX\"\n >\n <div class=\"py-1\">\n <pre\n v-if=\"selectedMutation.state.error\"\n class=\"rounded p-1 overflow-auto max-h-[1200px]\"\n >{{ selectedMutation.state.error }}</pre\n >\n <p v-else class=\"text-neutral-500/50\">No error</p>\n </div>\n </UCollapse>\n\n <UCollapse title=\"Options\" :open=\"false\" :icon=\"IBraces\">\n <div class=\"py-1\">\n <pre\n v-if=\"selectedMutation.options\"\n class=\"rounded bg-neutral-500/20 p-1 overflow-auto max-h-[1200px]\"\n >{{ selectedMutation.options }}</pre\n >\n <p v-else>No options configured for this mutation.</p>\n </div>\n </UCollapse>\n </template>\n\n <template v-else>\n <div class=\"py-6 mx-auto\">\n <p class=\"flex flex-col text-center items-center gap-2 text-lg px-2\">\n Select a Mutation to inspect\n <i-lucide-mouse-pointer-click />\n </p>\n </div>\n </template>\n </div>\n</template>\n"],"names":["route","useRoute","router","useRouter","mutations","useMutationEntries","selectedMutation","computed","mutationId","entry","TIME_AGO_OPTIONS","lastUpdate","useTimeAgo","channel","useDuplexChannel","justReplayed","mutationCountBeforeReplay","ref","replayMutation","id","watch","newest","a","b","isDataOpen","useLocalStorage","isVarsOpen","wasDataOpen","lastStatus","isErrorOpen","state","_openBlock","_createElementBlock","_hoisted_1","_Fragment","_createVNode","_component_UCollapse","_unref","IInfoCircle","_createElementVNode","_hoisted_2","_hoisted_3","_cache","_hoisted_4","_toDisplayString","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","formatTimeAgo","IWrench","_hoisted_13","_createBlock","_component_UButton","_component_i_lucide_loader","_component_i_lucide_x_octagon","_component_i_lucide_rotate_ccw","$event","_component_i_lucide_repeat_2","_component_i_lucide_trash","IVariable","_component_JsonViewer","IFileText","ICircleX","_hoisted_14","_hoisted_15","_hoisted_16","IBraces","_hoisted_17","_hoisted_18","_hoisted_20","_hoisted_21","_component_i_lucide_mouse_pointer_click"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_queryId_-deTdMujv.js","sources":["../src/panel/utils/time.ts","../src/panel/pages/queries/[queryId].vue"],"sourcesContent":["export function formatDuration(timeInMs: number): string {\n if (timeInMs < 1000) {\n return `${Math.round(timeInMs)} ms`\n }\n\n const seconds = timeInMs / 1000\n if (timeInMs < 10_000) {\n return `${seconds.toFixed(3)} seconds`\n }\n\n if (timeInMs < 60_000) {\n return `${Math.floor(seconds)} seconds`\n }\n\n const minutes = Math.floor(seconds / 60)\n\n if (timeInMs < 3_600_000) {\n return `${minutes} minute${minutes > 1 ? 's' : ''}`\n }\n\n const hours = Math.floor(minutes / 60)\n\n return `${hours}h${minutes % 60}m${seconds % 60}s`\n}\n","<script setup lang=\"ts\">\nimport type { UseQueryEntryPayload } from '@pinia/colada-devtools/shared'\nimport { computed, watch } from 'vue'\nimport { useDuplexChannel, useQueryEntries } from '../../composables/duplex-channel'\nimport { formatDuration } from '../../utils/time'\nimport { useRoute } from 'vue-router'\nimport type { DataStateStatus } from '@pinia/colada'\n\nimport IWrench from '~icons/lucide/wrench'\nimport IInfoCircle from '~icons/lucide/info'\nimport IFileText from '~icons/lucide/file-text'\nimport ICircleX from '~icons/lucide/circle-x'\nimport IBraces from '~icons/lucide/braces'\nimport IHistory from '~icons/lucide/history'\nimport ISigmaSquare from '~icons/lucide/sigma-square'\nimport { useTimeAgo, formatTimeAgo, useLocalStorage } from '@vueuse/core'\nimport type { FormatTimeAgoOptions } from '@vueuse/core'\n\nconst route = useRoute()\nconst queries = useQueryEntries()\n\nconst selectedQuery = computed<UseQueryEntryPayload | null>(() => {\n return queries.value.find((entry) => entry.keyHash === route.params.queryId) ?? null\n})\n\nconst serializedHistoryEntries = computed(() => {\n return (\n selectedQuery.value?.devtools.history.map((entry) => {\n let value: string\n try {\n value = JSON.stringify(entry, null, 2)\n } catch (error) {\n value = `Error serializing entry: ${String(error)}`\n }\n return {\n ...entry,\n data: value,\n }\n }) ?? []\n )\n})\n\nconst TIME_AGO_OPTIONS: FormatTimeAgoOptions = {\n showSecond: true,\n rounding: 'floor',\n max: 1000 * 60 * 60 * 24, // 1 day\n}\n\nconst lastUpdate = useTimeAgo(() => selectedQuery.value?.devtools.updatedAt ?? 0, {\n ...TIME_AGO_OPTIONS,\n updateInterval: 3000,\n})\n\n// TODO: we should be able to highlight components using this query\n// const el = useTemplateRef('me')\n// TODO: add ref=\"me\" to the div\n// watch(\n// // also trigger if the selectedQuery changes\n// () => [el.value, selectedQuery.value?.id] as const,\n// ([el]) => {\n// if (!el || !selectedQuery.value) return\n//\n// const observingComponents = findVueComponents(\n// el,\n// selectedQuery.value.deps.filter((c) => c.type === 'component').map((c) => c.uid) ?? [],\n// )\n//\n// console.log('elements', observingComponents)\n// },\n// )\n\nconst channel = useDuplexChannel()\n\nconst isDataOpen = useLocalStorage<boolean>('pc:query:details:data:open', false, {})\nlet wasDataOpen = isDataOpen.value\nlet lastStatus: DataStateStatus | null = null\nconst isErrorOpen = useLocalStorage<boolean>('pc:query:details:error:open', false, {})\nwatch(\n () => selectedQuery.value?.state,\n (state) => {\n if (!state || lastStatus === state.status) return\n lastStatus = state.status\n if (state.status === 'error') {\n isErrorOpen.value = true\n // preserve it for later\n wasDataOpen = isDataOpen.value\n isDataOpen.value = false\n } else if (state.status === 'success') {\n isDataOpen.value = wasDataOpen\n isErrorOpen.value = false\n }\n },\n)\n\n// Helper function to set nested value\nfunction setNestedValue(obj: any, path: Array<string | number>, value: unknown): boolean {\n if (path.length === 0) {\n console.error('Cannot set value with empty path')\n return false\n }\n\n let current = obj\n // Navigate to parent of target value\n for (let i = 0; i < path.length - 1; i++) {\n if (current == null || typeof current !== 'object') {\n console.error('Invalid path:', path, 'at index', i, 'Current value:', current)\n return false\n }\n current = current[path[i]!]\n }\n\n // Validate the final parent exists\n if (current == null || typeof current !== 'object') {\n console.error('Invalid final parent in path:', path)\n return false\n }\n\n // Set the final value\n current[path.at(-1)!] = value\n return true\n}\n\n// Handle value updates from JsonViewer\nconst handleValueUpdate = (path: Array<string | number>, value: unknown) => {\n if (!selectedQuery.value) return\n\n // Update the value at the path\n const success = setNestedValue(selectedQuery.value.state.data, path, value)\n\n if (!success) {\n console.error('Failed to update value at path:', path)\n return\n }\n\n // Send to app via RPC\n channel.emit('queries:set:state', selectedQuery.value.key, selectedQuery.value.state)\n}\n</script>\n\n<template>\n <div class=\"flex flex-col divide-y dark:divide-(--ui-border) divide-(--ui-border-accented)\">\n <template v-if=\"selectedQuery\">\n <UCollapse title=\"Details\" :icon=\"IInfoCircle\">\n <div class=\"py-1 text-sm\">\n <p class=\"grid grid-cols-[auto_1fr] gap-1\">\n <span>key:</span>\n <span>\n <code class=\"rounded bg-neutral-500/20 p-0.5\">{{ selectedQuery.key }}</code>\n </span>\n </p>\n\n <p\n class=\"grid grid-cols-[auto_1fr] gap-x-2\"\n title=\"When was the query entry last updated\"\n >\n <span>Last update:</span>\n <span class=\"font-bold\">{{ lastUpdate }}</span>\n </p>\n\n <p\n v-if=\"selectedQuery.devtools.history.at(0)?.fetchTime\"\n class=\"grid grid-cols-[auto_1fr] gap-x-2\"\n title=\"When was the last time the query was fetched\"\n >\n <span>Last fetch:</span>\n <span class=\"font-bold\">{{\n formatTimeAgo(new Date(selectedQuery.devtools.history.at(0)!.fetchTime!.start), {\n ...TIME_AGO_OPTIONS,\n max: undefined,\n })\n }}</span>\n </p>\n\n <p\n v-if=\"selectedQuery.devtools.history.at(0)?.fetchTime?.end\"\n class=\"grid grid-cols-[auto_1fr] gap-x-2\"\n title=\"How long did the last query take to fetch\"\n >\n <span>Fetch duration:</span>\n <span class=\"font-bold\">{{\n formatDuration(\n selectedQuery.devtools.history.at(0)!.fetchTime!.end! -\n selectedQuery.devtools.history.at(0)!.fetchTime!.start,\n )\n }}</span>\n </p>\n\n <p\n class=\"grid grid-cols-[auto_1fr] gap-x-2\"\n title=\"How many components and effects are using this query\"\n >\n <span\n >Observers: <span class=\"font-bold\">{{ selectedQuery.deps.length }}</span></span\n >\n </p>\n\n <p\n v-if=\"!selectedQuery.active && selectedQuery.options\"\n class=\"grid grid-cols-[auto_1fr] gap-x-2\"\n title=\"When is this query entry garbace collected\"\n >\n <template\n v-if=\"\n typeof selectedQuery.options.gcTime === 'number' &&\n Number.isFinite(selectedQuery.options.gcTime)\n \"\n >\n <span>Will be <i>gced</i></span>\n <span class=\"font-bold\">{{\n formatTimeAgo(\n new Date(selectedQuery.devtools.inactiveAt + selectedQuery.options.gcTime),\n {\n ...TIME_AGO_OPTIONS,\n max: undefined,\n },\n )\n }}</span>\n </template>\n </p>\n </div>\n </UCollapse>\n\n <UCollapse title=\"Actions\" :icon=\"IWrench\">\n <div class=\"py-2 gap-2 flex flex-wrap items-center justify-items-start\">\n <UButton\n class=\"theme-info\"\n size=\"sm\"\n title=\"Refetch this query\"\n :disabled=\"selectedQuery.options?.enabled === false\"\n @click=\"channel.emit('queries:refetch', selectedQuery.key)\"\n >\n <i-lucide-refresh-cw class=\"size-3.5\" /> Refetch\n </UButton>\n\n <UButton\n class=\"theme-neutral\"\n size=\"sm\"\n title=\"Invalidate this query\"\n @click=\"channel.emit('queries:invalidate', selectedQuery.key)\"\n >\n <i-lucide-timer-reset /> Invalidate\n </UButton>\n\n <UButton\n v-if=\"selectedQuery.devtools.simulate !== 'loading'\"\n class=\"theme-purple\"\n size=\"sm\"\n title=\"Restore the previous state\"\n @click=\"channel.emit('queries:simulate:loading', selectedQuery.key)\"\n >\n <i-lucide-loader />\n Simulate loading\n </UButton>\n <UButton\n v-else\n class=\"theme-purple\"\n size=\"sm\"\n title=\"Simulate a loading state\"\n @click=\"channel.emit('queries:simulate:loading:stop', selectedQuery.key)\"\n >\n <i-lucide-loader class=\"animate-spin\" />\n Stop loading\n </UButton>\n\n <UButton\n v-if=\"selectedQuery.devtools.simulate !== 'error'\"\n class=\"theme-error\"\n size=\"sm\"\n title=\"Simulate an Error state\"\n @click=\"channel.emit('queries:simulate:error', selectedQuery.key)\"\n >\n <i-lucide-x-octagon /> Simulate error\n </UButton>\n <UButton\n v-else\n class=\"theme-error\"\n size=\"sm\"\n title=\"Restore the previous state\"\n @click=\"channel.emit('queries:simulate:error:stop', selectedQuery.key)\"\n >\n <i-lucide-rotate-ccw /> Remove error\n </UButton>\n\n <UButton\n class=\"theme-warning\"\n size=\"sm\"\n title=\"Reset this query to its initial (pending) state\"\n @click=\"channel.emit('queries:reset', selectedQuery.key)\"\n >\n <i-lucide-trash /> Reset\n </UButton>\n </div>\n </UCollapse>\n\n <UCollapse\n v-model:open=\"isDataOpen\"\n title=\"Data\"\n :icon=\"IFileText\"\n class=\"font-mono\"\n no-padding\n >\n <JsonViewer :data=\"selectedQuery.state.data\" @update:value=\"handleValueUpdate\" />\n </UCollapse>\n\n <UCollapse\n v-model:open=\"isErrorOpen\"\n :title=\"`Error${selectedQuery.state.status === 'error' ? ' (!)' : ''}`\"\n :icon=\"ICircleX\"\n >\n <div class=\"py-1\">\n <pre v-if=\"selectedQuery.state.error\" class=\"rounded p-1 overflow-auto max-h-[1200px]\">{{\n selectedQuery.state.error\n }}</pre>\n <p v-else class=\"text-neutral-500/50\">No error</p>\n </div>\n </UCollapse>\n\n <UCollapse title=\"Call count\" :icon=\"ISigmaSquare\" :open=\"false\">\n <div class=\"py-1\">\n <p class=\"grid grid-cols-[auto_1fr] gap-1\">\n <span>Calls:</span>\n <span>\n <code class=\"font-bold\">{{ selectedQuery.devtools.count.total }}</code>\n </span>\n <span>Success:</span>\n <span>\n <code class=\"font-bold\">{{ selectedQuery.devtools.count.succeed }}</code>\n </span>\n <span>Errors:</span>\n <span>\n <code class=\"font-bold\">{{ selectedQuery.devtools.count.errored }}</code>\n </span>\n <span>Cancelled:</span>\n <span>\n <code class=\"font-bold\">{{ selectedQuery.devtools.count.cancelled }}</code>\n </span>\n </p>\n </div>\n </UCollapse>\n\n <UCollapse\n :title=\"`History (${selectedQuery.devtools.history.length})`\"\n :icon=\"IHistory\"\n :open=\"false\"\n >\n <div class=\"py-1\">\n <UCollapse\n v-for=\"entry of serializedHistoryEntries\"\n :key=\"entry.updatedAt\"\n :title=\"`Entry nº${entry.id} (${formatTimeAgo(new Date(entry.updatedAt), TIME_AGO_OPTIONS)})`\"\n :open=\"false\"\n >\n <pre class=\"rounded p-1 overflow-auto max-h-[1200px]\">{{ entry.data }}</pre>\n </UCollapse>\n </div>\n </UCollapse>\n\n <UCollapse title=\"Options\" :open=\"false\" :icon=\"IBraces\">\n <div class=\"py-1\">\n <pre\n v-if=\"selectedQuery.options\"\n class=\"rounded bg-neutral-500/20 p-1 overflow-auto max-h-[1200px]\"\n >{{ selectedQuery.options }}</pre\n >\n <p v-else>\n This Query entry has no options. It might have been created from the server or manually\n set with\n <code>queryCache.setQueryData()</code> for prefetching.\n </p>\n </div>\n </UCollapse>\n </template>\n\n <template v-else>\n <div class=\"py-6 mx-auto\">\n <p class=\"flex flex-col text-center items-center gap-2 text-lg px-2\">\n Select a Query to inspect\n <i-lucide-mouse-pointer-click />\n </p>\n <p class=\"text-center text-sm text-neutral-500 mt-4\">\n No query with key {{ route.params.queryId }} was found in the cache\n </p>\n </div>\n </template>\n </div>\n</template>\n"],"names":["formatDuration","timeInMs","seconds","minutes","route","useRoute","queries","useQueryEntries","selectedQuery","computed","entry","serializedHistoryEntries","value","error","TIME_AGO_OPTIONS","lastUpdate","useTimeAgo","channel","useDuplexChannel","isDataOpen","useLocalStorage","wasDataOpen","lastStatus","isErrorOpen","watch","state","setNestedValue","obj","path","current","i","handleValueUpdate","_openBlock","_createElementBlock","_hoisted_1","_Fragment","_createVNode","_component_UCollapse","_unref","IInfoCircle","_createElementVNode","_hoisted_2","_hoisted_3","_cache","_hoisted_4","_toDisplayString","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","formatTimeAgo","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","IWrench","_hoisted_15","_component_UButton","_component_i_lucide_refresh_cw","_component_i_lucide_timer_reset","_createBlock","_component_i_lucide_loader","_component_i_lucide_x_octagon","_component_i_lucide_rotate_ccw","_component_i_lucide_trash","$event","IFileText","_component_JsonViewer","ICircleX","_hoisted_16","_hoisted_17","_hoisted_18","ISigmaSquare","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","IHistory","_hoisted_25","_renderList","_hoisted_26","IBraces","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_component_i_lucide_mouse_pointer_click","_hoisted_32"],"mappings":"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"}
|