modern-json-react 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +243 -0
- package/dist/index.d.mts +440 -0
- package/dist/index.d.ts +440 -0
- package/dist/index.js +1691 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1670 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Toolbar/Toolbar.tsx","../src/components/CodeEditor/CodeEditor.tsx","../src/components/TreeEditor/TreeNode.tsx","../src/core/path.ts","../src/components/TreeEditor/TreeEditor.tsx","../src/components/StatusBar/StatusBar.tsx","../src/core/parser.ts","../src/core/validator.ts","../src/hooks/useJsonParser.ts","../src/hooks/useUndoRedo.ts","../src/hooks/useSearch.ts","../src/core/formatter.ts","../src/themes/light.ts","../src/themes/dark.ts","../src/JsonEditor.tsx"],"names":["jsxs","jsx","useCallback","segment","useState","useMemo","Fragment","useRef","useEffect"],"mappings":"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","file":"index.mjs","sourcesContent":["import React from 'react';\nimport type { EditorMode } from '../../types/editor';\n\nexport interface ToolbarProps {\n mode: EditorMode;\n onModeChange: (mode: EditorMode) => void;\n canUndo: boolean;\n canRedo: boolean;\n onUndo: () => void;\n onRedo: () => void;\n onFormat: () => void;\n searchable: boolean;\n isSearchOpen: boolean;\n onToggleSearch: () => void;\n readOnly: boolean;\n className?: string;\n}\n\nconst MODE_OPTIONS: { value: EditorMode; label: string }[] = [\n { value: 'code', label: 'Code' },\n { value: 'tree', label: 'Tree' },\n { value: 'split', label: 'Split' },\n];\n\nexport const Toolbar: React.FC<ToolbarProps> = ({\n mode,\n onModeChange,\n canUndo,\n canRedo,\n onUndo,\n onRedo,\n onFormat,\n searchable,\n isSearchOpen,\n onToggleSearch,\n readOnly,\n className = '',\n}) => {\n return (\n <div className={`mjr-toolbar ${className}`} role=\"toolbar\" aria-label=\"Editor controls\">\n {/* Mode Switcher */}\n <div className=\"mjr-toolbar__modes\" role=\"tablist\" aria-label=\"Editor mode\">\n {MODE_OPTIONS.map(({ value, label }) => (\n <button\n key={value}\n role=\"tab\"\n aria-selected={mode === value}\n className={`mjr-toolbar__mode-btn ${mode === value ? 'mjr-toolbar__mode-btn--active' : ''}`}\n onClick={() => onModeChange(value)}\n >\n {label}\n </button>\n ))}\n </div>\n\n <div className=\"mjr-toolbar__separator\" aria-hidden=\"true\" />\n\n {/* Search Toggle */}\n {searchable && (\n <button\n className={`mjr-toolbar__btn ${isSearchOpen ? 'mjr-toolbar__btn--active' : ''}`}\n onClick={onToggleSearch}\n aria-label=\"Toggle search\"\n aria-pressed={isSearchOpen}\n title=\"Search (Ctrl+F)\"\n >\n 🔍\n </button>\n )}\n\n <div className=\"mjr-toolbar__separator\" aria-hidden=\"true\" />\n\n {/* Undo / Redo */}\n {!readOnly && (\n <>\n <button\n className=\"mjr-toolbar__btn\"\n onClick={onUndo}\n disabled={!canUndo}\n aria-label=\"Undo\"\n title=\"Undo (Ctrl+Z)\"\n >\n ↶\n </button>\n <button\n className=\"mjr-toolbar__btn\"\n onClick={onRedo}\n disabled={!canRedo}\n aria-label=\"Redo\"\n title=\"Redo (Ctrl+Shift+Z)\"\n >\n ↷\n </button>\n </>\n )}\n\n {/* Format */}\n {!readOnly && (\n <button\n className=\"mjr-toolbar__btn\"\n onClick={onFormat}\n aria-label=\"Format document\"\n title=\"Format (Ctrl+Shift+P)\"\n >\n { '{ }' }\n </button>\n )}\n </div>\n );\n};\n","import React, { useRef, useCallback, useEffect, useMemo } from 'react';\nimport type { ParseError, CursorPosition } from '../../types/editor';\nimport type { SearchMatch } from '../../hooks/useSearch';\n\nexport interface CodeEditorProps {\n value: string;\n onChange: (value: string) => void;\n parseError: ParseError | null;\n readOnly: boolean;\n lineNumbers: boolean;\n bracketMatching: boolean;\n searchMatches: SearchMatch[];\n currentMatchIndex: number;\n onCursorChange: (pos: CursorPosition) => void;\n className?: string;\n}\n\n/**\n * Syntax-highlighted code editor for JSON.\n * Uses a contentEditable approach with a textarea overlay for input,\n * keeping the implementation dependency-free.\n */\nexport const CodeEditor: React.FC<CodeEditorProps> = ({\n value,\n onChange,\n parseError,\n readOnly,\n lineNumbers,\n searchMatches,\n currentMatchIndex,\n onCursorChange,\n className = '',\n}) => {\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n const lines = useMemo(() => value.split('\\n'), [value]);\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (readOnly) return;\n onChange(e.target.value);\n },\n [onChange, readOnly]\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (readOnly) return;\n\n // Tab key inserts 2 spaces\n if (e.key === 'Tab') {\n e.preventDefault();\n const textarea = textareaRef.current;\n if (!textarea) return;\n\n const start = textarea.selectionStart;\n const end = textarea.selectionEnd;\n const indent = ' ';\n\n const newValue = value.substring(0, start) + indent + value.substring(end);\n onChange(newValue);\n\n // Restore cursor after indent\n requestAnimationFrame(() => {\n textarea.selectionStart = textarea.selectionEnd = start + indent.length;\n });\n }\n\n // Auto-close brackets\n if (e.key === '{' || e.key === '[' || e.key === '\"') {\n const textarea = textareaRef.current;\n if (!textarea) return;\n\n const start = textarea.selectionStart;\n const end = textarea.selectionEnd;\n const closeChar = e.key === '{' ? '}' : e.key === '[' ? ']' : '\"';\n\n // Only auto-close if no text is selected\n if (start === end) {\n e.preventDefault();\n const newValue =\n value.substring(0, start) + e.key + closeChar + value.substring(end);\n onChange(newValue);\n\n requestAnimationFrame(() => {\n textarea.selectionStart = textarea.selectionEnd = start + 1;\n });\n }\n }\n },\n [value, onChange, readOnly]\n );\n\n const handleCursorMove = useCallback(() => {\n const textarea = textareaRef.current;\n if (!textarea) return;\n\n const pos = textarea.selectionStart;\n const textBefore = value.substring(0, pos);\n const linesBefore = textBefore.split('\\n');\n const line = linesBefore.length;\n const column = linesBefore[linesBefore.length - 1].length + 1;\n\n onCursorChange({ line, column, offset: pos });\n }, [value, onCursorChange]);\n\n // Syntax highlight the JSON text\n const highlightedLines = useMemo(() => {\n return lines.map((line, idx) => {\n const lineNum = idx + 1;\n const isErrorLine = parseError?.line === lineNum;\n\n return (\n <div\n key={idx}\n className={`mjr-code__line ${isErrorLine ? 'mjr-code__line--error' : ''}`}\n >\n {lineNumbers && (\n <span className=\"mjr-code__line-number\" aria-hidden=\"true\">\n {lineNum}\n </span>\n )}\n <span className=\"mjr-code__line-content\">\n {highlightJsonLine(line)}\n </span>\n </div>\n );\n });\n }, [lines, lineNumbers, parseError]);\n\n return (\n <div className={`mjr-code-editor ${className}`}>\n {/* Highlighted display layer */}\n <div className=\"mjr-code__display\" aria-hidden=\"true\">\n {highlightedLines}\n </div>\n\n {/* Editable textarea (transparent, on top) */}\n <textarea\n ref={textareaRef}\n className=\"mjr-code__textarea\"\n value={value}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onKeyUp={handleCursorMove}\n onClick={handleCursorMove}\n readOnly={readOnly}\n spellCheck={false}\n autoCapitalize=\"off\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n aria-label=\"JSON code editor\"\n aria-multiline=\"true\"\n aria-readonly={readOnly}\n data-testid=\"code-editor-textarea\"\n />\n\n {/* Error tooltip */}\n {parseError && (\n <div\n className=\"mjr-code__error-tooltip\"\n role=\"alert\"\n style={{ top: `${(parseError.line - 1) * 1.5}em` }}\n >\n Line {parseError.line}, Col {parseError.column}: {parseError.message}\n </div>\n )}\n </div>\n );\n};\n\n/**\n * Simple JSON syntax highlighter — tokenizes a single line.\n */\nfunction highlightJsonLine(line: string): React.ReactNode[] {\n const tokens: React.ReactNode[] = [];\n let i = 0;\n let key = 0;\n\n while (i < line.length) {\n const ch = line[i];\n\n // Whitespace\n if (ch === ' ' || ch === '\\t') {\n let ws = '';\n while (i < line.length && (line[i] === ' ' || line[i] === '\\t')) {\n ws += line[i];\n i++;\n }\n tokens.push(<span key={key++}>{ws}</span>);\n continue;\n }\n\n // Strings\n if (ch === '\"') {\n let str = '\"';\n i++;\n while (i < line.length) {\n if (line[i] === '\\\\') {\n str += line[i] + (line[i + 1] || '');\n i += 2;\n continue;\n }\n str += line[i];\n if (line[i] === '\"') {\n i++;\n break;\n }\n i++;\n }\n\n // Check if this is a key (followed by colon)\n const rest = line.substring(i).trimStart();\n const isKey = rest.startsWith(':');\n\n tokens.push(\n <span key={key++} className={isKey ? 'mjr-syn-key' : 'mjr-syn-string'}>\n {str}\n </span>\n );\n continue;\n }\n\n // Numbers\n if (ch === '-' || (ch >= '0' && ch <= '9')) {\n let num = '';\n while (i < line.length && /[\\d.eE+\\-]/.test(line[i])) {\n num += line[i];\n i++;\n }\n tokens.push(\n <span key={key++} className=\"mjr-syn-number\">{num}</span>\n );\n continue;\n }\n\n // Booleans\n if (line.substring(i, i + 4) === 'true') {\n tokens.push(<span key={key++} className=\"mjr-syn-boolean\">true</span>);\n i += 4;\n continue;\n }\n if (line.substring(i, i + 5) === 'false') {\n tokens.push(<span key={key++} className=\"mjr-syn-boolean\">false</span>);\n i += 5;\n continue;\n }\n\n // Null\n if (line.substring(i, i + 4) === 'null') {\n tokens.push(<span key={key++} className=\"mjr-syn-null\">null</span>);\n i += 4;\n continue;\n }\n\n // Brackets and structural characters\n if (ch === '{' || ch === '}' || ch === '[' || ch === ']') {\n tokens.push(<span key={key++} className=\"mjr-syn-bracket\">{ch}</span>);\n i++;\n continue;\n }\n\n // Colon and comma\n tokens.push(<span key={key++} className=\"mjr-syn-punctuation\">{ch}</span>);\n i++;\n }\n\n return tokens;\n}\n","import React, { useState, useCallback } from 'react';\nimport type { JsonNodeType } from '../../types/tree';\n\nexport interface TreeNodeData {\n id: string;\n key: string | number;\n value: unknown;\n type: JsonNodeType;\n path: string;\n depth: number;\n expanded: boolean;\n children: TreeNodeData[];\n childCount: number;\n}\n\nexport interface TreeNodeProps {\n node: TreeNodeData;\n onToggle: (id: string) => void;\n onValueChange: (path: string, value: unknown) => void;\n onKeyChange: (path: string, oldKey: string, newKey: string) => void;\n onDelete: (path: string) => void;\n onTypeChange: (path: string, newType: JsonNodeType) => void;\n readOnly: boolean;\n}\n\nconst TYPE_LABELS: Record<JsonNodeType, string> = {\n string: 'str',\n number: 'num',\n boolean: 'bool',\n null: 'null',\n object: 'obj',\n array: 'arr',\n};\n\nconst TYPE_DEFAULTS: Record<JsonNodeType, unknown> = {\n string: '',\n number: 0,\n boolean: false,\n null: null,\n object: {},\n array: [],\n};\n\nexport const TreeNodeComponent: React.FC<TreeNodeProps> = ({\n node,\n onToggle,\n onValueChange,\n onKeyChange,\n onDelete,\n onTypeChange,\n readOnly,\n}) => {\n const [isEditing, setIsEditing] = useState(false);\n const [editValue, setEditValue] = useState('');\n const [isEditingKey, setIsEditingKey] = useState(false);\n const [editKey, setEditKey] = useState('');\n\n const isExpandable = node.type === 'object' || node.type === 'array';\n\n const handleToggle = useCallback(() => {\n if (isExpandable) {\n onToggle(node.id);\n }\n }, [isExpandable, node.id, onToggle]);\n\n const handleStartEdit = useCallback(() => {\n if (readOnly || isExpandable) return;\n setEditValue(node.type === 'string' ? String(node.value) : JSON.stringify(node.value));\n setIsEditing(true);\n }, [readOnly, isExpandable, node.value, node.type]);\n\n const handleFinishEdit = useCallback(() => {\n setIsEditing(false);\n let newValue: unknown;\n\n if (node.type === 'string') {\n newValue = editValue;\n } else if (node.type === 'number') {\n const num = Number(editValue);\n newValue = isNaN(num) ? node.value : num;\n } else if (node.type === 'boolean') {\n newValue = editValue === 'true';\n } else if (node.type === 'null') {\n newValue = null;\n } else {\n try {\n newValue = JSON.parse(editValue);\n } catch {\n newValue = node.value;\n }\n }\n\n onValueChange(node.path, newValue);\n }, [editValue, node.type, node.value, node.path, onValueChange]);\n\n const handleKeyEdit = useCallback(() => {\n if (readOnly || typeof node.key === 'number') return;\n setEditKey(String(node.key));\n setIsEditingKey(true);\n }, [readOnly, node.key]);\n\n const handleFinishKeyEdit = useCallback(() => {\n setIsEditingKey(false);\n if (editKey !== String(node.key)) {\n onKeyChange(node.path, String(node.key), editKey);\n }\n }, [editKey, node.key, node.path, onKeyChange]);\n\n const handleTypeChange = useCallback(\n (e: React.ChangeEvent<HTMLSelectElement>) => {\n const newType = e.target.value as JsonNodeType;\n onTypeChange(node.path, newType);\n },\n [node.path, onTypeChange]\n );\n\n const renderValue = () => {\n if (isEditing) {\n return (\n <input\n className=\"mjr-tree-node__edit-input\"\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onBlur={handleFinishEdit}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleFinishEdit();\n if (e.key === 'Escape') setIsEditing(false);\n }}\n autoFocus\n aria-label={`Edit value for ${node.key}`}\n data-testid={`edit-value-${node.path}`}\n />\n );\n }\n\n if (isExpandable) {\n const symbol = node.type === 'object' ? '{}' : '[]';\n return (\n <span className=\"mjr-tree-node__preview\">\n {node.expanded ? '' : `${symbol}`}\n {!node.expanded && (\n <span className=\"mjr-tree-node__count\">\n ({node.childCount} {node.childCount === 1 ? 'item' : 'items'})\n </span>\n )}\n </span>\n );\n }\n\n return (\n <span\n className={`mjr-tree-node__value mjr-tree-node__value--${node.type}`}\n onDoubleClick={handleStartEdit}\n role=\"button\"\n tabIndex={0}\n aria-label={`Value: ${formatDisplayValue(node.value, node.type)}. Double-click to edit.`}\n data-testid={`value-${node.path}`}\n >\n {formatDisplayValue(node.value, node.type)}\n </span>\n );\n };\n\n return (\n <div\n className=\"mjr-tree-node\"\n role=\"treeitem\"\n aria-expanded={isExpandable ? node.expanded : undefined}\n aria-level={node.depth + 1}\n aria-label={`${node.key}: ${node.type}`}\n style={{ paddingLeft: `${node.depth * 20}px` }}\n data-testid={`tree-node-${node.path}`}\n >\n {/* Expand/collapse arrow */}\n <span\n className={`mjr-tree-node__arrow ${isExpandable ? 'mjr-tree-node__arrow--expandable' : ''} ${node.expanded ? 'mjr-tree-node__arrow--expanded' : ''}`}\n onClick={handleToggle}\n aria-hidden=\"true\"\n >\n {isExpandable ? (node.expanded ? '\\u25BC' : '\\u25B6') : '\\u00A0'}\n </span>\n\n {/* Key */}\n {isEditingKey ? (\n <input\n className=\"mjr-tree-node__key-input\"\n value={editKey}\n onChange={(e) => setEditKey(e.target.value)}\n onBlur={handleFinishKeyEdit}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleFinishKeyEdit();\n if (e.key === 'Escape') setIsEditingKey(false);\n }}\n autoFocus\n aria-label={`Edit key name`}\n />\n ) : (\n <span\n className=\"mjr-tree-node__key\"\n onDoubleClick={handleKeyEdit}\n data-testid={`key-${node.path}`}\n >\n {typeof node.key === 'number' ? node.key : `\"${node.key}\"`}\n </span>\n )}\n\n <span className=\"mjr-tree-node__colon\" aria-hidden=\"true\">:</span>\n\n {/* Value */}\n {renderValue()}\n\n {/* Type badge */}\n {!readOnly ? (\n <select\n className=\"mjr-tree-node__type-badge\"\n value={node.type}\n onChange={handleTypeChange}\n aria-label={`Type for ${node.key}`}\n data-testid={`type-${node.path}`}\n >\n {Object.entries(TYPE_LABELS).map(([type, label]) => (\n <option key={type} value={type}>{label}</option>\n ))}\n </select>\n ) : (\n <span className=\"mjr-tree-node__type-badge-ro\">\n {TYPE_LABELS[node.type]}\n </span>\n )}\n\n {/* Delete button */}\n {!readOnly && (\n <button\n className=\"mjr-tree-node__delete\"\n onClick={() => onDelete(node.path)}\n aria-label={`Delete ${node.key}`}\n title=\"Delete\"\n data-testid={`delete-${node.path}`}\n >\n \\u2715\n </button>\n )}\n\n {/* Children */}\n {isExpandable && node.expanded && node.children.length > 0 && (\n <div role=\"group\" className=\"mjr-tree-node__children\">\n {node.children.map((child) => (\n <TreeNodeComponent\n key={child.id}\n node={child}\n onToggle={onToggle}\n onValueChange={onValueChange}\n onKeyChange={onKeyChange}\n onDelete={onDelete}\n onTypeChange={onTypeChange}\n readOnly={readOnly}\n />\n ))}\n </div>\n )}\n </div>\n );\n};\n\nfunction formatDisplayValue(value: unknown, type: JsonNodeType): string {\n if (type === 'null') return 'null';\n if (type === 'string') return `\"${String(value)}\"`;\n if (type === 'boolean') return String(value);\n if (type === 'number') return String(value);\n return '';\n}\n","/**\n * JSONPath and dot-notation utilities.\n */\n\n/**\n * Get a value from a nested object using a dot-notation path.\n * Supports array indexing: \"items[0].name\" or \"items.0.name\"\n */\nexport function getByPath(obj: unknown, path: string): unknown {\n if (path === '$' || path === '') return obj;\n\n const segments = parsePath(path);\n let current: unknown = obj;\n\n for (const segment of segments) {\n if (current === null || current === undefined) return undefined;\n\n if (Array.isArray(current)) {\n const index = parseInt(segment, 10);\n if (isNaN(index)) return undefined;\n current = current[index];\n } else if (typeof current === 'object') {\n current = (current as Record<string, unknown>)[segment];\n } else {\n return undefined;\n }\n }\n\n return current;\n}\n\n/**\n * Set a value in a nested object using a dot-notation path.\n * Returns a new object (immutable operation).\n */\nexport function setByPath(obj: unknown, path: string, value: unknown): unknown {\n if (path === '$' || path === '') return value;\n\n const segments = parsePath(path);\n return setBySegments(obj, segments, 0, value);\n}\n\nfunction setBySegments(\n current: unknown,\n segments: string[],\n index: number,\n value: unknown\n): unknown {\n if (index === segments.length) return value;\n\n const segment = segments[index];\n\n if (Array.isArray(current)) {\n const arrIndex = parseInt(segment, 10);\n const newArr = [...current];\n newArr[arrIndex] = setBySegments(current[arrIndex], segments, index + 1, value);\n return newArr;\n }\n\n if (typeof current === 'object' && current !== null) {\n return {\n ...(current as Record<string, unknown>),\n [segment]: setBySegments(\n (current as Record<string, unknown>)[segment],\n segments,\n index + 1,\n value\n ),\n };\n }\n\n // Current is a primitive but path goes deeper — create object\n const nextSegment = segments[index + 1];\n const isArrayIndex = nextSegment !== undefined && /^\\d+$/.test(nextSegment);\n const container = isArrayIndex ? [] : {};\n return {\n [segment]: setBySegments(container, segments, index + 1, value),\n };\n}\n\n/**\n * Delete a key from a nested object by path.\n * Returns a new object (immutable operation).\n */\nexport function deleteByPath(obj: unknown, path: string): unknown {\n if (path === '$' || path === '') return undefined;\n\n const segments = parsePath(path);\n return deleteBySegments(obj, segments, 0);\n}\n\nfunction deleteBySegments(current: unknown, segments: string[], index: number): unknown {\n if (index === segments.length - 1) {\n const segment = segments[index];\n\n if (Array.isArray(current)) {\n const arrIndex = parseInt(segment, 10);\n return current.filter((_, i) => i !== arrIndex);\n }\n\n if (typeof current === 'object' && current !== null) {\n const { [segment]: _, ...rest } = current as Record<string, unknown>;\n return rest;\n }\n\n return current;\n }\n\n const segment = segments[index];\n\n if (Array.isArray(current)) {\n const arrIndex = parseInt(segment, 10);\n const newArr = [...current];\n newArr[arrIndex] = deleteBySegments(current[arrIndex], segments, index + 1);\n return newArr;\n }\n\n if (typeof current === 'object' && current !== null) {\n return {\n ...(current as Record<string, unknown>),\n [segment]: deleteBySegments(\n (current as Record<string, unknown>)[segment],\n segments,\n index + 1\n ),\n };\n }\n\n return current;\n}\n\n/**\n * Parse a JSONPath or dot-notation string into segments.\n * \"$.\" prefix is stripped. Brackets are converted to dot notation.\n * E.g., \"$.store.book[0].author\" → [\"store\", \"book\", \"0\", \"author\"]\n */\nexport function parsePath(path: string): string[] {\n // Strip leading \"$.\" or \"$\"\n let normalized = path.replace(/^\\$\\.?/, '');\n // Convert bracket notation to dot notation: [0] → .0, [\"key\"] → .key\n normalized = normalized.replace(/\\[(\\d+)\\]/g, '.$1');\n normalized = normalized.replace(/\\[\"([^\"]+)\"\\]/g, '.$1');\n normalized = normalized.replace(/\\['([^']+)'\\]/g, '.$1');\n\n return normalized.split('.').filter((s) => s !== '');\n}\n\n/**\n * Build a JSONPath string from segments.\n */\nexport function buildPath(segments: (string | number)[]): string {\n if (segments.length === 0) return '$';\n return '$.' + segments.map((s) => (typeof s === 'number' ? `[${s}]` : s)).join('.');\n}\n","import React, { useMemo, useCallback, useState } from 'react';\nimport { TreeNodeComponent, type TreeNodeData } from './TreeNode';\nimport { setByPath, deleteByPath } from '../../core/path';\nimport type { JsonNodeType } from '../../types/tree';\n\nexport interface TreeEditorProps {\n value: unknown;\n onChange: (value: unknown) => void;\n readOnly: boolean;\n className?: string;\n}\n\nlet nodeIdCounter = 0;\n\n/**\n * Tree-based visual editor for JSON data.\n * Converts a JSON value into a navigable tree with inline editing.\n */\nexport const TreeEditor: React.FC<TreeEditorProps> = ({\n value,\n onChange,\n readOnly,\n className = '',\n}) => {\n const [expandedPaths, setExpandedPaths] = useState<Set<string>>(new Set(['$']));\n\n // Build tree structure from the JSON value\n const tree = useMemo(() => {\n nodeIdCounter = 0;\n return buildTree(value, '$', 'root', 0, expandedPaths);\n }, [value, expandedPaths]);\n\n const handleToggle = useCallback((id: string) => {\n setExpandedPaths((prev) => {\n const next = new Set(prev);\n // Find the path for this id — we encode path in the id\n const path = id;\n if (next.has(path)) {\n next.delete(path);\n } else {\n next.add(path);\n }\n return next;\n });\n }, []);\n\n const handleValueChange = useCallback(\n (path: string, newValue: unknown) => {\n const updated = setByPath(value, path, newValue);\n onChange(updated);\n },\n [value, onChange]\n );\n\n const handleKeyChange = useCallback(\n (path: string, oldKey: string, newKey: string) => {\n // Rename: delete old key, set new key with the same value\n const segments = path.split('.');\n const parentPath = segments.slice(0, -1).join('.') || '$';\n const currentValue = getNestedValue(value, path);\n let updated = deleteByPath(value, path);\n const newPath = parentPath === '$' ? `$.${newKey}` : `${parentPath}.${newKey}`;\n updated = setByPath(updated, newPath, currentValue);\n onChange(updated);\n },\n [value, onChange]\n );\n\n const handleDelete = useCallback(\n (path: string) => {\n const updated = deleteByPath(value, path);\n onChange(updated);\n },\n [value, onChange]\n );\n\n const handleTypeChange = useCallback(\n (path: string, newType: JsonNodeType) => {\n const defaults: Record<JsonNodeType, unknown> = {\n string: '',\n number: 0,\n boolean: false,\n null: null,\n object: {},\n array: [],\n };\n const updated = setByPath(value, path, defaults[newType]);\n onChange(updated);\n },\n [value, onChange]\n );\n\n const handleAddProperty = useCallback(() => {\n if (value === undefined || value === null) {\n onChange({});\n return;\n }\n if (typeof value === 'object' && !Array.isArray(value)) {\n const obj = value as Record<string, unknown>;\n let newKey = 'newKey';\n let counter = 1;\n while (newKey in obj) {\n newKey = `newKey${counter++}`;\n }\n onChange({ ...obj, [newKey]: '' });\n } else if (Array.isArray(value)) {\n onChange([...value, '']);\n }\n }, [value, onChange]);\n\n if (tree === null) {\n return (\n <div className={`mjr-tree-editor mjr-tree-editor--empty ${className}`}>\n <p className=\"mjr-tree-editor__empty-msg\">No valid JSON to display</p>\n {!readOnly && (\n <button className=\"mjr-tree-editor__add-btn\" onClick={() => onChange({})}>\n + Create empty object\n </button>\n )}\n </div>\n );\n }\n\n return (\n <div\n className={`mjr-tree-editor ${className}`}\n role=\"tree\"\n aria-label=\"JSON tree editor\"\n data-testid=\"tree-editor\"\n >\n <TreeNodeComponent\n node={tree}\n onToggle={handleToggle}\n onValueChange={handleValueChange}\n onKeyChange={handleKeyChange}\n onDelete={handleDelete}\n onTypeChange={handleTypeChange}\n readOnly={readOnly}\n />\n\n {!readOnly && (\n <button\n className=\"mjr-tree-editor__add-root\"\n onClick={handleAddProperty}\n data-testid=\"add-property\"\n >\n + Add property\n </button>\n )}\n </div>\n );\n};\n\n// --- Tree building helpers ---\n\nfunction buildTree(\n value: unknown,\n path: string,\n key: string | number,\n depth: number,\n expandedPaths: Set<string>\n): TreeNodeData | null {\n if (value === undefined) return null;\n\n const type = getType(value);\n const expanded = expandedPaths.has(path);\n const id = path; // Use path as id for simplicity\n\n const node: TreeNodeData = {\n id,\n key,\n value,\n type,\n path,\n depth,\n expanded,\n children: [],\n childCount: 0,\n };\n\n if (type === 'object' && value !== null) {\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj);\n node.childCount = keys.length;\n if (expanded) {\n node.children = keys.map((k) =>\n buildTree(obj[k], `${path}.${k}`, k, depth + 1, expandedPaths)\n ).filter(Boolean) as TreeNodeData[];\n }\n } else if (type === 'array') {\n const arr = value as unknown[];\n node.childCount = arr.length;\n if (expanded) {\n node.children = arr.map((item, i) =>\n buildTree(item, `${path}[${i}]`, i, depth + 1, expandedPaths)\n ).filter(Boolean) as TreeNodeData[];\n }\n }\n\n return node;\n}\n\nfunction getType(value: unknown): JsonNodeType {\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'array';\n const t = typeof value;\n if (t === 'string') return 'string';\n if (t === 'number') return 'number';\n if (t === 'boolean') return 'boolean';\n if (t === 'object') return 'object';\n return 'string';\n}\n\nfunction getNestedValue(obj: unknown, path: string): unknown {\n const segments = path.replace(/^\\$\\.?/, '').replace(/\\[(\\d+)\\]/g, '.$1').split('.').filter(Boolean);\n let current = obj;\n for (const seg of segments) {\n if (current === null || current === undefined) return undefined;\n if (Array.isArray(current)) {\n current = current[parseInt(seg, 10)];\n } else if (typeof current === 'object') {\n current = (current as Record<string, unknown>)[seg];\n }\n }\n return current;\n}\n","import React from 'react';\nimport type { ParseError, CursorPosition } from '../../types/editor';\nimport type { ValidationError } from '../../types/validation';\nimport type { JsonStats } from '../../core/formatter';\n\nexport interface StatusBarProps {\n parseError: ParseError | null;\n validationErrors: ValidationError[];\n cursor: CursorPosition;\n stats: JsonStats | null;\n className?: string;\n}\n\nexport const StatusBar: React.FC<StatusBarProps> = ({\n parseError,\n validationErrors,\n cursor,\n stats,\n className = '',\n}) => {\n const hasErrors = parseError !== null;\n const hasWarnings = validationErrors.length > 0;\n\n let statusIcon: string;\n let statusText: string;\n let statusClass: string;\n\n if (hasErrors) {\n statusIcon = '\\u2715'; // ✕\n statusText = `Invalid JSON (line ${parseError.line})`;\n statusClass = 'mjr-status--error';\n } else if (hasWarnings) {\n statusIcon = '\\u26A0'; // ⚠\n statusText = `${validationErrors.length} validation ${validationErrors.length === 1 ? 'issue' : 'issues'}`;\n statusClass = 'mjr-status--warning';\n } else {\n statusIcon = '\\u2713'; // ✓\n statusText = 'Valid JSON';\n statusClass = 'mjr-status--valid';\n }\n\n return (\n <div\n className={`mjr-status-bar ${statusClass} ${className}`}\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n <span className=\"mjr-status-bar__indicator\">\n <span className=\"mjr-status-bar__icon\" aria-hidden=\"true\">{statusIcon}</span>\n <span className=\"mjr-status-bar__text\">{statusText}</span>\n </span>\n\n <span className=\"mjr-status-bar__separator\" aria-hidden=\"true\">|</span>\n\n <span className=\"mjr-status-bar__cursor\">\n Ln {cursor.line}, Col {cursor.column}\n </span>\n\n {stats && (\n <>\n <span className=\"mjr-status-bar__separator\" aria-hidden=\"true\">|</span>\n <span className=\"mjr-status-bar__stats\">\n {stats.properties} {stats.properties === 1 ? 'property' : 'properties'}\n {stats.arrays > 0 && `, ${stats.arrays} ${stats.arrays === 1 ? 'array' : 'arrays'}`}\n </span>\n </>\n )}\n\n {stats && stats.byteSize > 0 && (\n <>\n <span className=\"mjr-status-bar__separator\" aria-hidden=\"true\">|</span>\n <span className=\"mjr-status-bar__size\">{formatBytes(stats.byteSize)}</span>\n </>\n )}\n </div>\n );\n};\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n","import type { ParseError } from '../types/editor';\n\n/** Result of a JSON parse attempt */\nexport interface ParseResult {\n value: unknown;\n error: ParseError | null;\n}\n\n/**\n * Parse a JSON string with detailed error location info.\n * Uses native JSON.parse but enhances error messages with line/column.\n */\nexport function parseJson(text: string): ParseResult {\n if (text.trim() === '') {\n return { value: undefined, error: null };\n }\n\n try {\n const value = JSON.parse(text);\n return { value, error: null };\n } catch (e) {\n const error = extractParseError(e as SyntaxError, text);\n return { value: undefined, error };\n }\n}\n\n/**\n * Extract line, column, and offset from a SyntaxError thrown by JSON.parse.\n * Different engines format the error message differently.\n */\nfunction extractParseError(err: SyntaxError, text: string): ParseError {\n const message = err.message;\n\n // V8 (Chrome/Node): \"... at position 42\" or \"... at line 3 column 5\"\n let offset = -1;\n let line = 1;\n let column = 1;\n\n const posMatch = message.match(/at position (\\d+)/);\n const lineColMatch = message.match(/at line (\\d+) column (\\d+)/);\n\n if (lineColMatch) {\n line = parseInt(lineColMatch[1], 10);\n column = parseInt(lineColMatch[2], 10);\n offset = getOffsetFromLineCol(text, line, column);\n } else if (posMatch) {\n offset = parseInt(posMatch[1], 10);\n const loc = getLineColFromOffset(text, offset);\n line = loc.line;\n column = loc.column;\n }\n\n // Clean up the message for display\n const cleanMessage = message\n .replace(/^JSON\\.parse: /, '')\n .replace(/ at position \\d+.*$/, '')\n .replace(/ at line \\d+ column \\d+.*$/, '');\n\n return {\n message: cleanMessage || 'Invalid JSON',\n line,\n column,\n offset: Math.max(0, offset),\n };\n}\n\n/** Convert a character offset to line/column (both 1-based). */\nexport function getLineColFromOffset(\n text: string,\n offset: number\n): { line: number; column: number } {\n let line = 1;\n let lastNewline = -1;\n\n for (let i = 0; i < offset && i < text.length; i++) {\n if (text[i] === '\\n') {\n line++;\n lastNewline = i;\n }\n }\n\n return { line, column: offset - lastNewline };\n}\n\n/** Convert line/column (1-based) to a character offset. */\nexport function getOffsetFromLineCol(\n text: string,\n line: number,\n column: number\n): number {\n let currentLine = 1;\n for (let i = 0; i < text.length; i++) {\n if (currentLine === line) {\n return i + column - 1;\n }\n if (text[i] === '\\n') {\n currentLine++;\n }\n }\n return text.length;\n}\n\n/**\n * Stringify a value to formatted JSON text.\n */\nexport function stringifyJson(\n value: unknown,\n indent: number | string = 2\n): string {\n if (value === undefined) return '';\n try {\n return JSON.stringify(value, null, indent);\n } catch {\n return '';\n }\n}\n\n/**\n * Check if a string is valid JSON without returning the parsed value.\n */\nexport function isValidJson(text: string): boolean {\n try {\n JSON.parse(text);\n return true;\n } catch {\n return false;\n }\n}\n","import type {\n ValidationError,\n ValidationResult,\n JSONSchema,\n CustomValidator,\n ValidationSeverity,\n} from '../types/validation';\n\n/**\n * Validate a parsed JSON value against a JSON Schema (Draft-07 compatible subset).\n * This is a built-in lightweight validator — for full draft support, users can\n * supply an Ajv-based CustomValidator.\n */\nexport function validateSchema(\n value: unknown,\n schema: JSONSchema,\n path: string = '$'\n): ValidationResult {\n const errors: ValidationError[] = [];\n\n if (value === undefined || value === null) {\n if (schema.type && schema.type !== 'null') {\n errors.push(makeError(`Expected type \"${schema.type}\", got null`, path, 'type', schema.type));\n }\n return { valid: errors.length === 0, errors };\n }\n\n // Type validation\n if (schema.type) {\n const actualType = getJsonType(value);\n const allowedTypes = Array.isArray(schema.type) ? schema.type : [schema.type];\n // Per JSON Schema spec, \"integer\" is a subtype of \"number\"\n const typeMatches = allowedTypes.includes(actualType) ||\n (actualType === 'integer' && allowedTypes.includes('number'));\n if (!typeMatches) {\n errors.push(\n makeError(\n `Expected type \"${allowedTypes.join(' | ')}\", got \"${actualType}\"`,\n path,\n 'type',\n schema.type,\n value\n )\n );\n }\n }\n\n // Enum validation\n if (schema.enum && Array.isArray(schema.enum)) {\n if (!schema.enum.some((e) => deepEqual(e, value))) {\n errors.push(\n makeError(\n `Value must be one of: ${schema.enum.map((e) => JSON.stringify(e)).join(', ')}`,\n path,\n 'enum',\n schema.enum,\n value\n )\n );\n }\n }\n\n // String validations\n if (typeof value === 'string') {\n if (schema.minLength !== undefined && value.length < (schema.minLength as number)) {\n errors.push(\n makeError(\n `String must be at least ${schema.minLength} characters`,\n path,\n 'minLength',\n schema.minLength,\n value\n )\n );\n }\n if (schema.maxLength !== undefined && value.length > (schema.maxLength as number)) {\n errors.push(\n makeError(\n `String must be at most ${schema.maxLength} characters`,\n path,\n 'maxLength',\n schema.maxLength,\n value\n )\n );\n }\n if (schema.pattern) {\n const re = new RegExp(schema.pattern as string);\n if (!re.test(value)) {\n errors.push(\n makeError(`String must match pattern \"${schema.pattern}\"`, path, 'pattern', schema.pattern, value)\n );\n }\n }\n }\n\n // Number validations\n if (typeof value === 'number') {\n if (schema.minimum !== undefined && value < (schema.minimum as number)) {\n errors.push(\n makeError(`Value must be >= ${schema.minimum}`, path, 'minimum', schema.minimum, value)\n );\n }\n if (schema.maximum !== undefined && value > (schema.maximum as number)) {\n errors.push(\n makeError(`Value must be <= ${schema.maximum}`, path, 'maximum', schema.maximum, value)\n );\n }\n if (schema.exclusiveMinimum !== undefined && value <= (schema.exclusiveMinimum as number)) {\n errors.push(\n makeError(\n `Value must be > ${schema.exclusiveMinimum}`,\n path,\n 'exclusiveMinimum',\n schema.exclusiveMinimum,\n value\n )\n );\n }\n if (schema.exclusiveMaximum !== undefined && value >= (schema.exclusiveMaximum as number)) {\n errors.push(\n makeError(\n `Value must be < ${schema.exclusiveMaximum}`,\n path,\n 'exclusiveMaximum',\n schema.exclusiveMaximum,\n value\n )\n );\n }\n if (schema.multipleOf !== undefined && value % (schema.multipleOf as number) !== 0) {\n errors.push(\n makeError(`Value must be a multiple of ${schema.multipleOf}`, path, 'multipleOf', schema.multipleOf, value)\n );\n }\n }\n\n // Array validations\n if (Array.isArray(value)) {\n if (schema.minItems !== undefined && value.length < (schema.minItems as number)) {\n errors.push(\n makeError(`Array must have at least ${schema.minItems} items`, path, 'minItems', schema.minItems, value)\n );\n }\n if (schema.maxItems !== undefined && value.length > (schema.maxItems as number)) {\n errors.push(\n makeError(`Array must have at most ${schema.maxItems} items`, path, 'maxItems', schema.maxItems, value)\n );\n }\n if (schema.uniqueItems && new Set(value.map((v: unknown) => JSON.stringify(v))).size !== value.length) {\n errors.push(makeError('Array items must be unique', path, 'uniqueItems', true, value));\n }\n // Validate items against item schema\n if (schema.items && !Array.isArray(schema.items)) {\n value.forEach((item, index) => {\n const result = validateSchema(item, schema.items as JSONSchema, `${path}[${index}]`);\n errors.push(...result.errors);\n });\n }\n }\n\n // Object validations\n if (isPlainObject(value)) {\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj);\n\n if (schema.required && Array.isArray(schema.required)) {\n for (const req of schema.required as string[]) {\n if (!(req in obj)) {\n errors.push(\n makeError(`Missing required property \"${req}\"`, path, 'required', schema.required)\n );\n }\n }\n }\n\n if (schema.minProperties !== undefined && keys.length < (schema.minProperties as number)) {\n errors.push(\n makeError(\n `Object must have at least ${schema.minProperties} properties`,\n path,\n 'minProperties',\n schema.minProperties,\n value\n )\n );\n }\n\n if (schema.maxProperties !== undefined && keys.length > (schema.maxProperties as number)) {\n errors.push(\n makeError(\n `Object must have at most ${schema.maxProperties} properties`,\n path,\n 'maxProperties',\n schema.maxProperties,\n value\n )\n );\n }\n\n // Validate each property\n if (schema.properties) {\n const props = schema.properties as Record<string, JSONSchema>;\n for (const key of keys) {\n if (props[key]) {\n const result = validateSchema(obj[key], props[key], `${path}.${key}`);\n errors.push(...result.errors);\n } else if (schema.additionalProperties === false) {\n errors.push(\n makeError(\n `Unexpected property \"${key}\"`,\n `${path}.${key}`,\n 'additionalProperties',\n false,\n obj[key]\n ),\n );\n }\n }\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n\n/**\n * Run custom validators on a value.\n */\nexport async function runCustomValidators(\n value: unknown,\n validators: CustomValidator[],\n path: string = '$'\n): Promise<ValidationError[]> {\n const results = await Promise.all(validators.map((v) => v(value, path)));\n return results.flat();\n}\n\n// --- Helpers ---\n\nfunction getJsonType(value: unknown): string {\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'array';\n if (typeof value === 'number') {\n return Number.isInteger(value) ? 'integer' : 'number';\n }\n return typeof value;\n}\n\nfunction makeError(\n message: string,\n path: string,\n schemaKeyword: string,\n schemaRule?: unknown,\n actualValue?: unknown,\n severity: ValidationSeverity = 'error'\n): ValidationError {\n return { message, path, severity, schemaKeyword, schemaRule, actualValue };\n}\n\nfunction isPlainObject(val: unknown): val is Record<string, unknown> {\n return typeof val === 'object' && val !== null && !Array.isArray(val);\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (a === null || b === null) return false;\n if (typeof a !== 'object') return false;\n return JSON.stringify(a) === JSON.stringify(b);\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { parseJson, stringifyJson } from '../core/parser';\nimport { validateSchema, runCustomValidators } from '../core/validator';\nimport type { ParseError } from '../types/editor';\nimport type { ValidationError, JSONSchema, CustomValidator } from '../types/validation';\n\ninterface UseJsonParserOptions {\n /** JSON Schema for validation */\n schema?: JSONSchema;\n /** Custom validators */\n validators?: CustomValidator[];\n /** Debounce interval in ms */\n debounce?: number;\n}\n\ninterface UseJsonParserResult {\n /** The current raw text */\n text: string;\n /** The parsed value (undefined if invalid) */\n parsedValue: unknown;\n /** Parse error, if any */\n parseError: ParseError | null;\n /** Validation errors from schema + custom validators */\n validationErrors: ValidationError[];\n /** Whether the text is valid JSON */\n isValid: boolean;\n /** Update the raw text */\n setText: (text: string) => void;\n /** Update from a parsed value */\n setValue: (value: unknown) => void;\n /** Format the current text */\n format: (indent?: number | string) => void;\n}\n\n/**\n * Hook that manages JSON parsing and validation state.\n */\nexport function useJsonParser(\n initialValue?: unknown,\n options: UseJsonParserOptions = {}\n): UseJsonParserResult {\n const { schema, validators, debounce = 300 } = options;\n\n const [text, setText] = useState<string>(() =>\n initialValue !== undefined ? stringifyJson(initialValue) : ''\n );\n const [parsedValue, setParsedValue] = useState<unknown>(initialValue);\n const [parseError, setParseError] = useState<ParseError | null>(null);\n const [validationErrors, setValidationErrors] = useState<ValidationError[]>([]);\n\n const debounceTimer = useRef<ReturnType<typeof setTimeout>>();\n\n // Parse text whenever it changes\n useEffect(() => {\n const result = parseJson(text);\n setParsedValue(result.value);\n setParseError(result.error);\n\n // Run validation if parsing succeeded\n if (!result.error && result.value !== undefined) {\n if (debounceTimer.current) clearTimeout(debounceTimer.current);\n\n debounceTimer.current = setTimeout(async () => {\n let errors: ValidationError[] = [];\n\n if (schema) {\n const schemaResult = validateSchema(result.value, schema);\n errors = [...schemaResult.errors];\n }\n\n if (validators && validators.length > 0) {\n const customErrors = await runCustomValidators(result.value, validators);\n errors = [...errors, ...customErrors];\n }\n\n setValidationErrors(errors);\n }, debounce);\n } else {\n setValidationErrors([]);\n }\n\n return () => {\n if (debounceTimer.current) clearTimeout(debounceTimer.current);\n };\n }, [text, schema, validators, debounce]);\n\n const handleSetText = useCallback((newText: string) => {\n setText(newText);\n }, []);\n\n const handleSetValue = useCallback((value: unknown) => {\n const newText = stringifyJson(value);\n setText(newText);\n }, []);\n\n const format = useCallback(\n (indent: number | string = 2) => {\n if (parsedValue !== undefined) {\n setText(stringifyJson(parsedValue, indent));\n }\n },\n [parsedValue]\n );\n\n return {\n text,\n parsedValue,\n parseError,\n validationErrors,\n isValid: parseError === null && validationErrors.length === 0,\n setText: handleSetText,\n setValue: handleSetValue,\n format,\n };\n}\n","import { useState, useCallback, useRef } from 'react';\n\ninterface UndoRedoOptions {\n /** Maximum number of history entries */\n maxHistory?: number;\n /** Time window (ms) for grouping consecutive actions */\n groupingInterval?: number;\n}\n\ninterface UndoRedoState<T> {\n current: T;\n canUndo: boolean;\n canRedo: boolean;\n historyLength: number;\n set: (value: T) => void;\n undo: () => void;\n redo: () => void;\n reset: (value: T) => void;\n}\n\n/**\n * A hook providing undo/redo history management with time-based grouping.\n */\nexport function useUndoRedo<T>(\n initialValue: T,\n options: UndoRedoOptions = {}\n): UndoRedoState<T> {\n const { maxHistory = 100, groupingInterval = 300 } = options;\n\n // Use refs for the mutable history so we can read/write atomically\n const historyRef = useRef<T[]>([initialValue]);\n const positionRef = useRef(0);\n const lastUpdateTime = useRef<number>(0);\n\n // State just for triggering re-renders\n const [, forceUpdate] = useState(0);\n const rerender = useCallback(() => forceUpdate((n) => n + 1), []);\n\n const current = historyRef.current[positionRef.current];\n\n const set = useCallback(\n (value: T) => {\n const now = Date.now();\n const shouldGroup = now - lastUpdateTime.current < groupingInterval;\n lastUpdateTime.current = now;\n\n const prev = historyRef.current;\n const pos = positionRef.current;\n\n let newHistory: T[];\n let newPos: number;\n\n if (shouldGroup && pos > 0) {\n // Replace the current entry (grouping consecutive fast edits)\n newHistory = [...prev.slice(0, pos), value];\n newPos = pos;\n } else {\n // Add a new entry after current position\n newHistory = [...prev.slice(0, pos + 1), value];\n newPos = pos + 1;\n }\n\n // Trim to max history\n if (newHistory.length > maxHistory) {\n const trimCount = newHistory.length - maxHistory;\n newHistory = newHistory.slice(trimCount);\n newPos = newPos - trimCount;\n }\n\n historyRef.current = newHistory;\n positionRef.current = Math.max(0, newPos);\n rerender();\n },\n [maxHistory, groupingInterval, rerender]\n );\n\n const undo = useCallback(() => {\n if (positionRef.current > 0) {\n positionRef.current -= 1;\n rerender();\n }\n }, [rerender]);\n\n const redo = useCallback(() => {\n if (positionRef.current < historyRef.current.length - 1) {\n positionRef.current += 1;\n rerender();\n }\n }, [rerender]);\n\n const reset = useCallback(\n (value: T) => {\n historyRef.current = [value];\n positionRef.current = 0;\n lastUpdateTime.current = 0;\n rerender();\n },\n [rerender]\n );\n\n return {\n current,\n canUndo: positionRef.current > 0,\n canRedo: positionRef.current < historyRef.current.length - 1,\n historyLength: historyRef.current.length,\n set,\n undo,\n redo,\n reset,\n };\n}\n","import { useState, useCallback, useMemo } from 'react';\n\nexport interface SearchMatch {\n /** Line number (1-based) */\n line: number;\n /** Column start (0-based) */\n columnStart: number;\n /** Column end (0-based) */\n columnEnd: number;\n /** The matched text */\n matchText: string;\n /** JSONPath if in tree mode */\n path?: string;\n}\n\ninterface UseSearchOptions {\n caseSensitive?: boolean;\n useRegex?: boolean;\n searchKeys?: boolean;\n searchValues?: boolean;\n}\n\ninterface UseSearchResult {\n query: string;\n setQuery: (q: string) => void;\n matches: SearchMatch[];\n currentMatchIndex: number;\n totalMatches: number;\n goToNext: () => void;\n goToPrevious: () => void;\n options: UseSearchOptions;\n setOptions: (opts: Partial<UseSearchOptions>) => void;\n isActive: boolean;\n open: () => void;\n close: () => void;\n}\n\n/**\n * Hook for managing search state across the editor.\n */\nexport function useSearch(text: string): UseSearchResult {\n const [query, setQuery] = useState('');\n const [currentMatchIndex, setCurrentMatchIndex] = useState(0);\n const [isActive, setIsActive] = useState(false);\n const [options, setOptionsState] = useState<UseSearchOptions>({\n caseSensitive: false,\n useRegex: false,\n searchKeys: true,\n searchValues: true,\n });\n\n const matches = useMemo(() => {\n if (!query || !text) return [];\n\n try {\n const flags = options.caseSensitive ? 'g' : 'gi';\n const pattern = options.useRegex ? query : escapeRegex(query);\n const regex = new RegExp(pattern, flags);\n\n const results: SearchMatch[] = [];\n const lines = text.split('\\n');\n\n for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {\n const line = lines[lineIdx];\n let match: RegExpExecArray | null;\n\n // Reset lastIndex for each line\n regex.lastIndex = 0;\n while ((match = regex.exec(line)) !== null) {\n results.push({\n line: lineIdx + 1,\n columnStart: match.index,\n columnEnd: match.index + match[0].length,\n matchText: match[0],\n });\n // Prevent infinite loops on zero-length matches\n if (match.index === regex.lastIndex) regex.lastIndex++;\n }\n }\n\n return results;\n } catch {\n // Invalid regex\n return [];\n }\n }, [query, text, options.caseSensitive, options.useRegex]);\n\n const goToNext = useCallback(() => {\n if (matches.length === 0) return;\n setCurrentMatchIndex((i) => (i + 1) % matches.length);\n }, [matches.length]);\n\n const goToPrevious = useCallback(() => {\n if (matches.length === 0) return;\n setCurrentMatchIndex((i) => (i - 1 + matches.length) % matches.length);\n }, [matches.length]);\n\n const setOptions = useCallback((opts: Partial<UseSearchOptions>) => {\n setOptionsState((prev) => ({ ...prev, ...opts }));\n setCurrentMatchIndex(0);\n }, []);\n\n const open = useCallback(() => setIsActive(true), []);\n const close = useCallback(() => {\n setIsActive(false);\n setQuery('');\n setCurrentMatchIndex(0);\n }, []);\n\n return {\n query,\n setQuery: (q: string) => {\n setQuery(q);\n setCurrentMatchIndex(0);\n },\n matches,\n currentMatchIndex,\n totalMatches: matches.length,\n goToNext,\n goToPrevious,\n options,\n setOptions,\n isActive,\n open,\n close,\n };\n}\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","import type { IndentationType } from '../types/editor';\n\n/**\n * Pretty-print JSON text with the given indentation.\n * Returns the original text if it cannot be parsed.\n */\nexport function formatJson(text: string, indent: IndentationType = 2): string {\n try {\n const parsed = JSON.parse(text);\n const space = indent === 'tab' ? '\\t' : indent;\n return JSON.stringify(parsed, null, space);\n } catch {\n return text;\n }\n}\n\n/**\n * Minify JSON text (remove all whitespace).\n */\nexport function minifyJson(text: string): string {\n try {\n return JSON.stringify(JSON.parse(text));\n } catch {\n return text;\n }\n}\n\n/**\n * Sort object keys in JSON text.\n * @param order - \"asc\" for ascending, \"desc\" for descending, or a custom comparator.\n */\nexport function sortJsonKeys(\n text: string,\n order: 'asc' | 'desc' | ((a: string, b: string) => number) = 'asc',\n indent: IndentationType = 2\n): string {\n try {\n const parsed = JSON.parse(text);\n const sorted = deepSortKeys(parsed, order);\n const space = indent === 'tab' ? '\\t' : indent;\n return JSON.stringify(sorted, null, space);\n } catch {\n return text;\n }\n}\n\nfunction deepSortKeys(\n value: unknown,\n order: 'asc' | 'desc' | ((a: string, b: string) => number)\n): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => deepSortKeys(item, order));\n }\n\n if (value !== null && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n const comparator =\n typeof order === 'function'\n ? order\n : order === 'desc'\n ? (a: string, b: string) => b.localeCompare(a)\n : (a: string, b: string) => a.localeCompare(b);\n\n const sorted: Record<string, unknown> = {};\n const keys = Object.keys(obj).sort(comparator);\n for (const key of keys) {\n sorted[key] = deepSortKeys(obj[key], order);\n }\n return sorted;\n }\n\n return value;\n}\n\n/**\n * Compute document statistics from a JSON value.\n */\nexport interface JsonStats {\n properties: number;\n arrays: number;\n totalNodes: number;\n maxDepth: number;\n byteSize: number;\n}\n\nexport function computeStats(value: unknown, text?: string): JsonStats {\n const stats: JsonStats = {\n properties: 0,\n arrays: 0,\n totalNodes: 0,\n maxDepth: 0,\n byteSize: text ? new TextEncoder().encode(text).length : 0,\n };\n\n function walk(val: unknown, depth: number) {\n stats.totalNodes++;\n stats.maxDepth = Math.max(stats.maxDepth, depth);\n\n if (Array.isArray(val)) {\n stats.arrays++;\n val.forEach((item) => walk(item, depth + 1));\n } else if (val !== null && typeof val === 'object') {\n const keys = Object.keys(val as Record<string, unknown>);\n stats.properties += keys.length;\n keys.forEach((key) => walk((val as Record<string, unknown>)[key], depth + 1));\n }\n }\n\n if (value !== undefined) {\n walk(value, 0);\n }\n return stats;\n}\n","import type { ThemeConfig } from './types';\n\nexport const lightTheme: ThemeConfig = {\n name: 'light',\n bg: '#ffffff',\n fg: '#1e1e1e',\n border: '#e0e0e0',\n gutterBg: '#f5f5f5',\n gutterFg: '#999999',\n selection: '#add6ff',\n cursor: '#000000',\n keyColor: '#0451a5',\n stringColor: '#0a7e07',\n numberColor: '#098658',\n booleanColor: '#7a3e9d',\n nullColor: '#808080',\n bracketColor: '#333333',\n bracketMatchBg: '#bad0f847',\n errorColor: '#e51400',\n warningColor: '#bf8803',\n successColor: '#16825d',\n treeLine: '#d0d0d0',\n treeHover: '#f0f4ff',\n treeSelected: '#e0ecff',\n typeBadgeBg: '#eef2f7',\n};\n","import type { ThemeConfig } from './types';\n\nexport const darkTheme: ThemeConfig = {\n name: 'dark',\n bg: '#1e1e1e',\n fg: '#d4d4d4',\n border: '#3c3c3c',\n gutterBg: '#252526',\n gutterFg: '#858585',\n selection: '#264f78',\n cursor: '#ffffff',\n keyColor: '#9cdcfe',\n stringColor: '#ce9178',\n numberColor: '#b5cea8',\n booleanColor: '#569cd6',\n nullColor: '#808080',\n bracketColor: '#cccccc',\n bracketMatchBg: '#0064001a',\n errorColor: '#f14c4c',\n warningColor: '#cca700',\n successColor: '#89d185',\n treeLine: '#4a4a4a',\n treeHover: '#2a2d2e',\n treeSelected: '#094771',\n typeBadgeBg: '#2d2d30',\n};\n","import React, { useCallback, useState, useEffect, useMemo } from 'react';\nimport { Toolbar } from './components/Toolbar/Toolbar';\nimport { CodeEditor } from './components/CodeEditor/CodeEditor';\nimport { TreeEditor } from './components/TreeEditor/TreeEditor';\nimport { StatusBar } from './components/StatusBar/StatusBar';\nimport { useJsonParser } from './hooks/useJsonParser';\nimport { useUndoRedo } from './hooks/useUndoRedo';\nimport { useSearch } from './hooks/useSearch';\nimport { computeStats } from './core/formatter';\nimport { lightTheme } from './themes/light';\nimport { darkTheme } from './themes/dark';\nimport type { JsonEditorProps, EditorMode, CursorPosition } from './types/editor';\nimport type { ThemeConfig } from './themes/types';\n\n/**\n * A production-grade JSON editor React component.\n *\n * Supports code editing, tree editing, split view, JSON Schema validation,\n * undo/redo, search, theming, and full keyboard accessibility.\n */\nexport const JsonEditor: React.FC<JsonEditorProps> = ({\n value: externalValue,\n onChange,\n mode: controlledMode,\n onModeChange,\n schema,\n validators,\n validationMode = 'onChange',\n onValidate,\n theme = 'light',\n height = 400,\n readOnly = false,\n searchable = true,\n sortable = true,\n indentation = 2,\n lineNumbers = true,\n bracketMatching = true,\n maxSize,\n virtualize = 'auto',\n onError,\n onFocus,\n onBlur,\n className = '',\n style,\n 'aria-label': ariaLabel = 'JSON Editor',\n}) => {\n // Mode state (uncontrolled fallback)\n const [internalMode, setInternalMode] = useState<EditorMode>('code');\n const mode = controlledMode ?? internalMode;\n const handleModeChange = useCallback(\n (newMode: EditorMode) => {\n if (onModeChange) onModeChange(newMode);\n else setInternalMode(newMode);\n },\n [onModeChange]\n );\n\n // JSON parser + validation\n const parser = useJsonParser(externalValue, {\n schema,\n validators,\n debounce: validationMode === 'onChange' ? 300 : undefined,\n });\n\n // Undo/redo\n const history = useUndoRedo(parser.text, { maxHistory: 100 });\n\n // Sync external value changes\n useEffect(() => {\n if (externalValue !== undefined) {\n const text =\n typeof externalValue === 'string'\n ? externalValue\n : JSON.stringify(externalValue, null, indentation === 'tab' ? '\\t' : indentation);\n if (text !== parser.text) {\n parser.setText(text);\n history.reset(text);\n }\n }\n }, [externalValue]);\n\n // Notify parent of changes\n const handleTextChange = useCallback(\n (text: string) => {\n parser.setText(text);\n history.set(text);\n\n if (onChange) {\n try {\n const parsed = JSON.parse(text);\n onChange(parsed, text);\n } catch {\n // Pass raw text even if invalid — parent can check parseError\n onChange(undefined, text);\n }\n }\n },\n [parser, history, onChange]\n );\n\n const handleTreeChange = useCallback(\n (newValue: unknown) => {\n const indent = indentation === 'tab' ? '\\t' : indentation;\n const text = JSON.stringify(newValue, null, indent);\n handleTextChange(text);\n },\n [handleTextChange, indentation]\n );\n\n // Notify parent of validation\n useEffect(() => {\n if (onValidate) {\n onValidate(parser.validationErrors);\n }\n }, [parser.validationErrors, onValidate]);\n\n // Search\n const search = useSearch(parser.text);\n\n // Cursor\n const [cursor, setCursor] = useState<CursorPosition>({ line: 1, column: 1, offset: 0 });\n\n // Stats\n const stats = useMemo(\n () => (parser.parsedValue !== undefined ? computeStats(parser.parsedValue, parser.text) : null),\n [parser.parsedValue, parser.text]\n );\n\n // Theme resolution\n const resolvedTheme = useMemo((): ThemeConfig => {\n if (typeof theme === 'object') return theme;\n if (theme === 'dark') return darkTheme;\n if (theme === 'auto') {\n if (typeof window !== 'undefined' && window.matchMedia?.('(prefers-color-scheme: dark)').matches) {\n return darkTheme;\n }\n return lightTheme;\n }\n return lightTheme;\n }, [theme]);\n\n // CSS custom properties from theme\n const themeVars = useMemo(() => {\n const vars: Record<string, string> = {};\n vars['--mjr-bg'] = resolvedTheme.bg;\n vars['--mjr-fg'] = resolvedTheme.fg;\n vars['--mjr-border'] = resolvedTheme.border;\n vars['--mjr-gutter-bg'] = resolvedTheme.gutterBg;\n vars['--mjr-gutter-fg'] = resolvedTheme.gutterFg;\n vars['--mjr-selection'] = resolvedTheme.selection;\n vars['--mjr-cursor'] = resolvedTheme.cursor;\n vars['--mjr-key'] = resolvedTheme.keyColor;\n vars['--mjr-string'] = resolvedTheme.stringColor;\n vars['--mjr-number'] = resolvedTheme.numberColor;\n vars['--mjr-boolean'] = resolvedTheme.booleanColor;\n vars['--mjr-null'] = resolvedTheme.nullColor;\n vars['--mjr-bracket'] = resolvedTheme.bracketColor;\n vars['--mjr-bracket-match'] = resolvedTheme.bracketMatchBg;\n vars['--mjr-error'] = resolvedTheme.errorColor;\n vars['--mjr-warning'] = resolvedTheme.warningColor;\n vars['--mjr-success'] = resolvedTheme.successColor;\n vars['--mjr-tree-line'] = resolvedTheme.treeLine;\n vars['--mjr-tree-hover'] = resolvedTheme.treeHover;\n vars['--mjr-tree-selected'] = resolvedTheme.treeSelected;\n vars['--mjr-type-badge-bg'] = resolvedTheme.typeBadgeBg;\n return vars;\n }, [resolvedTheme]);\n\n // Keyboard shortcuts (global)\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n const mod = e.metaKey || e.ctrlKey;\n\n if (mod && e.key === 'z' && !e.shiftKey) {\n e.preventDefault();\n history.undo();\n // Sync parser with undone state\n const undoneText = history.current;\n if (undoneText !== undefined) {\n parser.setText(undoneText as string);\n }\n }\n\n if (mod && e.key === 'z' && e.shiftKey) {\n e.preventDefault();\n history.redo();\n const redoneText = history.current;\n if (redoneText !== undefined) {\n parser.setText(redoneText as string);\n }\n }\n\n if (mod && e.key === 'f') {\n e.preventDefault();\n if (searchable) search.open();\n }\n\n if (e.key === 'Escape') {\n search.close();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [history, parser, search, searchable]);\n\n const heightStyle = typeof height === 'number' ? `${height}px` : height;\n\n return (\n <div\n className={`mjr-editor ${className}`}\n style={{ ...themeVars, height: heightStyle, ...style } as React.CSSProperties}\n role=\"application\"\n aria-label={ariaLabel}\n onFocus={onFocus}\n onBlur={onBlur}\n data-testid=\"json-editor\"\n >\n <Toolbar\n mode={mode}\n onModeChange={handleModeChange}\n canUndo={history.canUndo}\n canRedo={history.canRedo}\n onUndo={() => {\n history.undo();\n }}\n onRedo={() => {\n history.redo();\n }}\n onFormat={() => parser.format(indentation === 'tab' ? '\\t' : indentation)}\n searchable={searchable}\n isSearchOpen={search.isActive}\n onToggleSearch={() => (search.isActive ? search.close() : search.open())}\n readOnly={readOnly}\n />\n\n <div className=\"mjr-editor__content\">\n {(mode === 'code' || mode === 'split') && (\n <div className={`mjr-editor__panel ${mode === 'split' ? 'mjr-editor__panel--half' : ''}`}>\n <CodeEditor\n value={parser.text}\n onChange={handleTextChange}\n parseError={parser.parseError}\n readOnly={readOnly}\n lineNumbers={lineNumbers}\n bracketMatching={bracketMatching}\n searchMatches={search.matches}\n currentMatchIndex={search.currentMatchIndex}\n onCursorChange={setCursor}\n />\n </div>\n )}\n\n {(mode === 'tree' || mode === 'split') && (\n <div className={`mjr-editor__panel ${mode === 'split' ? 'mjr-editor__panel--half' : ''}`}>\n <TreeEditor\n value={parser.parsedValue}\n onChange={handleTreeChange}\n readOnly={readOnly}\n />\n </div>\n )}\n </div>\n\n <StatusBar\n parseError={parser.parseError}\n validationErrors={parser.validationErrors}\n cursor={cursor}\n stats={stats}\n />\n </div>\n );\n};\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "modern-json-react",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "A production-grade, fully-featured JSON editor React component with tree view, code editing, JSON Schema validation, and accessibility-first design.",
|
|
5
|
+
"main": "dist/index.cjs.js",
|
|
6
|
+
"module": "dist/index.esm.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.esm.js",
|
|
12
|
+
"require": "./dist/index.cjs.js"
|
|
13
|
+
},
|
|
14
|
+
"./styles.css": "./dist/styles.css"
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"README.md",
|
|
19
|
+
"LICENSE"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"dev": "vite serve demo",
|
|
23
|
+
"build": "tsup",
|
|
24
|
+
"test": "vitest run",
|
|
25
|
+
"test:watch": "vitest",
|
|
26
|
+
"test:coverage": "vitest run --coverage",
|
|
27
|
+
"lint": "eslint src/ --ext .ts,.tsx",
|
|
28
|
+
"typecheck": "tsc --noEmit",
|
|
29
|
+
"format": "prettier --write 'src/**/*.{ts,tsx}'",
|
|
30
|
+
"prepublishOnly": "npm run build"
|
|
31
|
+
},
|
|
32
|
+
"peerDependencies": {
|
|
33
|
+
"react": ">=18.0.0",
|
|
34
|
+
"react-dom": ">=18.0.0"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@testing-library/jest-dom": "^6.6.3",
|
|
38
|
+
"@testing-library/react": "^16.1.0",
|
|
39
|
+
"@testing-library/user-event": "^14.5.2",
|
|
40
|
+
"@types/react": "^18.3.0",
|
|
41
|
+
"@types/react-dom": "^18.3.0",
|
|
42
|
+
"jsdom": "^25.0.0",
|
|
43
|
+
"react": "^18.3.0",
|
|
44
|
+
"react-dom": "^18.3.0",
|
|
45
|
+
"tsup": "^8.3.0",
|
|
46
|
+
"typescript": "^5.6.0",
|
|
47
|
+
"vite": "^6.0.0",
|
|
48
|
+
"vitest": "^2.1.0"
|
|
49
|
+
},
|
|
50
|
+
"keywords": [
|
|
51
|
+
"json",
|
|
52
|
+
"editor",
|
|
53
|
+
"react",
|
|
54
|
+
"json-editor",
|
|
55
|
+
"tree-view",
|
|
56
|
+
"json-schema",
|
|
57
|
+
"validation",
|
|
58
|
+
"typescript",
|
|
59
|
+
"accessible"
|
|
60
|
+
],
|
|
61
|
+
"author": "Dileep Pandey",
|
|
62
|
+
"license": "MIT",
|
|
63
|
+
"repository": {
|
|
64
|
+
"type": "git",
|
|
65
|
+
"url": ""
|
|
66
|
+
}
|
|
67
|
+
}
|