From 9314966cf1ef713023995a8620b6f1c9446f3e13 Mon Sep 17 00:00:00 2001 From: Fan Pei Date: Sun, 21 Jan 2024 22:47:57 +0900 Subject: [PATCH 1/7] feat: Add token replacer --- .../src/core/component/state/util.ts | 35 +++++++++++++------ packages/devtools-kit/src/shared/util.ts | 7 +--- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/packages/devtools-kit/src/core/component/state/util.ts b/packages/devtools-kit/src/core/component/state/util.ts index 26bcad8d..bc20bb1f 100644 --- a/packages/devtools-kit/src/core/component/state/util.ts +++ b/packages/devtools-kit/src/core/component/state/util.ts @@ -1,23 +1,38 @@ import { ESC, INFINITY, NAN, NEGATIVE_INFINITY, UNDEFINED, fnTypeRE } from './constants' import { isComputed, isPlainObject, isPrimitive, isReactive, isReadOnly, isRef } from './is' +export const tokenMap = { + [UNDEFINED]: 'undefined', + [NAN]: 'NaN', + [INFINITY]: 'Infinity', + [NEGATIVE_INFINITY]: '-Infinity', +} as const + +export const reversedTokenMap = Object.entries(tokenMap).reduce((acc, [key, value]) => { + acc[value] = key + return acc +}, {}) + export function internalStateTokenToString(value: unknown) { if (value === null) return 'null' - else if (value === UNDEFINED) - return 'undefined' - - else if (value === NAN) - return 'NaN' + return tokenMap[value as string] || false +} - else if (value === INFINITY) - return 'Infinity' +export function replaceTokenToString(value: string) { + const replaceRegex = new RegExp(`"(${Object.keys(tokenMap).join('|')})"`, 'g') + return value.replace(replaceRegex, (_, g1) => tokenMap[g1]) +} - else if (value === NEGATIVE_INFINITY) - return '-Infinity' +export function replaceStringToToken(value: string) { + const literalValue = reversedTokenMap[value.trim()] + if (literalValue) + return `"${literalValue}"` - return false + // Match the token in value field and replace it with the literal value. + const replaceRegex = new RegExp(`:\\s*(${Object.keys(reversedTokenMap).join('|')})`, 'g') + return value.replace(replaceRegex, (_, g1) => `:"${reversedTokenMap[g1]}"`) } /** diff --git a/packages/devtools-kit/src/shared/util.ts b/packages/devtools-kit/src/shared/util.ts index efbe736f..a67a672c 100644 --- a/packages/devtools-kit/src/shared/util.ts +++ b/packages/devtools-kit/src/shared/util.ts @@ -1,4 +1,3 @@ -import { formatInspectorStateValue, getInspectorStateValueType, getRawValue } from '../core/component/state/format' import { stringifyReplacer } from '../core/component/state/replacer' import { reviver } from '../core/component/state/reviver' import { parseCircularAutoChunks, stringifyCircularAutoChunks } from './transfer' @@ -16,8 +15,4 @@ export function parse(data: string, revive = false) { : parseCircularAutoChunks(data) } -export { - formatInspectorStateValue, - getInspectorStateValueType, - getRawValue, -} +export * from '../core/component/state/format' From 32ef1d0e2a668e0fbe5c4cf8e0b7c0501e271143 Mon Sep 17 00:00:00 2001 From: Fan Pei Date: Sun, 21 Jan 2024 22:51:23 +0900 Subject: [PATCH 2/7] fix: Add toSubmit/toEdit formatter --- .../devtools-kit/src/core/component/state/editor.ts | 5 ++--- .../devtools-kit/src/core/component/state/format.ts | 11 ++++++++++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/devtools-kit/src/core/component/state/editor.ts b/packages/devtools-kit/src/core/component/state/editor.ts index 9b028f82..0816647b 100644 --- a/packages/devtools-kit/src/core/component/state/editor.ts +++ b/packages/devtools-kit/src/core/component/state/editor.ts @@ -96,9 +96,8 @@ class RefStateEditor { else { // if is reactive, then it must be object // to prevent loss reactivity, we should assign key by key - const obj = JSON.parse(value) const previousKeys = Object.keys(ref) - const currentKeys = Object.keys(obj) + const currentKeys = Object.keys(value) // we should check the key diffs, if previous key is the longer // then remove the needless keys // @TODO: performance optimization @@ -107,7 +106,7 @@ class RefStateEditor { diffKeys.forEach(key => Reflect.deleteProperty(ref, key)) } currentKeys.forEach((key) => { - Reflect.set(ref, key, Reflect.get(obj, key)) + Reflect.set(ref, key, Reflect.get(value, key)) }) } } diff --git a/packages/devtools-kit/src/core/component/state/format.ts b/packages/devtools-kit/src/core/component/state/format.ts index 64decff4..86dd96df 100644 --- a/packages/devtools-kit/src/core/component/state/format.ts +++ b/packages/devtools-kit/src/core/component/state/format.ts @@ -1,7 +1,8 @@ import { InspectorCustomState, InspectorState } from '../types' import { INFINITY, NAN, NEGATIVE_INFINITY, UNDEFINED, rawTypeRE, specialTypeRE } from './constants' import { isPlainObject } from './is' -import { escape, internalStateTokenToString } from './util' +import { escape, internalStateTokenToString, replaceStringToToken, replaceTokenToString } from './util' +import { reviver } from './reviver' export function getInspectorStateValueType(value, raw = true) { const type = typeof value @@ -104,3 +105,11 @@ export function getRawValue(value: InspectorState['value']) { return { value, inherit } } + +export function toEdit(value: unknown) { + return replaceTokenToString(JSON.stringify(value)) +} + +export function toSubmit(value: string) { + return JSON.parse(replaceStringToToken(value), reviver) +} From b6f6f6919fe2b296bb6ae662d0d802e824b8d42c Mon Sep 17 00:00:00 2001 From: Fan Pei Date: Sun, 21 Jan 2024 22:51:54 +0900 Subject: [PATCH 3/7] fix: Fix input edit --- .../src/components/inspector/InspectorStateField.vue | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/client/src/components/inspector/InspectorStateField.vue b/packages/client/src/components/inspector/InspectorStateField.vue index 2c6cf863..5e044ccc 100644 --- a/packages/client/src/components/inspector/InspectorStateField.vue +++ b/packages/client/src/components/inspector/InspectorStateField.vue @@ -1,7 +1,7 @@