@exem-ui/react 0.3.4-next.20260724103452 → 0.3.4-next.20260727011908

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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/codeEditor/CodeEditorSourceProvider.tsx","../../src/codeEditor/format/useControllableViewMode.ts","../../src/codeEditor/format/CodeEditorFormatProvider.tsx","../../src/codeEditor/format/getDisplayValue.ts","../../src/codeEditor/copy/useCopyState.ts","../../src/codeEditor/copy/CopyTrigger.tsx","../../src/codeEditor/format/FormatToggle.tsx","../../src/codeEditor/format/FormatTrigger.tsx","../../src/codeEditor/monacoCodeEditor.ts","../../src/codeEditor/surface/useMonacoLoader.ts","../../src/codeEditor/surface/CodeEditorSurface.tsx","../../src/codeEditor/CodeEditor.tsx","../../src/codeEditor/format/useActiveFormatter.ts","../../src/codeEditor/jsonEditor/formatJsonValue.ts","../../src/codeEditor/jsonEditor/monacoJsonEditor.ts","../../src/codeEditor/jsonEditor/JsonEditor.tsx","../../src/codeEditor/sqlEditor/formatSqlValue.ts","../../src/codeEditor/sqlEditor/monacoSqlEditor.ts","../../src/codeEditor/sqlEditor/tokens.ts","../../src/codeEditor/sqlEditor/useSqlEditorTokenDecorations.ts","../../src/codeEditor/sqlEditor/SqlEditor.tsx","../../src/codeEditor/index.ts"],"names":["React","jsx","React3","React4","React5","Fragment","format","React6","useState","useEffect","React7","React8","cn","React9","React10","useRef","useCallback","React11","CodeEditor"],"mappings":"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","file":"index.mjs","sourcesContent":["import * as React from 'react';\n\n// 원본 값과 편집 가능 여부를 하위 컴포넌트에 공유합니다.\ntype CodeEditorSourceContextValue = {\n onSourceValueChange?: (value: string) => void;\n readOnly: boolean;\n sourceValue?: string;\n};\n\ntype CodeEditorSourceProviderProps = CodeEditorSourceContextValue & {\n children: React.ReactNode;\n};\n\nconst CodeEditorSourceContext = React.createContext<CodeEditorSourceContextValue | null>(null);\n\nconst useCodeEditorSource = () => {\n const context = React.useContext(CodeEditorSourceContext);\n\n if (!context) {\n throw new Error('CodeEditor components must be used within CodeEditor');\n }\n\n return context;\n};\n\nconst CodeEditorSourceProvider = ({\n children,\n onSourceValueChange,\n readOnly,\n sourceValue,\n}: CodeEditorSourceProviderProps) => {\n const contextValue = React.useMemo<CodeEditorSourceContextValue>(\n () => ({\n onSourceValueChange,\n readOnly,\n sourceValue,\n }),\n [onSourceValueChange, readOnly, sourceValue],\n );\n\n return (\n <CodeEditorSourceContext.Provider value={contextValue}>\n {children}\n </CodeEditorSourceContext.Provider>\n );\n};\n\nexport { CodeEditorSourceProvider, useCodeEditorSource };\nexport type { CodeEditorSourceContextValue, CodeEditorSourceProviderProps };\n","import { useCallback, useState } from 'react';\nimport type { CodeEditorViewMode } from './types';\n\n// viewMode를 controlled/uncontrolled 방식 모두에서 같은 API로 다룹니다.\ntype UseControllableViewModeOptions = {\n value?: CodeEditorViewMode;\n defaultValue?: CodeEditorViewMode;\n onChange?: (mode: CodeEditorViewMode) => void;\n};\n\nconst useControllableViewMode = ({\n value,\n defaultValue = 'original',\n onChange,\n}: UseControllableViewModeOptions) => {\n const [uncontrolledValue, setUncontrolledValue] = useState<CodeEditorViewMode>(defaultValue);\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : uncontrolledValue;\n\n const setValue = useCallback(\n (nextValue: CodeEditorViewMode) => {\n if (!isControlled) {\n setUncontrolledValue(nextValue);\n }\n\n onChange?.(nextValue);\n },\n [isControlled, onChange],\n );\n\n return [currentValue, setValue] as const;\n};\n\nexport { useControllableViewMode };\n","import * as React from 'react';\nimport type { CodeEditorFormatter, CodeEditorViewMode } from './types';\nimport { useControllableViewMode } from './useControllableViewMode';\n\n// 보기 모드와 현재 사용할 formatter를 하위 컴포넌트에 공유합니다.\ntype CodeEditorFormatContextValue = {\n activeFormatter?: CodeEditorFormatter | null;\n formatter?: CodeEditorFormatter;\n setActiveFormatter: (formatter?: CodeEditorFormatter | null) => void;\n setViewMode: (mode: CodeEditorViewMode) => void;\n viewMode: CodeEditorViewMode;\n};\n\ntype CodeEditorFormatProviderProps = {\n children: React.ReactNode;\n defaultViewMode?: CodeEditorViewMode;\n formatter?: CodeEditorFormatter;\n onViewModeChange?: (mode: CodeEditorViewMode) => void;\n viewMode?: CodeEditorViewMode;\n};\n\nconst CodeEditorFormatContext = React.createContext<CodeEditorFormatContextValue | null>(null);\n\nconst useCodeEditorFormat = () => {\n const context = React.useContext(CodeEditorFormatContext);\n\n if (!context) {\n throw new Error('CodeEditor components must be used within CodeEditor');\n }\n\n return context;\n};\n\nconst CodeEditorFormatProvider = ({\n children,\n defaultViewMode,\n formatter,\n onViewModeChange,\n viewMode: viewModeProp,\n}: CodeEditorFormatProviderProps) => {\n const [viewMode, setViewMode] = useControllableViewMode({\n value: viewModeProp,\n defaultValue: defaultViewMode,\n onChange: onViewModeChange,\n });\n const [activeFormatterOverride, setActiveFormatterOverride] = React.useState<\n CodeEditorFormatter | null | undefined\n >();\n const activeFormatter =\n activeFormatterOverride === undefined ? formatter : activeFormatterOverride;\n const setActiveFormatter = React.useCallback((nextFormatter?: CodeEditorFormatter | null) => {\n setActiveFormatterOverride(() => nextFormatter);\n }, []);\n const contextValue = React.useMemo<CodeEditorFormatContextValue>(\n () => ({\n activeFormatter,\n formatter,\n setActiveFormatter,\n setViewMode,\n viewMode,\n }),\n [activeFormatter, formatter, setActiveFormatter, setViewMode, viewMode],\n );\n\n return (\n <CodeEditorFormatContext.Provider value={contextValue}>\n {children}\n </CodeEditorFormatContext.Provider>\n );\n};\n\nexport { CodeEditorFormatProvider, useCodeEditorFormat };\nexport type { CodeEditorFormatContextValue, CodeEditorFormatProviderProps };\n","import type { CodeEditorFormatter, CodeEditorViewMode } from './types';\n\n// 원본 값과 viewMode를 받아 Monaco에 표시할 값을 만듭니다.\nconst getDisplayValue = (\n value: string | undefined,\n viewMode: CodeEditorViewMode,\n formatter?: CodeEditorFormatter | null,\n) => {\n const currentValue = value ?? '';\n\n if (viewMode !== 'formatted' || !formatter) {\n return currentValue;\n }\n\n return formatter(currentValue);\n};\n\nexport { getDisplayValue };\n","import * as React from 'react';\n\n// 복사 성공 표시를 일정 시간 유지하는 작은 상태 훅입니다.\nconst useCopyState = (copiedDuration: number) => {\n const [copied, setCopied] = React.useState(false);\n const timerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const markCopied = React.useCallback(() => {\n setCopied(true);\n\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n\n timerRef.current = setTimeout(() => {\n setCopied(false);\n timerRef.current = null;\n }, copiedDuration);\n }, [copiedDuration]);\n\n React.useEffect(() => {\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n };\n }, []);\n\n return { copied, markCopied };\n};\n\nexport { useCopyState };\n","import * as React from 'react';\nimport { useCodeEditorSource } from '../CodeEditorSourceProvider';\nimport { useCodeEditorFormat } from '../format/CodeEditorFormatProvider';\nimport { getDisplayValue } from '../format/getDisplayValue';\nimport type { CodeEditorCopyTriggerProps } from './types';\nimport { useCopyState } from './useCopyState';\n\n// 복사 버튼 UI는 소비자가 만들고, 이 컴포넌트는 상태와 액션만 제공합니다.\nconst CopyTrigger = ({\n children,\n copiedDuration = 1500,\n formatter,\n value,\n}: CodeEditorCopyTriggerProps) => {\n const { activeFormatter, viewMode } = useCodeEditorFormat();\n const { sourceValue } = useCodeEditorSource();\n const copyFormatter = formatter === undefined ? activeFormatter : formatter;\n const displayValue = getDisplayValue(value ?? sourceValue, viewMode, copyFormatter);\n const { copied, markCopied } = useCopyState(copiedDuration);\n\n const copy = React.useCallback(async () => {\n try {\n await navigator.clipboard.writeText(displayValue);\n } catch {\n // Clipboard API는 HTTPS/localhost 같은 secure context에서만 보장됩니다.\n throw new Error('CodeEditor.CopyTrigger: Clipboard copy failed.');\n }\n\n markCopied();\n }, [displayValue, markCopied]);\n\n const getCopyProps = React.useCallback(\n () => ({\n onClick: copy,\n type: 'button' as const,\n }),\n [copy],\n );\n\n return <>{children({ copied, copy, getCopyProps })}</>;\n};\n\nCopyTrigger.displayName = 'CodeEditor.CopyTrigger';\n\nexport { CopyTrigger };\n","import * as React from 'react';\nimport { useCodeEditorFormat } from './CodeEditorFormatProvider';\nimport type { CodeEditorFormatToggleProps } from './types';\n\n// original/formatted 보기 전환 UI를 render prop으로 구성하게 합니다.\nconst FormatToggle = ({ children }: CodeEditorFormatToggleProps) => {\n const { viewMode, setViewMode } = useCodeEditorFormat();\n const formatted = viewMode === 'formatted';\n\n const toggle = React.useCallback(() => {\n setViewMode(formatted ? 'original' : 'formatted');\n }, [formatted, setViewMode]);\n\n const getToggleProps = React.useCallback(\n () => ({\n onClick: toggle,\n 'aria-pressed': formatted,\n type: 'button' as const,\n }),\n [formatted, toggle],\n );\n\n return <>{children({ formatted, toggle, getToggleProps })}</>;\n};\n\nFormatToggle.displayName = 'CodeEditor.FormatToggle';\n\nexport { FormatToggle };\n","import * as React from 'react';\nimport { useCodeEditorSource } from '../CodeEditorSourceProvider';\nimport { useCodeEditorFormat } from './CodeEditorFormatProvider';\nimport type { CodeEditorFormatTriggerProps } from './types';\n\n// 원본 값을 formatter 결과로 바꾸는 포맷 액션을 제공합니다.\nconst FormatTrigger = ({ children }: CodeEditorFormatTriggerProps) => {\n const { onSourceValueChange, readOnly, sourceValue } = useCodeEditorSource();\n const { activeFormatter, setViewMode } = useCodeEditorFormat();\n const disabled = readOnly || !activeFormatter || !onSourceValueChange;\n\n const format = React.useCallback(() => {\n if (readOnly || !activeFormatter || !onSourceValueChange) {\n return;\n }\n\n onSourceValueChange(activeFormatter(sourceValue ?? ''));\n setViewMode('original');\n }, [activeFormatter, onSourceValueChange, readOnly, setViewMode, sourceValue]);\n\n const getFormatProps = React.useCallback(\n () => ({\n disabled,\n onClick: format,\n type: 'button' as const,\n }),\n [disabled, format],\n );\n\n return <>{children({ format, getFormatProps })}</>;\n};\n\nFormatTrigger.displayName = 'CodeEditor.FormatTrigger';\n\nexport { FormatTrigger };\n","import { loader, type Monaco } from '@monaco-editor/react';\nimport type { editor as MonacoEditor } from 'monaco-editor';\n\n// Monaco 전역 로더, 테마, 언어별 색상 규칙을 CodeEditor 기준으로 묶습니다.\nlet localMonacoLoaderPromise: Promise<void> | null = null;\nlet configuredMonaco: Monaco | null = null;\nconst codeEditorSemanticColorStyleId = 'exem-code-editor-semantic-colors';\n\n/**\n * Monaco 테마는 페이지 전역으로 하나만 적용되므로 단일 테마 이름을 사용합니다.\n * 언어별 색 규칙은 registerCodeEditorThemeRules로 이 테마에 합쳐집니다.\n */\nconst codeEditorThemeName = 'exem-code';\n\nconst defaultCodeEditorOptions: MonacoEditor.IStandaloneEditorConstructionOptions = {\n automaticLayout: true,\n bracketPairColorization: { enabled: false },\n domReadOnly: true,\n folding: false,\n fontFamily: 'JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace',\n fontSize: 14,\n glyphMargin: false,\n guides: {\n highlightActiveIndentation: false,\n indentation: false,\n },\n lineDecorationsWidth: 0,\n lineHeight: 20,\n lineNumbers: 'on',\n lineNumbersMinChars: 4,\n minimap: { enabled: false },\n overviewRulerLanes: 0,\n padding: {\n bottom: 8,\n top: 8,\n },\n readOnly: true,\n renderLineHighlight: 'none',\n renderWhitespace: 'none',\n scrollbar: {\n alwaysConsumeMouseWheel: false,\n horizontal: 'auto',\n horizontalScrollbarSize: 10,\n horizontalSliderSize: 6,\n useShadows: false,\n vertical: 'hidden',\n verticalScrollbarSize: 10,\n verticalSliderSize: 6,\n },\n scrollBeyondLastLine: false,\n stickyScroll: {\n enabled: false,\n },\n wordWrap: 'off',\n};\n\n// 배열 순서가 Monaco mtkN 번호를 결정합니다.\nconst codeEditorSemanticColors = [\n '--color-text-secondary',\n '--color-tint-foreground-violet',\n '--color-tint-foreground-teal',\n '--color-tint-foreground-pink',\n '--color-text-disabled',\n '--color-text-tertiary',\n '--color-tint-foreground-orange',\n] as const;\n\ntype CodeEditorSemanticColorVariable = (typeof codeEditorSemanticColors)[number];\ntype CodeEditorSemanticColorThemeRule = {\n token: string;\n cssVariable: CodeEditorSemanticColorVariable;\n fontStyle?: string;\n};\ntype CodeEditorThemeRuleContributor = () => MonacoEditor.ITokenThemeRule[];\n\nconst codeEditorThemeRuleContributors = new Set<CodeEditorThemeRuleContributor>();\n\n/**\n * 언어별 토큰 색 규칙을 공용 테마에 등록합니다.\n * 각 에디터 폴더(sqlEditor, jsonEditor)가 자신의 규칙을 직접 등록하므로,\n * 폴더를 제거하면 해당 언어의 색 규칙도 함께 사라집니다.\n */\nconst registerCodeEditorThemeRules = (contributor: CodeEditorThemeRuleContributor) => {\n codeEditorThemeRuleContributors.add(contributor);\n\n if (configuredMonaco) {\n configuredMonaco.editor.defineTheme(codeEditorThemeName, buildCodeEditorTheme());\n }\n};\n\nconst withoutHash = (color: string) => color.replace(/^#/, '');\n\n/**\n * Monaco 테마에는 CSS 변수를 직접 넣기 어려워 hex 마커로 슬롯을 고정합니다.\n */\nconst createCodeEditorTokenMarker = (index: number) =>\n `#${String(index + 1).padStart(6, '0')}` as const;\n\nconst getCodeEditorSemanticColorMarker = (cssVariable: CodeEditorSemanticColorVariable) =>\n createCodeEditorTokenMarker(codeEditorSemanticColors.indexOf(cssVariable));\n\n/**\n * 언어 토큰을 Monaco가 받는 foreground 마커로 변환합니다.\n */\nconst createCodeEditorThemeRules = (\n rules: CodeEditorSemanticColorThemeRule[],\n): MonacoEditor.ITokenThemeRule[] =>\n rules.map(({ token, cssVariable, fontStyle }) => {\n const themeRule: MonacoEditor.ITokenThemeRule = {\n token,\n foreground: withoutHash(getCodeEditorSemanticColorMarker(cssVariable)),\n };\n\n if (fontStyle) {\n themeRule.fontStyle = fontStyle;\n }\n\n return themeRule;\n });\n\n/**\n * Monaco가 만든 mtkN class를 실제 시멘틱 CSS 변수에 연결합니다.\n */\nconst getCodeEditorSemanticColorStyleSheet = () =>\n codeEditorSemanticColors\n .map(\n (cssVariable, index) =>\n `.exem-code-editor-monaco .mtk${index + 1} {\\n color: var(${cssVariable});\\n}`,\n )\n .join('\\n\\n');\n\n/**\n * 에디터가 처음 로드될 때 토큰 색 연결 CSS를 한 번만 주입합니다.\n */\nconst ensureCodeEditorSemanticColorStyles = () => {\n if (typeof document === 'undefined' || document.getElementById(codeEditorSemanticColorStyleId)) {\n return;\n }\n\n const styleElement = document.createElement('style');\n styleElement.id = codeEditorSemanticColorStyleId;\n styleElement.textContent = getCodeEditorSemanticColorStyleSheet();\n document.head.append(styleElement);\n};\n\nconst baseCodeEditorThemeRules: MonacoEditor.ITokenThemeRule[] = createCodeEditorThemeRules([\n { token: '', cssVariable: '--color-text-secondary' },\n { token: 'attribute.name', cssVariable: '--color-tint-foreground-violet' },\n { token: 'comment', cssVariable: '--color-text-disabled' },\n { token: 'delimiter', cssVariable: '--color-text-secondary' },\n { token: 'keyword', cssVariable: '--color-tint-foreground-violet' },\n { token: 'number', cssVariable: '--color-tint-foreground-pink' },\n { token: 'string', cssVariable: '--color-tint-foreground-teal' },\n { token: 'string.key', cssVariable: '--color-tint-foreground-violet' },\n { token: 'type', cssVariable: '--color-tint-foreground-violet' },\n { token: 'variable', cssVariable: '--color-text-secondary' },\n]);\n\nconst codeEditorEncodedTokenColors = codeEditorSemanticColors.map((_, index) =>\n createCodeEditorTokenMarker(index),\n);\n\n/**\n * Monaco theme에는 토큰 규칙만 넣고, UI 색은 CSS 변수로 관리합니다.\n */\nconst buildCodeEditorTheme = (): MonacoEditor.IStandaloneThemeData => ({\n base: 'vs',\n inherit: false,\n encodedTokensColors: codeEditorEncodedTokenColors,\n rules: [\n ...baseCodeEditorThemeRules,\n ...[...codeEditorThemeRuleContributors].flatMap((contributor) => contributor()),\n ],\n colors: {},\n});\n\nconst hasCodeEditorLanguage = (monaco: Monaco, languageId: string) =>\n monaco.languages.getLanguages().some((language: { id: string }) => language.id === languageId);\n\nconst setupLocalMonacoLoader = () => {\n localMonacoLoaderPromise ??= import('monaco-editor').then((monaco) => {\n ensureCodeEditorSemanticColorStyles();\n loader.config({ monaco });\n configuredMonaco = monaco;\n monaco.editor.defineTheme(codeEditorThemeName, buildCodeEditorTheme());\n });\n\n return localMonacoLoaderPromise;\n};\n\nexport {\n buildCodeEditorTheme,\n codeEditorThemeName,\n createCodeEditorTokenMarker,\n createCodeEditorThemeRules,\n defaultCodeEditorOptions,\n getCodeEditorSemanticColorStyleSheet,\n hasCodeEditorLanguage,\n registerCodeEditorThemeRules,\n setupLocalMonacoLoader,\n};\nexport type {\n CodeEditorSemanticColorVariable,\n CodeEditorSemanticColorThemeRule,\n CodeEditorThemeRuleContributor,\n};\n","import { useEffect, useState } from 'react';\nimport { setupLocalMonacoLoader } from '../monacoCodeEditor';\n\n// Monaco 로더 준비 상태와 로드 실패를 React 렌더 흐름으로 전달합니다.\nconst useMonacoLoader = () => {\n const [monacoLoaderError, setMonacoLoaderError] = useState<unknown>(null);\n const [monacoLoaderReady, setMonacoLoaderReady] = useState(false);\n\n useEffect(() => {\n let canceled = false;\n\n setupLocalMonacoLoader()\n .then(() => {\n if (!canceled) {\n setMonacoLoaderReady(true);\n }\n })\n .catch((error: unknown) => {\n if (!canceled) {\n setMonacoLoaderError(error);\n }\n });\n\n return () => {\n canceled = true;\n };\n }, []);\n\n return { monacoLoaderError, monacoLoaderReady };\n};\n\nexport { useMonacoLoader };\n","import { cn } from '@exem-ui/core/utils';\nimport { type BeforeMount, Editor, type OnMount } from '@monaco-editor/react';\nimport type { editor as MonacoEditor } from 'monaco-editor';\nimport * as React from 'react';\nimport { useCodeEditorSource } from '../CodeEditorSourceProvider';\nimport { useCodeEditorFormat } from '../format/CodeEditorFormatProvider';\nimport { getDisplayValue } from '../format/getDisplayValue';\nimport type { CodeEditorFormatter, CodeEditorViewMode } from '../format/types';\nimport { codeEditorThemeName, defaultCodeEditorOptions } from '../monacoCodeEditor';\nimport { useMonacoLoader } from './useMonacoLoader';\n\n// 공통 Monaco Surface로 원본 값, 보기 모드, 읽기 전용 규칙을 실제 에디터에 반영합니다.\ntype CodeEditorOptions = Omit<MonacoEditor.IStandaloneEditorConstructionOptions, 'theme'>;\n\ntype CodeEditorSurfaceProps = {\n className?: string;\n editorClassName?: string;\n height?: number | string;\n language?: string;\n value?: string;\n formatter?: CodeEditorFormatter | null;\n onChange?: (value?: string) => void;\n options?: CodeEditorOptions;\n readOnly?: boolean;\n beforeMount?: BeforeMount;\n onMount?: OnMount;\n};\n\ntype GetCodeEditorSurfaceReadOnlyOptions = {\n contextReadOnly: boolean;\n readOnly?: boolean;\n viewMode: CodeEditorViewMode;\n};\n\nconst getCodeEditorSurfaceReadOnly = ({\n contextReadOnly,\n readOnly,\n viewMode,\n}: GetCodeEditorSurfaceReadOnlyOptions) => {\n if (viewMode === 'formatted') {\n return true;\n }\n\n return readOnly ?? contextReadOnly;\n};\n\nconst CodeEditorSurface = React.forwardRef<HTMLDivElement, CodeEditorSurfaceProps>(\n (\n {\n className,\n editorClassName,\n height,\n language = 'plaintext',\n value,\n formatter,\n onChange,\n options,\n readOnly,\n beforeMount,\n onMount,\n },\n ref,\n ) => {\n const { formatter: contextFormatter, viewMode } = useCodeEditorFormat();\n const {\n onSourceValueChange,\n readOnly: contextReadOnly,\n sourceValue: contextValue,\n } = useCodeEditorSource();\n const { monacoLoaderError, monacoLoaderReady } = useMonacoLoader();\n const surfaceFormatter = formatter === undefined ? contextFormatter : formatter;\n const displayValue = getDisplayValue(value ?? contextValue, viewMode, surfaceFormatter);\n const surfaceReadOnly = getCodeEditorSurfaceReadOnly({\n contextReadOnly,\n readOnly,\n viewMode,\n });\n const handleChange = React.useCallback(\n (nextValue?: string) => {\n if (onChange) {\n onChange(nextValue);\n return;\n }\n\n if (surfaceReadOnly) {\n return;\n }\n\n onSourceValueChange?.(nextValue ?? '');\n },\n [onChange, onSourceValueChange, surfaceReadOnly],\n );\n\n if (monacoLoaderError) {\n throw monacoLoaderError;\n }\n\n return (\n <div\n ref={ref}\n className={cn(\n 'h-[400px] min-h-[160px] overflow-hidden rounded-medium border border-border-primary bg-background-primary',\n className,\n )}\n style={height === undefined ? undefined : { height }}\n >\n {monacoLoaderReady ? (\n <Editor\n beforeMount={beforeMount}\n className={cn('exem-code-editor-monaco size-full', editorClassName)}\n height=\"100%\"\n language={language}\n onChange={handleChange}\n onMount={onMount}\n options={{\n ...defaultCodeEditorOptions,\n ...options,\n domReadOnly: surfaceReadOnly,\n readOnly: surfaceReadOnly,\n }}\n theme={codeEditorThemeName}\n value={displayValue}\n />\n ) : null}\n </div>\n );\n },\n);\n\nCodeEditorSurface.displayName = 'CodeEditor.Surface';\n\nexport { CodeEditorSurface };\nexport { getCodeEditorSurfaceReadOnly };\nexport type { CodeEditorOptions, CodeEditorSurfaceProps, GetCodeEditorSurfaceReadOnlyOptions };\n","import { cn } from '@exem-ui/core/utils';\nimport * as React from 'react';\nimport { CodeEditorSourceProvider } from './CodeEditorSourceProvider';\nimport { CopyTrigger } from './copy/CopyTrigger';\nimport { CodeEditorFormatProvider } from './format/CodeEditorFormatProvider';\nimport { FormatToggle } from './format/FormatToggle';\nimport { FormatTrigger } from './format/FormatTrigger';\nimport type { CodeEditorFormatter, CodeEditorViewMode } from './format/types';\nimport { CodeEditorSurface } from './surface/CodeEditorSurface';\n\n// CodeEditor의 공통 상태와 합성 API를 묶는 루트 컴포넌트입니다.\ntype CodeEditorProps = {\n value?: string;\n onValueChange?: (value: string) => void;\n readOnly?: boolean;\n defaultViewMode?: CodeEditorViewMode;\n viewMode?: CodeEditorViewMode;\n onViewModeChange?: (mode: CodeEditorViewMode) => void;\n formatter?: CodeEditorFormatter;\n className?: string;\n children: React.ReactNode;\n};\n\ntype CodeEditorComponent = React.ForwardRefExoticComponent<\n CodeEditorProps & React.RefAttributes<HTMLDivElement>\n> & {\n Surface: typeof CodeEditorSurface;\n FormatToggle: typeof FormatToggle;\n FormatTrigger: typeof FormatTrigger;\n CopyTrigger: typeof CopyTrigger;\n};\n\nconst CodeEditor = React.forwardRef<HTMLDivElement, CodeEditorProps>(\n (\n {\n value,\n onValueChange,\n readOnly = true,\n defaultViewMode,\n viewMode: viewModeProp,\n onViewModeChange,\n formatter,\n className,\n children,\n },\n ref,\n ) => {\n return (\n <CodeEditorSourceProvider\n onSourceValueChange={onValueChange}\n readOnly={readOnly}\n sourceValue={value}\n >\n <CodeEditorFormatProvider\n defaultViewMode={defaultViewMode}\n formatter={formatter}\n onViewModeChange={onViewModeChange}\n viewMode={viewModeProp}\n >\n <div ref={ref} className={cn('flex min-w-0 flex-col gap-2', className)}>\n {children}\n </div>\n </CodeEditorFormatProvider>\n </CodeEditorSourceProvider>\n );\n },\n) as CodeEditorComponent;\n\nCodeEditor.Surface = CodeEditorSurface;\nCodeEditor.FormatToggle = FormatToggle;\nCodeEditor.FormatTrigger = FormatTrigger;\nCodeEditor.CopyTrigger = CopyTrigger;\n\nCodeEditor.displayName = 'CodeEditor';\n\nexport { CodeEditor };\nexport type { CodeEditorComponent, CodeEditorProps };\nexport type { CodeEditorCopyTriggerProps, CopyTriggerRenderProps } from './copy/types';\nexport type {\n CodeEditorFormatToggleProps,\n CodeEditorFormatTriggerProps,\n CodeEditorFormatter,\n CodeEditorViewMode,\n FormatToggleRenderProps,\n FormatTriggerRenderProps,\n} from './format/types';\nexport type { CodeEditorOptions, CodeEditorSurfaceProps } from './surface/CodeEditorSurface';\n","import * as React from 'react';\nimport { useCodeEditorFormat } from './CodeEditorFormatProvider';\nimport type { CodeEditorFormatter } from './types';\n\n// Surface가 제공하는 formatter를 루트 포맷 컨트롤에 등록합니다.\nconst useActiveFormatter = (formatter?: CodeEditorFormatter | null) => {\n const { setActiveFormatter } = useCodeEditorFormat();\n\n React.useEffect(() => {\n setActiveFormatter(formatter);\n\n return () => {\n setActiveFormatter(undefined);\n };\n }, [formatter, setActiveFormatter]);\n};\n\nexport { useActiveFormatter };\n","import type { CodeEditorFormatter } from '../CodeEditor';\n\n// JSON 값은 파싱 가능한 경우에만 보기 좋게 정렬합니다.\nconst formatJsonValue: CodeEditorFormatter = (value) => {\n try {\n return JSON.stringify(JSON.parse(value), null, 2);\n } catch {\n // 깨진 JSON은 포맷하지 않고 원본을 그대로 보여준다.\n return value;\n }\n};\n\nexport { formatJsonValue };\n","import type { Monaco } from '@monaco-editor/react';\nimport type { CodeEditorThemeRuleContributor } from '../monacoCodeEditor';\nimport { createCodeEditorThemeRules, hasCodeEditorLanguage } from '../monacoCodeEditor';\n\n// Monaco에 JSON 전용 언어와 디자인 토큰 색상 규칙을 등록합니다.\nconst jsonEditorLanguageId = 'exem-json';\n// Monaco 언어 등록은 페이지 전역이므로 에디터가 여러 개여도 한 번만 수행한다.\nlet isJsonEditorLanguageConfigured = false;\n\nconst defineJsonEditorLanguage = (monaco: Monaco) => {\n if (isJsonEditorLanguageConfigured) {\n return;\n }\n\n if (!hasCodeEditorLanguage(monaco, jsonEditorLanguageId)) {\n monaco.languages.register({ id: jsonEditorLanguageId });\n }\n\n monaco.languages.setMonarchTokensProvider(jsonEditorLanguageId, {\n tokenizer: {\n root: [\n [/\\s+/, ''],\n [/[{}]/, 'delimiter.bracket.json'],\n [/\\[/, 'delimiter.array.json'],\n [/\\]/, 'delimiter.array.json'],\n [/:/, 'delimiter.colon.json'],\n [/,/, 'delimiter.comma.json'],\n [/\\b(?:true|false)\\b/, 'boolean.json'],\n [/\\bnull\\b/, 'keyword.json'],\n [/-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/, 'number.json'],\n // 뒤에 콜론이 오면 key, 아니면 value 문자열로 구분한다.\n [/\"(?:\\\\.|[^\"\\\\])*\"(?=\\s*:)/, 'string.key.json'],\n [/\"(?:\\\\.|[^\"\\\\])*\"/, 'string.value.json'],\n ],\n },\n });\n\n isJsonEditorLanguageConfigured = true;\n};\n\n// JSON 문법 토큰을 Figma 시멘틱 색에 연결합니다.\nconst getJsonEditorThemeRules: CodeEditorThemeRuleContributor = () =>\n createCodeEditorThemeRules([\n { token: 'boolean.json', cssVariable: '--color-text-secondary' },\n { token: 'delimiter.array.json', cssVariable: '--color-text-secondary' },\n { token: 'delimiter.bracket.json', cssVariable: '--color-text-secondary' },\n { token: 'delimiter.colon.json', cssVariable: '--color-text-secondary' },\n { token: 'delimiter.comma.json', cssVariable: '--color-text-secondary' },\n { token: 'keyword.json', cssVariable: '--color-text-tertiary' },\n { token: 'number.json', cssVariable: '--color-tint-foreground-violet' },\n { token: 'string.key.json', cssVariable: '--color-tint-foreground-teal' },\n { token: 'string.value.json', cssVariable: '--color-tint-foreground-orange' },\n ]);\n\nexport { defineJsonEditorLanguage, getJsonEditorThemeRules, jsonEditorLanguageId };\n","import { cn } from '@exem-ui/core/utils';\nimport type { BeforeMount } from '@monaco-editor/react';\nimport * as React from 'react';\nimport { CodeEditor, type CodeEditorFormatter, type CodeEditorSurfaceProps } from '../CodeEditor';\nimport { useActiveFormatter } from '../format/useActiveFormatter';\nimport { registerCodeEditorThemeRules } from '../monacoCodeEditor';\nimport { formatJsonValue } from './formatJsonValue';\nimport {\n defineJsonEditorLanguage,\n getJsonEditorThemeRules,\n jsonEditorLanguageId,\n} from './monacoJsonEditor';\n\n// JSON 전용 Monaco 언어와 formatter를 Surface에 연결합니다.\nregisterCodeEditorThemeRules(getJsonEditorThemeRules);\n\ntype CodeEditorJSONProps = Omit<CodeEditorSurfaceProps, 'language'>;\n\nconst CodeEditorJSON = React.forwardRef<HTMLDivElement, CodeEditorJSONProps>(\n ({ beforeMount, editorClassName, formatter, ...props }, ref) => {\n const jsonFormatter: CodeEditorFormatter | null =\n formatter === undefined ? formatJsonValue : formatter;\n\n useActiveFormatter(jsonFormatter);\n\n const handleBeforeMount = React.useCallback<BeforeMount>(\n (monaco) => {\n defineJsonEditorLanguage(monaco);\n beforeMount?.(monaco);\n },\n [beforeMount],\n );\n\n return (\n <CodeEditor.Surface\n ref={ref}\n {...props}\n beforeMount={handleBeforeMount}\n editorClassName={cn('exem-json-editor-monaco', editorClassName)}\n formatter={jsonFormatter}\n language={jsonEditorLanguageId}\n />\n );\n },\n);\n\nCodeEditorJSON.displayName = 'CodeEditor.JSON';\n\nexport { CodeEditorJSON };\nexport type { CodeEditorJSONProps };\n","import { format, type SqlLanguage } from 'sql-formatter';\n\n// sql-formatter 방언 차이를 흡수해 SQL Surface용 formatter를 만듭니다.\ntype SqlEditorDbType = SqlLanguage | 'oracle';\n\n// sql-formatter에 oracle 방언이 없어서 plsql로 대신한다.\nconst resolveSqlFormatterLanguage = (dbType: SqlEditorDbType): SqlLanguage => {\n return dbType === 'oracle' ? 'plsql' : dbType;\n};\n\n/**\n * 같은 값이 화면 표시·복사 등 여러 곳에서 포맷되므로 마지막 결과를 캐시합니다.\n */\nconst createSqlFormatter = (dbType: SqlEditorDbType = 'sql') => {\n let lastValue: string | null = null;\n let lastResult = '';\n\n return (value: string) => {\n if (value === lastValue) {\n return lastResult;\n }\n\n lastValue = value;\n\n try {\n lastResult = format(value, {\n language: resolveSqlFormatterLanguage(dbType),\n // :region 같은 바인드 변수를 파라미터로 인식시켜 포맷 중 깨지지 않게 한다.\n paramTypes: { named: [':'] },\n });\n } catch {\n // 문법이 깨진 SQL은 포맷하지 않고 원본을 그대로 보여준다.\n lastResult = value;\n }\n\n return lastResult;\n };\n};\n\nexport { createSqlFormatter };\nexport type { SqlEditorDbType };\n","import type { Monaco } from '@monaco-editor/react';\nimport type { CodeEditorThemeRuleContributor } from '../monacoCodeEditor';\nimport { createCodeEditorThemeRules, hasCodeEditorLanguage } from '../monacoCodeEditor';\n\n// Monaco에 SQL 전용 언어와 디자인 토큰 색상 규칙을 등록합니다.\nconst sqlEditorLanguageId = 'exem-sql';\n// Monaco 언어 등록은 페이지 전역이므로 에디터가 여러 개여도 한 번만 수행한다.\nlet isSqlEditorLanguageConfigured = false;\n\nconst sqlEditorKeywords = [\n 'ADD',\n 'ALL',\n 'ALTER',\n 'AND',\n 'AS',\n 'ASC',\n 'BETWEEN',\n 'BY',\n 'CASE',\n 'COUNT',\n 'CREATE',\n 'DELETE',\n 'DESC',\n 'DISTINCT',\n 'DROP',\n 'ELSE',\n 'END',\n 'EXISTS',\n 'FROM',\n 'GROUP',\n 'HAVING',\n 'IN',\n 'INSERT',\n 'IS',\n 'JOIN',\n 'LEFT',\n 'LIKE',\n 'LIMIT',\n 'NOT',\n 'ON',\n 'OR',\n 'ORDER',\n 'RIGHT',\n 'SELECT',\n 'SET',\n 'SUM',\n 'THEN',\n 'UNION',\n 'UPDATE',\n 'VALUES',\n 'WHEN',\n 'WHERE',\n];\n\nconst sqlEditorBooleans = ['FALSE', 'TRUE'];\nconst sqlEditorConstants = ['NULL'];\n\nconst defineSqlEditorLanguage = (monaco: Monaco) => {\n if (isSqlEditorLanguageConfigured) {\n return;\n }\n\n if (!hasCodeEditorLanguage(monaco, sqlEditorLanguageId)) {\n monaco.languages.register({ id: sqlEditorLanguageId });\n }\n\n monaco.languages.setMonarchTokensProvider(sqlEditorLanguageId, {\n ignoreCase: true,\n keywords: sqlEditorKeywords,\n booleans: sqlEditorBooleans,\n constants: sqlEditorConstants,\n tokenizer: {\n root: [\n [/--.*$/, 'comment.sql'],\n [/\\/\\*/, { token: 'comment.quote.sql', next: '@comment' }],\n [/'(?:[^']|'')*'/, 'string.sql'],\n [/\"(?:\"\"|[^\"])*\"/, 'identifier.quote.sql'],\n [/\\b\\d+(?:\\.\\d+)?\\b/, 'number.sql'],\n [/:[A-Za-z_][\\w$#]*/, 'variable.bind.sql'],\n [/[(),;]/, 'delimiter.sql'],\n [/[<>!=]=?|[-+*/%]/, 'operator.sql'],\n [\n /[A-Za-z_][\\w$#]*/,\n {\n cases: {\n '@booleans': 'boolean.sql',\n // 디자인 스펙상 NULL은 숫자와 같은 색이라 number 토큰으로 분류한다.\n '@constants': 'number.sql',\n '@keywords': 'keyword.sql',\n '@default': 'identifier.sql',\n },\n },\n ],\n ],\n comment: [\n [/[^*/]+/, 'comment.quote.sql'],\n [/\\*\\//, { token: 'comment.quote.sql', next: '@pop' }],\n [/[*/]/, 'comment.quote.sql'],\n ],\n },\n });\n\n isSqlEditorLanguageConfigured = true;\n};\n\n// SQL 문법 토큰을 Figma 시멘틱 색에 연결합니다.\nconst getSqlEditorThemeRules: CodeEditorThemeRuleContributor = () =>\n createCodeEditorThemeRules([\n { token: 'identifier.sql', cssVariable: '--color-text-secondary' },\n { token: 'identifier.quote.sql', cssVariable: '--color-text-secondary' },\n { token: 'variable.bind.sql', cssVariable: '--color-tint-foreground-orange' },\n { token: 'boolean.sql', cssVariable: '--color-text-tertiary' },\n { token: 'keyword.sql', cssVariable: '--color-tint-foreground-violet' },\n { token: 'operator.sql', cssVariable: '--color-text-secondary' },\n { token: 'number.sql', cssVariable: '--color-tint-foreground-pink' },\n { token: 'string.sql', cssVariable: '--color-tint-foreground-teal' },\n { token: 'comment.sql', cssVariable: '--color-text-disabled', fontStyle: 'italic' },\n { token: 'comment.quote.sql', cssVariable: '--color-text-disabled', fontStyle: 'italic' },\n { token: 'delimiter.sql', cssVariable: '--color-text-secondary' },\n ]);\n\nexport { defineSqlEditorLanguage, getSqlEditorThemeRules, sqlEditorLanguageId };\n","// SQL 문자열에서 강조 대상 토큰을 찾아 Monaco range로 변환합니다.\ntype SqlEditorTokenRange = {\n startLineNumber: number;\n startColumn: number;\n endLineNumber: number;\n endColumn: number;\n};\n\ntype SqlEditorToken = {\n id?: string;\n match: string;\n className?: string;\n};\n\ntype ParsedSqlEditorToken = {\n token: SqlEditorToken;\n text: string;\n range: SqlEditorTokenRange;\n startOffset: number;\n endOffset: number;\n className?: string;\n};\n\ntype ProtectedSpan = {\n start: number;\n end: number;\n};\n\n// SQL 식별자에 올 수 있는 문자. $와 #은 Oracle 식별자에서 허용된다.\nconst identifierBoundaryPattern = /[A-Za-z0-9_$#]/;\n\nconst escapeRegExp = (value: string) => {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n};\n\nconst isProtectedOffset = (spans: ProtectedSpan[], start: number, end: number) => {\n return spans.some((span) => start < span.end && end > span.start);\n};\n\nconst getLineCommentEnd = (value: string, start: number) => {\n const end = value.indexOf('\\n', start + 2);\n return end === -1 ? value.length : end;\n};\n\nconst getBlockCommentEnd = (value: string, start: number) => {\n const end = value.indexOf('*/', start + 2);\n return end === -1 ? value.length : end + 2;\n};\n\nconst getQuotedSpanEnd = (value: string, start: number) => {\n const quote = value[start];\n let index = start + 1;\n\n while (index < value.length) {\n // 따옴표 두 번('')은 SQL 이스케이프이므로 닫는 따옴표로 보지 않는다.\n if (value[index] === quote && value[index + 1] === quote) {\n index += 2;\n continue;\n }\n\n if (value[index] === quote) {\n return index + 1;\n }\n\n index += 1;\n }\n\n return index;\n};\n\n/** 주석·문자열 내부에서는 토큰을 강조하지 않도록 해당 구간을 수집합니다. */\nconst getProtectedSpans = (value: string): ProtectedSpan[] => {\n const spans: ProtectedSpan[] = [];\n let index = 0;\n\n while (index < value.length) {\n const char = value[index];\n const next = value[index + 1];\n\n if (char === '-' && next === '-') {\n const start = index;\n index = getLineCommentEnd(value, start);\n spans.push({ start, end: index });\n continue;\n }\n\n if (char === '/' && next === '*') {\n const start = index;\n index = getBlockCommentEnd(value, start);\n spans.push({ start, end: index });\n continue;\n }\n\n if (char === \"'\" || char === '\"') {\n const start = index;\n index = getQuotedSpanEnd(value, start);\n spans.push({ start, end: index });\n continue;\n }\n\n index += 1;\n }\n\n return spans;\n};\n\nconst getLineStarts = (value: string) => {\n const lineStarts = [0];\n\n for (let index = 0; index < value.length; index += 1) {\n if (value[index] === '\\n') {\n lineStarts.push(index + 1);\n }\n }\n\n return lineStarts;\n};\n\nconst offsetToPosition = (lineStarts: number[], offset: number) => {\n let low = 0;\n let high = lineStarts.length - 1;\n\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n\n if ((lineStarts[mid] ?? 0) <= offset) {\n low = mid + 1;\n } else {\n high = mid - 1;\n }\n }\n\n const lineIndex = Math.max(0, high);\n const lineStart = lineStarts[lineIndex] ?? 0;\n\n return {\n lineNumber: lineIndex + 1,\n column: offset - lineStart + 1,\n };\n};\n\nconst getRangeFromOffsets = (\n lineStarts: number[],\n startOffset: number,\n endOffset: number,\n): SqlEditorTokenRange => {\n const start = offsetToPosition(lineStarts, startOffset);\n const end = offsetToPosition(lineStarts, endOffset);\n\n return {\n startLineNumber: start.lineNumber,\n startColumn: start.column,\n endLineNumber: end.lineNumber,\n endColumn: end.column,\n };\n};\n\n/** 앞뒤가 식별자 문자가 아니어야 매치로 인정합니다. region이 my_region에 걸리지 않게. */\nconst hasIdentifierBoundary = (value: string, startOffset: number, endOffset: number) => {\n const before = value[startOffset - 1];\n const after = value[endOffset];\n\n return (\n !identifierBoundaryPattern.test(before ?? '') && !identifierBoundaryPattern.test(after ?? '')\n );\n};\n\nconst getSearchableTokens = (tokens: SqlEditorToken[]) => {\n const searchableTokens = new Map<string, SqlEditorToken>();\n\n for (const token of tokens) {\n if (!token.match) {\n continue;\n }\n\n const key = token.match.toLowerCase();\n\n if (!searchableTokens.has(key)) {\n searchableTokens.set(key, token);\n }\n }\n\n // 정규식 alternation은 앞 패턴이 이기므로 긴 match가 먼저 시도되게 정렬한다.\n return [...searchableTokens.values()].sort((a, b) => b.match.length - a.match.length);\n};\n\nconst getSqlEditorTokens = (value: string, tokens: SqlEditorToken[]) => {\n const searchableTokens = getSearchableTokens(tokens);\n\n if (!searchableTokens.length) {\n return [];\n }\n\n const tokenByMatch = new Map(searchableTokens.map((token) => [token.match.toLowerCase(), token]));\n const pattern = new RegExp(\n searchableTokens.map((token) => escapeRegExp(token.match)).join('|'),\n 'gi',\n );\n const protectedSpans = getProtectedSpans(value);\n const lineStarts = getLineStarts(value);\n const parsedTokens: ParsedSqlEditorToken[] = [];\n let match = pattern.exec(value);\n\n while (match !== null) {\n const text = match[0];\n const startOffset = match.index;\n const endOffset = startOffset + text.length;\n const token = tokenByMatch.get(text.toLowerCase());\n\n if (\n token &&\n hasIdentifierBoundary(value, startOffset, endOffset) &&\n !isProtectedOffset(protectedSpans, startOffset, endOffset)\n ) {\n parsedTokens.push({\n token,\n text,\n range: getRangeFromOffsets(lineStarts, startOffset, endOffset),\n startOffset,\n endOffset,\n className: token.className,\n });\n }\n\n match = pattern.exec(value);\n }\n\n return parsedTokens;\n};\n\nexport { getSqlEditorTokens };\nexport type { ParsedSqlEditorToken, SqlEditorToken, SqlEditorTokenRange };\n","import type { Monaco, OnMount } from '@monaco-editor/react';\nimport type { IDisposable, IPosition, editor as MonacoEditor } from 'monaco-editor';\nimport { useCallback, useEffect, useRef } from 'react';\nimport type { ParsedSqlEditorToken, SqlEditorToken } from './tokens';\nimport { getSqlEditorTokens } from './tokens';\n\n// SQL 토큰 range를 Monaco decoration과 클릭 이벤트로 연결합니다.\ntype UseSqlEditorTokenDecorationsOptions = {\n displayValue: string;\n tokens: SqlEditorToken[];\n onTokenClick?: (token: SqlEditorToken) => void;\n onMount?: OnMount;\n};\n\nconst isPositionInToken = (position: IPosition, token: Pick<ParsedSqlEditorToken, 'range'>) => {\n const { range } = token;\n\n if (position.lineNumber < range.startLineNumber || position.lineNumber > range.endLineNumber) {\n return false;\n }\n\n if (position.lineNumber === range.startLineNumber && position.column < range.startColumn) {\n return false;\n }\n\n if (position.lineNumber === range.endLineNumber && position.column >= range.endColumn) {\n return false;\n }\n\n return true;\n};\n\n/** tokens prop으로 받은 강조 대상을 Monaco 데코레이션으로 적용하고 클릭 이벤트를 연결합니다. */\nconst useSqlEditorTokenDecorations = ({\n displayValue,\n tokens,\n onTokenClick,\n onMount,\n}: UseSqlEditorTokenDecorationsOptions) => {\n const editorRef = useRef<MonacoEditor.IStandaloneCodeEditor | null>(null);\n const monacoRef = useRef<Monaco | null>(null);\n const decorationsRef = useRef<MonacoEditor.IEditorDecorationsCollection | null>(null);\n const clickHandlerRef = useRef<IDisposable | null>(null);\n\n const applyTokenDecorations = useCallback(() => {\n const editor = editorRef.current;\n const monaco = monacoRef.current;\n\n if (!editor || !monaco) {\n return;\n }\n\n const parsedTokens = getSqlEditorTokens(displayValue, tokens);\n\n decorationsRef.current ??= editor.createDecorationsCollection();\n decorationsRef.current.set(\n parsedTokens.map((token) => ({\n range: new monaco.Range(\n token.range.startLineNumber,\n token.range.startColumn,\n token.range.endLineNumber,\n token.range.endColumn,\n ),\n options: {\n inlineClassName: token.className,\n stickiness: monaco.editor.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges,\n },\n })),\n );\n\n if (clickHandlerRef.current) {\n clickHandlerRef.current.dispose();\n clickHandlerRef.current = null;\n }\n\n if (!onTokenClick) {\n return;\n }\n\n clickHandlerRef.current = editor.onMouseDown((mouseEvent) => {\n const position = mouseEvent.target.position;\n\n if (!position) {\n return;\n }\n\n const parsedToken = parsedTokens.find((token) => isPositionInToken(position, token));\n\n if (!parsedToken) {\n return;\n }\n\n onTokenClick(parsedToken.token);\n });\n }, [displayValue, onTokenClick, tokens]);\n\n const handleMount: OnMount = useCallback(\n (editor, monaco) => {\n editorRef.current = editor;\n monacoRef.current = monaco;\n applyTokenDecorations();\n onMount?.(editor, monaco);\n },\n [applyTokenDecorations, onMount],\n );\n\n useEffect(() => {\n applyTokenDecorations();\n }, [applyTokenDecorations]);\n\n useEffect(() => {\n return () => {\n if (clickHandlerRef.current) {\n clickHandlerRef.current.dispose();\n clickHandlerRef.current = null;\n }\n };\n }, []);\n\n return { handleMount };\n};\n\nexport { useSqlEditorTokenDecorations };\n","import { cn } from '@exem-ui/core/utils';\nimport type { BeforeMount } from '@monaco-editor/react';\nimport * as React from 'react';\nimport { CodeEditor, type CodeEditorFormatter, type CodeEditorSurfaceProps } from '../CodeEditor';\nimport { useCodeEditorSource } from '../CodeEditorSourceProvider';\nimport { useCodeEditorFormat } from '../format/CodeEditorFormatProvider';\nimport { getDisplayValue } from '../format/getDisplayValue';\nimport { useActiveFormatter } from '../format/useActiveFormatter';\nimport { registerCodeEditorThemeRules } from '../monacoCodeEditor';\nimport { createSqlFormatter, type SqlEditorDbType } from './formatSqlValue';\nimport {\n defineSqlEditorLanguage,\n getSqlEditorThemeRules,\n sqlEditorLanguageId,\n} from './monacoSqlEditor';\nimport type { SqlEditorToken } from './tokens';\nimport { useSqlEditorTokenDecorations } from './useSqlEditorTokenDecorations';\n\n// SQL 전용 Monaco 언어, formatter, 토큰 클릭 기능을 Surface에 연결합니다.\nregisterCodeEditorThemeRules(getSqlEditorThemeRules);\n\ntype CodeEditorSQLProps = Omit<CodeEditorSurfaceProps, 'language'> & {\n dbType?: SqlEditorDbType;\n onTokenClick?: (token: SqlEditorToken) => void;\n tokens?: SqlEditorToken[];\n};\n\nconst CodeEditorSQL = React.forwardRef<HTMLDivElement, CodeEditorSQLProps>(\n (\n {\n beforeMount,\n dbType,\n editorClassName,\n formatter,\n onMount,\n onTokenClick,\n tokens = [],\n ...props\n },\n ref,\n ) => {\n const { viewMode } = useCodeEditorFormat();\n const { sourceValue: contextValue } = useCodeEditorSource();\n const sqlFormatter = React.useMemo<CodeEditorFormatter>(\n () => createSqlFormatter(dbType),\n [dbType],\n );\n const surfaceFormatter = formatter === undefined ? sqlFormatter : formatter;\n const surfaceValue = props.value ?? contextValue ?? '';\n // 토큰 강조 범위는 화면에 보이는 값 기준으로 계산한다.\n const surfaceDisplayValue = getDisplayValue(surfaceValue, viewMode, surfaceFormatter);\n\n useActiveFormatter(surfaceFormatter);\n\n const { handleMount } = useSqlEditorTokenDecorations({\n displayValue: surfaceDisplayValue,\n tokens,\n onTokenClick,\n onMount,\n });\n\n const handleBeforeMount = React.useCallback<BeforeMount>(\n (monaco) => {\n defineSqlEditorLanguage(monaco);\n beforeMount?.(monaco);\n },\n [beforeMount],\n );\n\n return (\n <CodeEditor.Surface\n ref={ref}\n {...props}\n beforeMount={handleBeforeMount}\n editorClassName={cn('exem-sql-editor-monaco', editorClassName)}\n formatter={surfaceFormatter}\n language={sqlEditorLanguageId}\n onMount={handleMount}\n />\n );\n },\n);\n\nCodeEditorSQL.displayName = 'CodeEditor.SQL';\n\nexport { CodeEditorSQL };\nexport type { CodeEditorSQLProps };\n","import type { CodeEditorComponent as BaseCodeEditorComponent } from './CodeEditor';\nimport { CodeEditor as BaseCodeEditor } from './CodeEditor';\nimport { CodeEditorJSON } from './jsonEditor/JsonEditor';\nimport { CodeEditorSQL } from './sqlEditor/SqlEditor';\n\n// 기본 CodeEditor에 SQL/JSON 전용 Surface를 붙여 공개 API를 만듭니다.\ntype CodeEditorComponent = BaseCodeEditorComponent & {\n JSON: typeof CodeEditorJSON;\n SQL: typeof CodeEditorSQL;\n};\n\nconst CodeEditor = BaseCodeEditor as CodeEditorComponent;\n\nCodeEditor.JSON = CodeEditorJSON;\nCodeEditor.SQL = CodeEditorSQL;\n\nexport { CodeEditor };\nexport type {\n CodeEditorCopyTriggerProps,\n CodeEditorFormatToggleProps,\n CodeEditorFormatTriggerProps,\n CodeEditorFormatter,\n CodeEditorOptions,\n CodeEditorProps,\n CodeEditorSurfaceProps,\n CodeEditorViewMode,\n CopyTriggerRenderProps as CodeEditorCopyTriggerRenderProps,\n FormatToggleRenderProps as CodeEditorFormatToggleRenderProps,\n FormatTriggerRenderProps as CodeEditorFormatTriggerRenderProps,\n} from './CodeEditor';\nexport type { CodeEditorComponent };\nexport type { CodeEditorJSONProps } from './jsonEditor/JsonEditor';\nexport type { SqlEditorDbType } from './sqlEditor/formatSqlValue';\nexport type { CodeEditorSQLProps } from './sqlEditor/SqlEditor';\nexport type { ParsedSqlEditorToken, SqlEditorToken, SqlEditorTokenRange } from './sqlEditor/tokens';\nexport { getSqlEditorTokens } from './sqlEditor/tokens';\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}