nim-sync 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.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/plugin/nim-sync.ts", "../src/types/index.ts", "../src/types/schema.ts", "../src/lib/retry.ts", "../src/lib/file-utils.ts", "../node_modules/jsonc-parser/lib/esm/impl/scanner.js", "../node_modules/jsonc-parser/lib/esm/impl/string-intern.js", "../node_modules/jsonc-parser/lib/esm/impl/format.js", "../node_modules/jsonc-parser/lib/esm/impl/parser.js", "../node_modules/jsonc-parser/lib/esm/impl/edit.js", "../node_modules/jsonc-parser/lib/esm/main.js", "../src/index.ts"],
4
+ "sourcesContent": ["import crypto from 'crypto'\r\nimport path from 'path'\r\nimport type { PluginAPI, NIMModel, OpenCodeConfig, CacheData, AuthConfig } from '../types/index.js'\r\nimport { NVIDIAApiError } from '../types/index.js'\r\nimport { validateOpenCodeConfig } from '../types/schema.js'\r\nimport { withRetry } from '../lib/retry.js'\r\nimport {\n readJSONC,\n writeJSONC,\n updateJSONCPath,\n acquireLock,\n getConfigDir,\n getCacheDir,\n getDataDir,\n API_TIMEOUT_MS,\n CACHE_TTL_MS,\n MIN_MANUAL_REFRESH_INTERVAL_MS\n} from '../lib/file-utils.js'\n\r\nconst NIM_BASE_URL = 'https://integrate.api.nvidia.com/v1'\r\nconst CACHE_FILE_NAME = 'nim-sync-cache.json'\r\nconst CONFIG_FILE_NAME = 'opencode.jsonc'\r\n\r\nconst ALLOWED_MODEL_PROPERTIES = new Set([\r\n 'id', 'name', 'description', 'model_type', 'quantization',\r\n 'created', 'owned_by', 'object', 'root', 'parent', 'permission'\r\n])\r\n\r\n/**\r\n * Creates a NVIDIA NIM model synchronization plugin for OpenCode.\r\n * \r\n * This plugin automatically fetches available models from NVIDIA's API and updates\r\n * the OpenCode configuration with the latest model list. It provides:\r\n * - Automatic sync on startup with 24-hour TTL caching\r\n * - Manual refresh via `/nim-refresh` command with rate limiting (60s cooldown)\r\n * - Atomic file operations with lock-based concurrency control\r\n * - Graceful error handling with user-friendly toast notifications\r\n * \r\n * @param api - Plugin API provided by OpenCode framework\r\n * @returns Plugin instance with lifecycle methods and exposed utilities\r\n * \r\n * @example\r\n * ```typescript\r\n * // Plugin is automatically loaded by OpenCode\r\n * const plugin = await syncNIMModels(api)\r\n * await plugin.init?.()\r\n * \r\n * // Manual refresh via command\r\n * await plugin.refreshModels?.(true)\r\n * ```\r\n * \r\n * @remarks\r\n * - Requires NVIDIA API key in `auth.json` or `NVIDIA_API_KEY` environment variable\r\n * - Updates `provider.nim.models` in `opencode.jsonc`\r\n * - Cache stored in `nim-sync-cache.json` with 24-hour TTL\r\n * - Prevents concurrent refreshes with in-memory flag\r\n */\r\nexport async function syncNIMModels(api: PluginAPI): Promise<{\r\n /** Initialize plugin and register commands */\r\n init?: () => Promise<void>\r\n /** Hook handlers for server and session events */\r\n hooks?: Record<string, () => Promise<void>>\r\n /** Get NVIDIA API key from auth config or environment */\r\n getAPIKey?: () => Promise<string | null>\r\n /** Update OpenCode configuration with new models */\r\n updateConfig?: (models: NIMModel[]) => Promise<boolean>\r\n /** Refresh models from NVIDIA API */\r\n refreshModels?: (force?: boolean) => Promise<void>\r\n /** Check if model refresh is needed based on cache TTL */\r\n shouldRefresh?: () => Promise<boolean>\r\n}> {\r\n let refreshInProgress = false\r\n let lastManualRefresh = 0\r\n\r\n const safeShowToast = (options: { title: string; description: string; variant: 'success' | 'error' | 'default' }): void => {\r\n try { api.tui.toast.show(options) } catch (e) { console.debug('[NIM-Sync] Toast display failed:', e instanceof Error ? e.message : 'Unknown') }\r\n }\r\n\r\n const sanitizeErrorMessage = (msg: string, apiKey: string | null): string => {\r\n if (!apiKey) return msg\r\n return msg.replace(apiKey, '[REDACTED]')\r\n }\r\n\r\n const getCachePath = (): string => path.join(getCacheDir(), CACHE_FILE_NAME)\n const getConfigPath = (): string => path.join(getConfigDir(), CONFIG_FILE_NAME)\n const getAuthPath = (): string => path.join(getDataDir(), 'auth.json')\n\r\n const readCache = async (): Promise<CacheData | null> => {\r\n try {\r\n const cache = await readJSONC<CacheData>(getCachePath())\r\n return cache?.lastRefresh ? cache : null\r\n } catch { return null }\r\n }\r\n\r\n const writeCache = async (cache: CacheData): Promise<void> => {\r\n let releaseLockFn: (() => Promise<void>) | null = null\r\n try {\r\n releaseLockFn = await acquireLock('nim-cache-write')\r\n } catch (lockError) {\r\n const msg = lockError instanceof Error ? lockError.message : 'Unknown error'\r\n console.error('[NIM-Sync] Cache lock failed:', msg)\r\n safeShowToast({ title: 'NVIDIA Sync Warning', description: 'Cache lock failed: ' + msg, variant: 'error' })\r\n throw lockError\r\n }\r\n try {\r\n await writeJSONC(getCachePath(), cache, { backup: true })\r\n } catch (writeError) {\r\n const msg = writeError instanceof Error ? writeError.message : 'Unknown error'\r\n console.error('[NIM-Sync] Cache write failed:', msg)\r\n safeShowToast({ title: 'NVIDIA Sync Failed', description: 'Failed to write cache: ' + msg, variant: 'error' })\r\n throw writeError\r\n } finally {\r\n if (releaseLockFn) { try { await releaseLockFn() } catch (e) { console.error('[NIM-Sync] Failed to release cache lock:', e) } }\r\n }\r\n }\r\n\r\n const getAPIKey = async (): Promise<string | null> => {\r\n // Priority order:\r\n // 1. First check auth.json -> credentials.nim.apiKey\r\n // 2. Fallback to NVIDIA_API_KEY environment variable\r\n // 3. Return null if neither is available\r\n try {\r\n const auth = await readJSONC<AuthConfig>(getAuthPath())\r\n if (!auth || Object.keys(auth).length === 0) {\r\n console.debug('[NIM-Sync] No auth.json found, checking env var')\r\n return process.env.NVIDIA_API_KEY || null\r\n }\r\n if (auth.credentials?.nim?.apiKey && typeof auth.credentials.nim.apiKey === 'string') {\r\n return auth.credentials.nim.apiKey\r\n }\r\n console.debug('[NIM-Sync] No credentials in auth.json, checking env var')\r\n return process.env.NVIDIA_API_KEY || null\r\n } catch (error) {\r\n console.error('[NIM-Sync] Failed to read auth:', error instanceof Error ? error.message : 'Unknown error')\r\n return process.env.NVIDIA_API_KEY || null\r\n }\r\n }\r\n\r\n const exposedGetAPIKey = getAPIKey\r\n\r\n function validateAPIResponse(response: unknown): NIMModel[] {\r\n if (!response || typeof response !== 'object') throw new Error('Invalid API response: Expected object, got ' + (response === null ? 'null' : typeof response))\r\n const obj = response as Record<string, unknown>\r\n if (!('data' in obj)) throw new Error('Invalid API response: Missing data field. Keys: [' + Object.keys(obj).join(', ') + ']')\r\n const data = obj.data\r\n if (!Array.isArray(data)) throw new Error('Invalid API response: data must be array, got ' + typeof data)\r\n const seenIds = new Set<string>()\r\n const models: NIMModel[] = []\r\n for (let i = 0; i < data.length; i++) {\r\n const m = data[i] as Record<string, unknown>\r\n if (!m || typeof m !== 'object') throw new Error('Invalid model at index ' + i + ': not an object')\r\n if (typeof m.id !== 'string' || m.id.length === 0) throw new Error('Invalid model at index ' + i + ': invalid id')\r\n if (typeof m.name !== 'string' || m.name.length === 0) throw new Error('Model ' + m.id + ': invalid name')\r\n if (seenIds.has(m.id)) throw new Error('Duplicate model ID: ' + m.id)\r\n const unexpected = Object.keys(m).filter(k => !ALLOWED_MODEL_PROPERTIES.has(k))\r\n if (unexpected.length > 0) console.warn('[NIM-Sync] Model ' + m.id + ' has unexpected props: [' + unexpected.join(', ') + ']')\r\n seenIds.add(m.id)\r\n models.push({\r\n id: m.id, name: m.name,\r\n description: typeof m.description === 'string' ? m.description : undefined,\r\n model_type: typeof m.model_type === 'string' ? m.model_type : undefined,\r\n quantization: typeof m.quantization === 'string' ? m.quantization : undefined\r\n })\r\n }\r\n return models\r\n }\r\n\r\n const fetchModels = async (apiKey: string): Promise<NIMModel[]> => {\r\n return withRetry(async () => {\r\n const controller = new AbortController()\r\n const timeoutId = setTimeout(() => controller.abort(), API_TIMEOUT_MS)\r\n try {\r\n const response = await fetch(NIM_BASE_URL + '/models', {\r\n headers: { 'Authorization': 'Bearer ' + apiKey, 'Content-Type': 'application/json' },\r\n signal: controller.signal\r\n })\r\n clearTimeout(timeoutId)\r\n if (!response.ok) throw new NVIDIAApiError(response.status, response.statusText)\r\n let data: unknown\r\n try { data = await response.json() } catch (e) { throw new Error('Failed to parse JSON: ' + (e instanceof Error ? e.message : 'Unknown')) }\r\n return validateAPIResponse(data)\r\n } catch (error) {\r\n clearTimeout(timeoutId)\r\n if (error instanceof Error && error.name === 'AbortError') throw new Error('NVIDIA API request timed out after ' + (API_TIMEOUT_MS / 1000) + ' seconds')\r\n throw error\r\n }\r\n }, { maxRetries: 3, initialDelay: 1000, maxDelay: 10000, retryStatusCodes: [429, 500, 502, 503, 504] })\r\n }\r\n\r\n const hashModels = (models: NIMModel[]): string => {\n const hash = crypto.createHash('sha256')\n hash.update(JSON.stringify([...models].sort((a, b) => a.id.localeCompare(b.id))))\n return hash.digest('hex')\n }\n\n const sortKeysDeep = (value: unknown): unknown => {\n if (Array.isArray(value)) {\n return value.map(sortKeysDeep)\n }\n\n if (value && typeof value === 'object') {\n return Object.keys(value as Record<string, unknown>)\n .sort()\n .reduce<Record<string, unknown>>((acc, key) => {\n acc[key] = sortKeysDeep((value as Record<string, unknown>)[key])\n return acc\n }, {})\n }\n\n return value\n }\n\n const managedNIMConfigMatches = (\n currentConfig: NonNullable<OpenCodeConfig['provider']>['nim'] | undefined,\n nextConfig: NonNullable<OpenCodeConfig['provider']>['nim']\n ): boolean => {\n return JSON.stringify(sortKeysDeep(currentConfig ?? null)) === JSON.stringify(sortKeysDeep(nextConfig))\n }\n\r\n const shouldRefresh = async (): Promise<boolean> => {\r\n try {\r\n const config = api.config.get<OpenCodeConfig>()\r\n if (!config?.provider?.nim) return true\r\n const cache = await readCache()\r\n if (!cache?.lastRefresh) return true\r\n return Date.now() - cache.lastRefresh > CACHE_TTL_MS\r\n } catch { return true }\r\n }\r\n\r\n const exposedShouldRefresh = shouldRefresh\n const updateConfig = async (models: NIMModel[]): Promise<boolean> => {\n const config = await readJSONC<OpenCodeConfig>(getConfigPath())\n\n const newModels = models.reduce((acc, m) => {\n acc[m.id] = { name: m.name, options: config?.provider?.nim?.models?.[m.id]?.options || {} }\n return acc\n }, {} as Record<string, { name: string; options: Record<string, unknown> }>)\n const modelsHash = hashModels(models)\n const cache = await readCache()\n\n const updatedNIMConfig: NonNullable<OpenCodeConfig['provider']>['nim'] = {\n ...config?.provider?.nim,\n npm: '@ai-sdk/openai-compatible',\n name: 'NVIDIA NIM',\n options: {\n ...config?.provider?.nim?.options,\n baseURL: NIM_BASE_URL\n },\n models: newModels\n }\n const managedConfigChanged = !managedNIMConfigMatches(config?.provider?.nim, updatedNIMConfig)\n\n if (cache?.modelsHash === modelsHash && !managedConfigChanged) {\n try {\n await writeCache({ ...cache, lastRefresh: Date.now(), modelsHash, baseURL: NIM_BASE_URL })\n } catch { /* non-fatal */ }\n return false\n }\n\n let releaseLockFn: (() => Promise<void>) | null = null\n try { releaseLockFn = await acquireLock('nim-config-update') } catch (e) {\n const msg = e instanceof Error ? e.message : 'Unknown'\n console.error('[NIM-Sync] Config lock failed:', msg)\n safeShowToast({ title: 'NVIDIA Config Lock Failed', description: msg, variant: 'error' })\n throw e\r\n }\n try {\n const updatedConfig: OpenCodeConfig = {\n ...(config || {}),\n provider: { ...config?.provider, nim: updatedNIMConfig }\n }\n const validation = validateOpenCodeConfig(updatedConfig)\n if (!validation.valid) {\n console.warn('[NIM-Sync] Config validation warnings:', validation.errors)\n }\n await updateJSONCPath(getConfigPath(), ['provider', 'nim'], updatedNIMConfig, { backup: true, createBackupDir: true })\n try { await writeCache({ lastRefresh: Date.now(), modelsHash, baseURL: NIM_BASE_URL }) } catch { /* non-fatal */ }\n return true\n } catch (e) {\n const msg = e instanceof Error ? e.message : 'Unknown'\n console.error('[NIM-Sync] Config update failed:', msg)\r\n safeShowToast({ title: 'NVIDIA Config Update Failed', description: msg, variant: 'error' })\r\n throw e\r\n } finally {\r\n if (releaseLockFn) { try { await releaseLockFn() } catch (e) { console.error('[NIM-Sync] Failed to release config lock:', e) } }\r\n }\r\n }\r\n\r\n const exposedUpdateConfig = updateConfig\r\n\r\n const refreshModels = async (force = false): Promise<void> => {\r\n if (refreshInProgress) return\r\n refreshInProgress = true\r\n let apiKey: string | null = null\r\n try {\r\n if (!force && !(await shouldRefresh())) return\r\n apiKey = await getAPIKey()\r\n if (!apiKey) { safeShowToast({ title: 'NVIDIA API Key Required', description: 'Run /connect to add your NVIDIA API key', variant: 'error' }); return }\r\n const models = await fetchModels(apiKey)\r\n if (models.length === 0) { safeShowToast({ title: 'No Models Available', description: 'NVIDIA API returned no models.', variant: 'error' }); return }\r\n const changed = await updateConfig(models)\r\n if (changed) safeShowToast({ title: 'NVIDIA NIM Models Updated', description: models.length + ' models synchronized', variant: 'success' })\r\n } catch (error) {\n const msg = sanitizeErrorMessage(error instanceof Error ? error.message : 'Unknown error', apiKey)\n console.error('[NIM-Sync] Model refresh failed:', msg)\n safeShowToast({ title: 'NVIDIA Sync Failed', description: msg, variant: 'error' })\n try { await writeCache({ modelsHash: '', lastError: msg, baseURL: NIM_BASE_URL }) } catch { /* ignore */ }\n } finally { refreshInProgress = false }\n }\n\n const init = async (): Promise<void> => {\n try {\n api.command.register('nim-refresh', async () => {\n const now = Date.now()\n if (now - lastManualRefresh < MIN_MANUAL_REFRESH_INTERVAL_MS) {\n const remainingSeconds = Math.ceil((MIN_MANUAL_REFRESH_INTERVAL_MS - (now - lastManualRefresh)) / 1000)\n safeShowToast({ title: 'Rate Limited', description: 'Please wait ' + remainingSeconds + 's before refreshing again', variant: 'default' })\r\n return\r\n }\n lastManualRefresh = now\n await refreshModels(true)\n }, { description: 'Force refresh NVIDIA NIM models' })\n } catch (e) { console.error('[NIM-Sync] Failed to register command:', e) }\n void refreshModels().catch((e) => { console.error('[NIM-Sync] Init failed:', e) })\n }\n\r\n const hooks = {\r\n 'server.connected': async () => { try { await refreshModels() } catch (e) { console.error('[NIM-Sync] Hook failed:', e) } },\r\n 'session.created': async () => { try { await refreshModels() } catch (e) { console.error('[NIM-Sync] Hook failed:', e) } }\r\n }\r\n\r\n const exposedRefreshModels = refreshModels\r\n return { init, hooks, getAPIKey: exposedGetAPIKey, updateConfig: exposedUpdateConfig, refreshModels: exposedRefreshModels, shouldRefresh: exposedShouldRefresh }\r\n}\r\n\r\nexport default syncNIMModels\r\n", "export interface NIMModel {\r\n id: string\r\n name: string\r\n description?: string\r\n model_type?: string\r\n quantization?: string\r\n}\r\n\r\nexport interface NIMApiResponse {\r\n data: NIMModel[]\r\n}\r\n\r\nexport interface AuthConfig {\r\n credentials?: {\r\n nim?: {\r\n apiKey?: string\r\n }\r\n }\r\n}\r\n\r\nexport interface LockMetadata {\r\n pid: number\r\n timestamp: number\r\n}\r\n\r\nexport interface OpenCodeConfig {\r\n $schema?: string\r\n provider?: {\r\n nim?: {\r\n npm?: string\r\n name?: string\r\n options?: {\r\n baseURL?: string\r\n }\r\n models?: Record<string, { name: string; options?: Record<string, unknown> }>\r\n }\r\n }\r\n model?: string\r\n small_model?: string\r\n [key: string]: unknown\r\n}\r\n\r\nexport interface CacheData {\n lastRefresh?: number\n modelsHash: string\n lastError?: string\n baseURL?: string\n}\n\r\nexport interface PluginAPI {\r\n config: {\r\n get: <T = unknown>(key?: string) => T\r\n set: (key: string, value: unknown) => Promise<void>\r\n }\r\n tui: {\r\n toast: {\r\n show: (options: {\r\n title: string\r\n description?: string\r\n variant?: 'default' | 'destructive' | 'success' | 'error'\r\n }) => void\r\n }\r\n }\r\n command: {\r\n register: (name: string, handler: () => Promise<void> | void, options?: { description: string }) => void\r\n execute: (name: string) => Promise<void>\r\n }\r\n client?: {\r\n app: {\r\n log: (log: { body: { service: string; level: 'debug' | 'info' | 'warn' | 'error'; message: string; extra?: Record<string, unknown> } }) => Promise<void>\r\n }\r\n }\r\n}\r\n\r\nexport type Plugin = (api: PluginAPI) => Promise<{\r\n init?: () => Promise<void>\r\n [key: string]: unknown\r\n}> | {\r\n init?: () => Promise<void>\r\n [key: string]: unknown\r\n}\r\n\r\n/**\r\n * Custom error for NVIDIA API failures.\r\n */\r\nexport class NVIDIAApiError extends Error {\r\n constructor(\r\n public statusCode: number,\r\n public statusText: string\r\n ) {\r\n super(`NVIDIA API error: ${statusCode} ${statusText}`)\r\n this.name = 'NVIDIAApiError'\r\n }\r\n}\r\n\r\n/**\r\n * Platform-specific directory paths for OpenCode.\r\n */\r\nexport interface PlatformPaths {\r\n config: string\r\n data: string\r\n cache: string\r\n}\r\n", "/**\r\n * JSON Schema for OpenCode configuration validation.\r\n * Validates the structure of opencode.jsonc files.\r\n */\r\nexport const OpenCodeConfigSchema = {\r\n $schema: 'http://json-schema.org/draft-07/schema#',\r\n $id: 'https://opencode.ai/schemas/opencode-config',\r\n title: 'OpenCode Configuration',\r\n description: 'Configuration schema for OpenCode plugins',\r\n type: 'object',\r\n additionalProperties: true,\r\n properties: {\r\n $schema: {\r\n type: 'string',\r\n description: 'JSON Schema URI'\r\n },\r\n provider: {\r\n type: 'object',\r\n additionalProperties: true,\r\n description: 'AI provider configurations',\r\n properties: {\r\n nim: {\r\n type: 'object',\r\n description: 'NVIDIA NIM provider configuration',\r\n properties: {\r\n npm: {\r\n type: 'string',\r\n description: 'NPM package name for the provider'\r\n },\r\n name: {\r\n type: 'string',\r\n description: 'Display name for the provider'\r\n },\r\n options: {\r\n type: 'object',\r\n additionalProperties: true,\r\n description: 'Provider-specific options',\r\n properties: {\r\n baseURL: {\r\n type: 'string',\r\n format: 'uri',\r\n description: 'Base URL for the API'\r\n }\r\n }\r\n },\r\n models: {\r\n type: 'object',\r\n additionalProperties: {\r\n type: 'object',\r\n properties: {\r\n name: {\r\n type: 'string',\r\n description: 'Model display name'\r\n },\r\n options: {\r\n type: 'object',\r\n additionalProperties: true,\r\n description: 'Model-specific options'\r\n }\r\n },\r\n required: ['name'],\r\n additionalProperties: false\r\n },\r\n description: 'Available models for this provider'\r\n }\r\n },\r\n required: ['npm', 'name'],\r\n additionalProperties: false\r\n }\r\n }\r\n },\r\n model: {\r\n type: 'string',\r\n description: 'Default model to use'\r\n },\r\n small_model: {\r\n type: 'string',\r\n description: 'Small model for lightweight tasks'\r\n }\r\n }\r\n} as const\r\n\r\n/**\r\n * Validates OpenCode configuration against schema.\r\n * \r\n * @param config - Configuration object to validate\r\n * @returns Validation result with errors if any\r\n */\r\nexport function validateOpenCodeConfig(config: unknown): {\r\n valid: boolean\r\n errors?: string[]\r\n} {\r\n if (typeof config !== 'object' || config === null) {\r\n return { valid: false, errors: ['Configuration must be an object'] }\r\n }\r\n\r\n const typedConfig = config as Record<string, unknown>\r\n const errors: string[] = []\r\n\r\n // Validate provider structure if present\r\n if (typedConfig.provider && typeof typedConfig.provider === 'object') {\r\n const provider = typedConfig.provider as Record<string, unknown>\r\n \r\n if (provider.nim && typeof provider.nim === 'object') {\r\n const nim = provider.nim as Record<string, unknown>\r\n \r\n // Check required fields\r\n if (typeof nim.npm !== 'string') {\r\n errors.push('provider.nim.npm must be a string')\r\n }\r\n if (typeof nim.name !== 'string') {\r\n errors.push('provider.nim.name must be a string')\r\n }\r\n \r\n // Validate models structure if present\r\n if (nim.models && typeof nim.models === 'object') {\r\n const models = nim.models as Record<string, unknown>\r\n for (const [modelId, modelData] of Object.entries(models)) {\r\n if (typeof modelData !== 'object' || modelData === null) {\r\n errors.push(`provider.nim.models.${modelId} must be an object`)\r\n } else {\r\n const model = modelData as Record<string, unknown>\r\n if (typeof model.name !== 'string') {\r\n errors.push(`provider.nim.models.${modelId}.name must be a string`)\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Validate model fields\r\n if (typedConfig.model !== undefined && typeof typedConfig.model !== 'string') {\r\n errors.push('model must be a string if provided')\r\n }\r\n \r\n if (typedConfig.small_model !== undefined && typeof typedConfig.small_model !== 'string') {\r\n errors.push('small_model must be a string if provided')\r\n }\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors: errors.length > 0 ? errors : undefined\r\n }\r\n}", "/**\r\n * Exponential backoff retry utility for API calls.\r\n */\r\n\r\nexport interface RetryOptions {\r\n /** Maximum number of retry attempts (default: 3) */\r\n maxRetries?: number\r\n /** Initial delay in milliseconds (default: 1000) */\r\n initialDelay?: number\r\n /** Maximum delay in milliseconds (default: 10000) */\r\n maxDelay?: number\r\n /** Whether to retry on network errors (default: true) */\r\n retryOnNetworkError?: boolean\r\n /** Status codes to retry (default: [429, 500, 502, 503, 504]) */\r\n retryStatusCodes?: number[]\r\n}\r\n\r\nconst DEFAULT_OPTIONS: Required<RetryOptions> = {\r\n maxRetries: 3,\r\n initialDelay: 1000,\r\n maxDelay: 10000,\r\n retryOnNetworkError: true,\r\n retryStatusCodes: [429, 500, 502, 503, 504]\r\n}\r\n\r\n/**\r\n * Executes a function with exponential backoff retry logic.\r\n * \r\n * @param fn - Function to execute with retry logic\r\n * @param options - Retry configuration options\r\n * @returns Result of the function if successful\r\n * @throws Last error if all retries are exhausted\r\n */\r\nexport async function withRetry<T>(\r\n fn: () => Promise<T>,\r\n options: RetryOptions = {}\r\n): Promise<T> {\r\n const opts = { ...DEFAULT_OPTIONS, ...options }\r\n let lastError: Error | null = null\r\n\r\n for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {\r\n try {\r\n return await fn()\r\n } catch (error) {\r\n lastError = error instanceof Error ? error : new Error(String(error))\r\n \r\n // Determine if we should retry\r\n const shouldRetry = shouldRetryError(error, opts)\r\n \r\n if (!shouldRetry || attempt === opts.maxRetries) {\r\n throw lastError\r\n }\r\n\r\n // Calculate delay with exponential backoff\r\n const delay = Math.min(\r\n opts.initialDelay * Math.pow(2, attempt),\r\n opts.maxDelay\r\n )\r\n \r\n // Wait before retrying\r\n await new Promise(resolve => setTimeout(resolve, delay))\r\n }\r\n }\r\n\r\n // This should never be reached due to throw in loop, but TypeScript needs it\r\n throw lastError || new Error('Retry logic failed unexpectedly')\r\n}\r\n\r\n/**\r\n * Determines if an error should trigger a retry.\r\n * \r\n * @param error - The caught error\r\n * @param options - Retry configuration\r\n * @returns True if the error should trigger a retry\r\n */\r\nfunction shouldRetryError(error: unknown, options: Required<RetryOptions>): boolean {\r\n // Network errors (timeouts, connection refused, etc.)\r\n if (options.retryOnNetworkError && isNetworkError(error)) {\r\n return true\r\n }\r\n\r\n // Check if it's an HTTP error with retryable status code\r\n if (isHttpError(error)) {\r\n const statusCode = getStatusCode(error)\r\n return options.retryStatusCodes.includes(statusCode)\r\n }\r\n\r\n return false\r\n}\r\n\r\n/**\r\n * Checks if an error is a network error (timeout, connection refused, etc.).\r\n */\r\nfunction isNetworkError(error: unknown): boolean {\r\n if (!(error instanceof Error)) {\r\n return false\r\n }\r\n \r\n const networkErrorPatterns = [\r\n 'network',\r\n 'timeout',\r\n 'connection',\r\n 'fetch',\r\n 'abort',\r\n 'ECONNREFUSED',\r\n 'ETIMEDOUT'\r\n ]\r\n \r\n const message = error.message.toLowerCase()\r\n const name = error.name.toLowerCase()\r\n \r\n return networkErrorPatterns.some(pattern => \r\n message.includes(pattern) || name.includes(pattern)\r\n )\r\n}\r\n\r\n/**\r\n * Checks if an error is an HTTP error with a status code.\r\n */\r\nfunction isHttpError(error: unknown): error is { statusCode: number; statusText: string } {\r\n return (\r\n typeof error === 'object' &&\r\n error !== null &&\r\n 'statusCode' in error &&\r\n typeof (error as Record<string, unknown>).statusCode === 'number'\r\n )\r\n}\r\n\r\n/**\r\n * Extracts the status code from an HTTP error.\r\n */\r\nfunction getStatusCode(error: unknown): number {\r\n if (isHttpError(error)) {\r\n return error.statusCode\r\n }\r\n return 0\r\n}\r\n\r\n/**\r\n * Creates a retryable fetch wrapper with exponential backoff.\r\n * \r\n * @param apiKey - API key for authentication\r\n * @param baseURL - Base URL for the API\r\n * @param endpoint - API endpoint to call\r\n * @param options - Retry configuration options\r\n * @returns Fetch response with retry logic\r\n */\r\nexport async function retryableFetch(\r\n apiKey: string,\r\n baseURL: string,\r\n endpoint: string,\r\n options: RetryOptions = {}\r\n): Promise<Response> {\r\n return withRetry(async () => {\r\n const response = await fetch(`${baseURL}${endpoint}`, {\r\n headers: {\r\n 'Authorization': `Bearer ${apiKey}`,\r\n 'Content-Type': 'application/json'\r\n }\r\n })\r\n \r\n if (!response.ok) {\r\n throw { statusCode: response.status, statusText: response.statusText }\r\n }\r\n \r\n return response\r\n }, options)\r\n}", "import fs from 'fs/promises'\nimport path from 'path'\nimport { applyEdits, modify as modifyJSONC, parse as parseJSONC } from 'jsonc-parser/lib/esm/main.js'\nimport type { LockMetadata, PlatformPaths } from '../types/index.js'\n\r\n/**\r\n * Options for atomic file write operations.\r\n */\r\nexport interface AtomicWriteOptions {\r\n /** Whether to create a backup before overwriting */\r\n backup?: boolean\r\n /** Whether to create backup directory if it doesn't exist */\r\n createBackupDir?: boolean\r\n}\r\n\r\n/**\r\n * Timeout for NVIDIA API requests in milliseconds.\r\n */\r\nexport const API_TIMEOUT_MS = 30_000\r\n\r\n/**\r\n * Time-to-live for cached model data in milliseconds (24 hours).\r\n */\r\nexport const CACHE_TTL_MS = 24 * 60 * 60 * 1000\r\n\r\n/**\r\n * Threshold for considering a lock stale in milliseconds (5 minutes).\r\n */\r\nexport const LOCK_STALE_THRESHOLD_MS = 5 * 60 * 1000\r\n\r\n/**\r\n * Interval between lock acquisition retry attempts in milliseconds.\r\n */\r\nexport const LOCK_RETRY_INTERVAL_MS = 100\r\n\r\n/**\r\n * Minimum interval between manual refresh operations in milliseconds (60 seconds).\r\n */\r\nexport const MIN_MANUAL_REFRESH_INTERVAL_MS = 60_000\r\n\r\n/**\r\n * Maximum number of backup files to retain.\r\n */\r\nexport const MAX_BACKUPS = 5\r\n\r\n/**\r\n * Reads and parses a JSONC (JSON with Comments) file.\r\n * \r\n * @param filePath - Path to the JSONC file\r\n * @param validate - Optional validation function to ensure type safety\r\n * @returns Parsed content of type T, or empty object if file doesn't exist\r\n * @throws Error if file read fails (except ENOENT) or if validation fails\r\n */\r\nexport async function readJSONC<T = unknown>(\r\n filePath: string,\r\n validate?: (data: unknown) => data is T\r\n): Promise<T> {\r\n try {\r\n const content = await fs.readFile(filePath, 'utf-8')\r\n const errors: { error: number; offset: number; length: number }[] = []\r\n const result = parseJSONC(content, errors)\r\n\r\n if (errors.length > 0) {\r\n const errorDetails = errors\r\n .map(e => `Parse error code ${e.error} at offset ${e.offset}`)\r\n .join('; ')\r\n throw new Error(`JSONC parse errors in ${filePath}: ${errorDetails}`)\r\n }\r\n\r\n if (validate && !validate(result)) {\r\n throw new Error(`Invalid data structure in ${filePath}`)\r\n }\r\n\r\n return result as T\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\r\n return {} as T\r\n }\r\n throw error\r\n }\r\n}\r\n\r\n/**\r\n * Writes data to a JSONC file with atomic operations.\r\n * \r\n * @param filePath - Path to write the file\r\n * @param data - Data to serialize as JSON\r\n * @param options - Optional backup and directory creation settings\r\n */\r\nexport async function writeJSONC<T = unknown>(\n filePath: string,\n data: T,\n options?: AtomicWriteOptions\n): Promise<void> {\n const content = JSON.stringify(data, null, 2)\n await atomicWrite(filePath, content, options)\n}\n\n/**\n * Updates a specific path within a JSONC file while preserving unrelated\n * comments and formatting.\n *\n * @param filePath - Path to the JSONC file\n * @param jsonPath - JSON path to update\n * @param data - Value to write at the given path\n * @param options - Optional backup and directory creation settings\n */\nexport async function updateJSONCPath<T = unknown>(\n filePath: string,\n jsonPath: Array<string | number>,\n data: T,\n options?: AtomicWriteOptions\n): Promise<void> {\n let existingContent = ''\n\n try {\n existingContent = await fs.readFile(filePath, 'utf-8')\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error\n }\n }\n\n const eol = existingContent.includes('\\r\\n') ? '\\r\\n' : '\\n'\n const edits = modifyJSONC(existingContent, jsonPath, data, {\n formattingOptions: {\n insertSpaces: true,\n tabSize: 2,\n eol\n }\n })\n const updatedContent = applyEdits(existingContent, edits)\n\n await atomicWrite(filePath, updatedContent, options)\n}\n\r\n/**\r\n * Atomically writes content to a file using temp file + rename pattern.\r\n * Optionally creates backups before overwriting and cleans up old backups.\r\n * \r\n * @param filePath - Path to write the file\r\n * @param content - String content to write\r\n * @param options - Optional backup and directory creation settings\r\n */\r\nexport async function atomicWrite(\r\n filePath: string,\r\n content: string,\r\n options: AtomicWriteOptions = {}\r\n): Promise<void> {\r\n const dir = path.dirname(filePath)\r\n const tempPath = `${filePath}.${Date.now()}.tmp`\r\n\r\n try {\r\n await fs.mkdir(dir, { recursive: true })\r\n\r\n if (options.backup) {\r\n try {\r\n await fs.access(filePath)\r\n\r\n const backupDir = path.join(dir, 'backups')\r\n if (options.createBackupDir) {\r\n await fs.mkdir(backupDir, { recursive: true })\r\n }\r\n\r\n const backupPath = path.join(backupDir, `${path.basename(filePath)}.${Date.now()}.bak`)\r\n await fs.copyFile(filePath, backupPath)\r\n \r\n // Clean up old backups after creating new one\r\n await cleanupOldBackups(backupDir, path.basename(filePath))\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\r\n throw new Error(`Failed to create backup: ${error instanceof Error ? error.message : 'Unknown error'}`)\r\n }\r\n }\r\n }\r\n\r\n await fs.writeFile(tempPath, content, 'utf-8')\r\n await fs.rename(tempPath, filePath)\r\n } catch (error) {\r\n try {\r\n await fs.unlink(tempPath)\r\n } catch {\r\n // Ignore temp file cleanup failures\r\n }\r\n throw error\r\n }\r\n}\r\n\r\n/**\r\n * Ensures a directory exists, creating it recursively if needed.\r\n * \r\n * @param dirPath - Path to the directory\r\n */\r\nexport async function ensureDir(dirPath: string): Promise<void> {\r\n try {\r\n await fs.mkdir(dirPath, { recursive: true })\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code !== 'EEXIST') {\r\n throw error\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Returns platform-specific paths for config, data, and cache directories.\r\n * Handles Windows, Linux, and macOS path conventions.\r\n * \r\n * @returns Platform-specific directory paths\r\n * @example\r\n * ```typescript\r\n * const paths = getPlatformPaths()\r\n * // Windows: { config: 'C:\\\\Users\\\\username\\\\AppData\\\\Roaming\\\\opencode', ... }\r\n * // Linux: { config: '/home/username/.config/opencode', ... }\r\n * ```\r\n */\r\nfunction getPlatformPaths(): PlatformPaths {\r\n const home = process.env.HOME || process.env.USERPROFILE || ''\r\n const isWindows = process.platform === 'win32'\r\n \r\n return {\r\n config: isWindows \r\n ? path.join(home, 'AppData', 'Roaming', 'opencode')\r\n : path.join(home, '.config', 'opencode'),\r\n data: isWindows\r\n ? path.join(home, 'AppData', 'Roaming', 'opencode')\r\n : path.join(home, '.local', 'share', 'opencode'),\r\n cache: isWindows\r\n ? path.join(home, 'AppData', 'Local', 'opencode', 'cache')\r\n : path.join(home, '.cache', 'opencode')\r\n }\r\n}\r\n\r\n/**\r\n * Returns the platform-specific config directory path.\r\n * \r\n * @returns Config directory path\r\n */\r\nexport function getConfigDir(): string {\r\n return getPlatformPaths().config\r\n}\r\n\r\n/**\r\n * Returns the platform-specific cache directory path.\r\n * \r\n * @returns Cache directory path\r\n */\r\nexport function getCacheDir(): string {\r\n return getPlatformPaths().cache\r\n}\r\n\r\n/**\r\n * Returns the platform-specific data directory path.\r\n * \r\n * @returns Data directory path\r\n */\r\nexport function getDataDir(): string {\r\n return getPlatformPaths().data\r\n}\r\n\r\n/**\r\n * Checks if a process with the given PID is currently running.\r\n * Uses a non-destructive signal (0) to check process existence.\r\n * \r\n * @param pid - Process ID to check\r\n * @returns true if the process exists, false otherwise\r\n */\r\nfunction isProcessRunning(pid: number): boolean {\r\n try {\r\n // Signal 0 doesn't kill the process, just checks if it exists\r\n process.kill(pid, 0)\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\n/**\r\n * Cleans up old backup files, keeping only the most recent MAX_BACKUPS.\r\n * \r\n * @param backupDir - Directory containing backup files\r\n * @param baseName - Base name of the file being backed up\r\n */\r\nasync function cleanupOldBackups(backupDir: string, baseName: string): Promise<void> {\r\n try {\r\n const files = await fs.readdir(backupDir)\r\n const backups = files\r\n .filter(f => f.startsWith(baseName) && f.endsWith('.bak'))\r\n .map(f => ({\r\n name: f,\r\n // Extract timestamp from filename like \"file.json.1234567890.bak\"\r\n timestamp: parseInt(f.split('.').slice(-2, -1)[0]) || 0\r\n }))\r\n .sort((a, b) => b.timestamp - a.timestamp) // Sort newest first\r\n \r\n // Keep only the most recent backups\r\n for (const oldBackup of backups.slice(MAX_BACKUPS)) {\r\n await fs.unlink(path.join(backupDir, oldBackup.name))\r\n }\r\n } catch {\r\n // Ignore cleanup failures - don't want to fail the main operation\r\n }\r\n}\r\n\r\n/**\r\n * Acquires an exclusive lock for coordinating file operations.\r\n * Automatically cleans up stale locks from crashed processes.\r\n * \r\n * @param lockName - Name of the lock\r\n * @param timeoutMs - Maximum time to wait for lock acquisition (default: 5000ms)\r\n * @returns Function to release the lock\r\n * @throws Error if lock cannot be acquired within timeout\r\n */\r\nexport async function acquireLock(lockName: string, timeoutMs = 5000): Promise<() => Promise<void>> {\r\n const lockDir = getCacheDir()\r\n const lockPath = path.join(lockDir, `${lockName}.lock`)\r\n\r\n await ensureDir(lockDir)\r\n\r\n try {\r\n const lockContent = await fs.readFile(lockPath, 'utf-8')\r\n const metadata = JSON.parse(lockContent) as LockMetadata\r\n const staleThreshold = Date.now() - LOCK_STALE_THRESHOLD_MS\r\n \r\n // Check if timestamp is stale OR if the holding process is no longer running\r\n const isStale = metadata.timestamp < staleThreshold\r\n const processExists = metadata.pid ? isProcessRunning(metadata.pid) : true\r\n \r\n // Note: TOCTOU race possible between check and delete, but mitigated by\r\n // atomic 'wx' flag in subsequent fs.open() call which provides ultimate protection\r\n if (isStale || !processExists) {\r\n await fs.unlink(lockPath)\r\n }\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\r\n console.error('Failed to clean up stale lock')\r\n }\r\n }\r\n\r\n const startTime = Date.now()\r\n\r\n while (Date.now() - startTime < timeoutMs) {\r\n try {\r\n const fd = await fs.open(lockPath, 'wx')\r\n const metadata: LockMetadata = {\r\n pid: process.pid,\r\n timestamp: Date.now()\r\n }\r\n await fd.writeFile(JSON.stringify(metadata))\r\n await fd.close()\r\n\r\n return async () => {\r\n try {\r\n await fs.unlink(lockPath)\r\n } catch {\r\n // Ignore unlock failures\r\n }\r\n }\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code !== 'EEXIST') {\r\n throw error\r\n }\r\n\r\n await new Promise(resolve => setTimeout(resolve, LOCK_RETRY_INTERVAL_MS))\r\n }\r\n }\r\n\r\n throw new Error(`Failed to acquire lock \"${lockName}\" after ${timeoutMs}ms`)\r\n}\r\n", "/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n'use strict';\r\n/**\r\n * Creates a JSON scanner on the given text.\r\n * If ignoreTrivia is set, whitespaces or comments are ignored.\r\n */\r\nexport function createScanner(text, ignoreTrivia = false) {\r\n const len = text.length;\r\n let pos = 0, value = '', tokenOffset = 0, token = 16 /* SyntaxKind.Unknown */, lineNumber = 0, lineStartOffset = 0, tokenLineStartOffset = 0, prevTokenLineStartOffset = 0, scanError = 0 /* ScanError.None */;\r\n function scanHexDigits(count, exact) {\r\n let digits = 0;\r\n let value = 0;\r\n while (digits < count || !exact) {\r\n let ch = text.charCodeAt(pos);\r\n if (ch >= 48 /* CharacterCodes._0 */ && ch <= 57 /* CharacterCodes._9 */) {\r\n value = value * 16 + ch - 48 /* CharacterCodes._0 */;\r\n }\r\n else if (ch >= 65 /* CharacterCodes.A */ && ch <= 70 /* CharacterCodes.F */) {\r\n value = value * 16 + ch - 65 /* CharacterCodes.A */ + 10;\r\n }\r\n else if (ch >= 97 /* CharacterCodes.a */ && ch <= 102 /* CharacterCodes.f */) {\r\n value = value * 16 + ch - 97 /* CharacterCodes.a */ + 10;\r\n }\r\n else {\r\n break;\r\n }\r\n pos++;\r\n digits++;\r\n }\r\n if (digits < count) {\r\n value = -1;\r\n }\r\n return value;\r\n }\r\n function setPosition(newPosition) {\r\n pos = newPosition;\r\n value = '';\r\n tokenOffset = 0;\r\n token = 16 /* SyntaxKind.Unknown */;\r\n scanError = 0 /* ScanError.None */;\r\n }\r\n function scanNumber() {\r\n let start = pos;\r\n if (text.charCodeAt(pos) === 48 /* CharacterCodes._0 */) {\r\n pos++;\r\n }\r\n else {\r\n pos++;\r\n while (pos < text.length && isDigit(text.charCodeAt(pos))) {\r\n pos++;\r\n }\r\n }\r\n if (pos < text.length && text.charCodeAt(pos) === 46 /* CharacterCodes.dot */) {\r\n pos++;\r\n if (pos < text.length && isDigit(text.charCodeAt(pos))) {\r\n pos++;\r\n while (pos < text.length && isDigit(text.charCodeAt(pos))) {\r\n pos++;\r\n }\r\n }\r\n else {\r\n scanError = 3 /* ScanError.UnexpectedEndOfNumber */;\r\n return text.substring(start, pos);\r\n }\r\n }\r\n let end = pos;\r\n if (pos < text.length && (text.charCodeAt(pos) === 69 /* CharacterCodes.E */ || text.charCodeAt(pos) === 101 /* CharacterCodes.e */)) {\r\n pos++;\r\n if (pos < text.length && text.charCodeAt(pos) === 43 /* CharacterCodes.plus */ || text.charCodeAt(pos) === 45 /* CharacterCodes.minus */) {\r\n pos++;\r\n }\r\n if (pos < text.length && isDigit(text.charCodeAt(pos))) {\r\n pos++;\r\n while (pos < text.length && isDigit(text.charCodeAt(pos))) {\r\n pos++;\r\n }\r\n end = pos;\r\n }\r\n else {\r\n scanError = 3 /* ScanError.UnexpectedEndOfNumber */;\r\n }\r\n }\r\n return text.substring(start, end);\r\n }\r\n function scanString() {\r\n let result = '', start = pos;\r\n while (true) {\r\n if (pos >= len) {\r\n result += text.substring(start, pos);\r\n scanError = 2 /* ScanError.UnexpectedEndOfString */;\r\n break;\r\n }\r\n const ch = text.charCodeAt(pos);\r\n if (ch === 34 /* CharacterCodes.doubleQuote */) {\r\n result += text.substring(start, pos);\r\n pos++;\r\n break;\r\n }\r\n if (ch === 92 /* CharacterCodes.backslash */) {\r\n result += text.substring(start, pos);\r\n pos++;\r\n if (pos >= len) {\r\n scanError = 2 /* ScanError.UnexpectedEndOfString */;\r\n break;\r\n }\r\n const ch2 = text.charCodeAt(pos++);\r\n switch (ch2) {\r\n case 34 /* CharacterCodes.doubleQuote */:\r\n result += '\\\"';\r\n break;\r\n case 92 /* CharacterCodes.backslash */:\r\n result += '\\\\';\r\n break;\r\n case 47 /* CharacterCodes.slash */:\r\n result += '/';\r\n break;\r\n case 98 /* CharacterCodes.b */:\r\n result += '\\b';\r\n break;\r\n case 102 /* CharacterCodes.f */:\r\n result += '\\f';\r\n break;\r\n case 110 /* CharacterCodes.n */:\r\n result += '\\n';\r\n break;\r\n case 114 /* CharacterCodes.r */:\r\n result += '\\r';\r\n break;\r\n case 116 /* CharacterCodes.t */:\r\n result += '\\t';\r\n break;\r\n case 117 /* CharacterCodes.u */:\r\n const ch3 = scanHexDigits(4, true);\r\n if (ch3 >= 0) {\r\n result += String.fromCharCode(ch3);\r\n }\r\n else {\r\n scanError = 4 /* ScanError.InvalidUnicode */;\r\n }\r\n break;\r\n default:\r\n scanError = 5 /* ScanError.InvalidEscapeCharacter */;\r\n }\r\n start = pos;\r\n continue;\r\n }\r\n if (ch >= 0 && ch <= 0x1f) {\r\n if (isLineBreak(ch)) {\r\n result += text.substring(start, pos);\r\n scanError = 2 /* ScanError.UnexpectedEndOfString */;\r\n break;\r\n }\r\n else {\r\n scanError = 6 /* ScanError.InvalidCharacter */;\r\n // mark as error but continue with string\r\n }\r\n }\r\n pos++;\r\n }\r\n return result;\r\n }\r\n function scanNext() {\r\n value = '';\r\n scanError = 0 /* ScanError.None */;\r\n tokenOffset = pos;\r\n lineStartOffset = lineNumber;\r\n prevTokenLineStartOffset = tokenLineStartOffset;\r\n if (pos >= len) {\r\n // at the end\r\n tokenOffset = len;\r\n return token = 17 /* SyntaxKind.EOF */;\r\n }\r\n let code = text.charCodeAt(pos);\r\n // trivia: whitespace\r\n if (isWhiteSpace(code)) {\r\n do {\r\n pos++;\r\n value += String.fromCharCode(code);\r\n code = text.charCodeAt(pos);\r\n } while (isWhiteSpace(code));\r\n return token = 15 /* SyntaxKind.Trivia */;\r\n }\r\n // trivia: newlines\r\n if (isLineBreak(code)) {\r\n pos++;\r\n value += String.fromCharCode(code);\r\n if (code === 13 /* CharacterCodes.carriageReturn */ && text.charCodeAt(pos) === 10 /* CharacterCodes.lineFeed */) {\r\n pos++;\r\n value += '\\n';\r\n }\r\n lineNumber++;\r\n tokenLineStartOffset = pos;\r\n return token = 14 /* SyntaxKind.LineBreakTrivia */;\r\n }\r\n switch (code) {\r\n // tokens: []{}:,\r\n case 123 /* CharacterCodes.openBrace */:\r\n pos++;\r\n return token = 1 /* SyntaxKind.OpenBraceToken */;\r\n case 125 /* CharacterCodes.closeBrace */:\r\n pos++;\r\n return token = 2 /* SyntaxKind.CloseBraceToken */;\r\n case 91 /* CharacterCodes.openBracket */:\r\n pos++;\r\n return token = 3 /* SyntaxKind.OpenBracketToken */;\r\n case 93 /* CharacterCodes.closeBracket */:\r\n pos++;\r\n return token = 4 /* SyntaxKind.CloseBracketToken */;\r\n case 58 /* CharacterCodes.colon */:\r\n pos++;\r\n return token = 6 /* SyntaxKind.ColonToken */;\r\n case 44 /* CharacterCodes.comma */:\r\n pos++;\r\n return token = 5 /* SyntaxKind.CommaToken */;\r\n // strings\r\n case 34 /* CharacterCodes.doubleQuote */:\r\n pos++;\r\n value = scanString();\r\n return token = 10 /* SyntaxKind.StringLiteral */;\r\n // comments\r\n case 47 /* CharacterCodes.slash */:\r\n const start = pos - 1;\r\n // Single-line comment\r\n if (text.charCodeAt(pos + 1) === 47 /* CharacterCodes.slash */) {\r\n pos += 2;\r\n while (pos < len) {\r\n if (isLineBreak(text.charCodeAt(pos))) {\r\n break;\r\n }\r\n pos++;\r\n }\r\n value = text.substring(start, pos);\r\n return token = 12 /* SyntaxKind.LineCommentTrivia */;\r\n }\r\n // Multi-line comment\r\n if (text.charCodeAt(pos + 1) === 42 /* CharacterCodes.asterisk */) {\r\n pos += 2;\r\n const safeLength = len - 1; // For lookahead.\r\n let commentClosed = false;\r\n while (pos < safeLength) {\r\n const ch = text.charCodeAt(pos);\r\n if (ch === 42 /* CharacterCodes.asterisk */ && text.charCodeAt(pos + 1) === 47 /* CharacterCodes.slash */) {\r\n pos += 2;\r\n commentClosed = true;\r\n break;\r\n }\r\n pos++;\r\n if (isLineBreak(ch)) {\r\n if (ch === 13 /* CharacterCodes.carriageReturn */ && text.charCodeAt(pos) === 10 /* CharacterCodes.lineFeed */) {\r\n pos++;\r\n }\r\n lineNumber++;\r\n tokenLineStartOffset = pos;\r\n }\r\n }\r\n if (!commentClosed) {\r\n pos++;\r\n scanError = 1 /* ScanError.UnexpectedEndOfComment */;\r\n }\r\n value = text.substring(start, pos);\r\n return token = 13 /* SyntaxKind.BlockCommentTrivia */;\r\n }\r\n // just a single slash\r\n value += String.fromCharCode(code);\r\n pos++;\r\n return token = 16 /* SyntaxKind.Unknown */;\r\n // numbers\r\n case 45 /* CharacterCodes.minus */:\r\n value += String.fromCharCode(code);\r\n pos++;\r\n if (pos === len || !isDigit(text.charCodeAt(pos))) {\r\n return token = 16 /* SyntaxKind.Unknown */;\r\n }\r\n // found a minus, followed by a number so\r\n // we fall through to proceed with scanning\r\n // numbers\r\n case 48 /* CharacterCodes._0 */:\r\n case 49 /* CharacterCodes._1 */:\r\n case 50 /* CharacterCodes._2 */:\r\n case 51 /* CharacterCodes._3 */:\r\n case 52 /* CharacterCodes._4 */:\r\n case 53 /* CharacterCodes._5 */:\r\n case 54 /* CharacterCodes._6 */:\r\n case 55 /* CharacterCodes._7 */:\r\n case 56 /* CharacterCodes._8 */:\r\n case 57 /* CharacterCodes._9 */:\r\n value += scanNumber();\r\n return token = 11 /* SyntaxKind.NumericLiteral */;\r\n // literals and unknown symbols\r\n default:\r\n // is a literal? Read the full word.\r\n while (pos < len && isUnknownContentCharacter(code)) {\r\n pos++;\r\n code = text.charCodeAt(pos);\r\n }\r\n if (tokenOffset !== pos) {\r\n value = text.substring(tokenOffset, pos);\r\n // keywords: true, false, null\r\n switch (value) {\r\n case 'true': return token = 8 /* SyntaxKind.TrueKeyword */;\r\n case 'false': return token = 9 /* SyntaxKind.FalseKeyword */;\r\n case 'null': return token = 7 /* SyntaxKind.NullKeyword */;\r\n }\r\n return token = 16 /* SyntaxKind.Unknown */;\r\n }\r\n // some\r\n value += String.fromCharCode(code);\r\n pos++;\r\n return token = 16 /* SyntaxKind.Unknown */;\r\n }\r\n }\r\n function isUnknownContentCharacter(code) {\r\n if (isWhiteSpace(code) || isLineBreak(code)) {\r\n return false;\r\n }\r\n switch (code) {\r\n case 125 /* CharacterCodes.closeBrace */:\r\n case 93 /* CharacterCodes.closeBracket */:\r\n case 123 /* CharacterCodes.openBrace */:\r\n case 91 /* CharacterCodes.openBracket */:\r\n case 34 /* CharacterCodes.doubleQuote */:\r\n case 58 /* CharacterCodes.colon */:\r\n case 44 /* CharacterCodes.comma */:\r\n case 47 /* CharacterCodes.slash */:\r\n return false;\r\n }\r\n return true;\r\n }\r\n function scanNextNonTrivia() {\r\n let result;\r\n do {\r\n result = scanNext();\r\n } while (result >= 12 /* SyntaxKind.LineCommentTrivia */ && result <= 15 /* SyntaxKind.Trivia */);\r\n return result;\r\n }\r\n return {\r\n setPosition: setPosition,\r\n getPosition: () => pos,\r\n scan: ignoreTrivia ? scanNextNonTrivia : scanNext,\r\n getToken: () => token,\r\n getTokenValue: () => value,\r\n getTokenOffset: () => tokenOffset,\r\n getTokenLength: () => pos - tokenOffset,\r\n getTokenStartLine: () => lineStartOffset,\r\n getTokenStartCharacter: () => tokenOffset - prevTokenLineStartOffset,\r\n getTokenError: () => scanError,\r\n };\r\n}\r\nfunction isWhiteSpace(ch) {\r\n return ch === 32 /* CharacterCodes.space */ || ch === 9 /* CharacterCodes.tab */;\r\n}\r\nfunction isLineBreak(ch) {\r\n return ch === 10 /* CharacterCodes.lineFeed */ || ch === 13 /* CharacterCodes.carriageReturn */;\r\n}\r\nfunction isDigit(ch) {\r\n return ch >= 48 /* CharacterCodes._0 */ && ch <= 57 /* CharacterCodes._9 */;\r\n}\r\nvar CharacterCodes;\r\n(function (CharacterCodes) {\r\n CharacterCodes[CharacterCodes[\"lineFeed\"] = 10] = \"lineFeed\";\r\n CharacterCodes[CharacterCodes[\"carriageReturn\"] = 13] = \"carriageReturn\";\r\n CharacterCodes[CharacterCodes[\"space\"] = 32] = \"space\";\r\n CharacterCodes[CharacterCodes[\"_0\"] = 48] = \"_0\";\r\n CharacterCodes[CharacterCodes[\"_1\"] = 49] = \"_1\";\r\n CharacterCodes[CharacterCodes[\"_2\"] = 50] = \"_2\";\r\n CharacterCodes[CharacterCodes[\"_3\"] = 51] = \"_3\";\r\n CharacterCodes[CharacterCodes[\"_4\"] = 52] = \"_4\";\r\n CharacterCodes[CharacterCodes[\"_5\"] = 53] = \"_5\";\r\n CharacterCodes[CharacterCodes[\"_6\"] = 54] = \"_6\";\r\n CharacterCodes[CharacterCodes[\"_7\"] = 55] = \"_7\";\r\n CharacterCodes[CharacterCodes[\"_8\"] = 56] = \"_8\";\r\n CharacterCodes[CharacterCodes[\"_9\"] = 57] = \"_9\";\r\n CharacterCodes[CharacterCodes[\"a\"] = 97] = \"a\";\r\n CharacterCodes[CharacterCodes[\"b\"] = 98] = \"b\";\r\n CharacterCodes[CharacterCodes[\"c\"] = 99] = \"c\";\r\n CharacterCodes[CharacterCodes[\"d\"] = 100] = \"d\";\r\n CharacterCodes[CharacterCodes[\"e\"] = 101] = \"e\";\r\n CharacterCodes[CharacterCodes[\"f\"] = 102] = \"f\";\r\n CharacterCodes[CharacterCodes[\"g\"] = 103] = \"g\";\r\n CharacterCodes[CharacterCodes[\"h\"] = 104] = \"h\";\r\n CharacterCodes[CharacterCodes[\"i\"] = 105] = \"i\";\r\n CharacterCodes[CharacterCodes[\"j\"] = 106] = \"j\";\r\n CharacterCodes[CharacterCodes[\"k\"] = 107] = \"k\";\r\n CharacterCodes[CharacterCodes[\"l\"] = 108] = \"l\";\r\n CharacterCodes[CharacterCodes[\"m\"] = 109] = \"m\";\r\n CharacterCodes[CharacterCodes[\"n\"] = 110] = \"n\";\r\n CharacterCodes[CharacterCodes[\"o\"] = 111] = \"o\";\r\n CharacterCodes[CharacterCodes[\"p\"] = 112] = \"p\";\r\n CharacterCodes[CharacterCodes[\"q\"] = 113] = \"q\";\r\n CharacterCodes[CharacterCodes[\"r\"] = 114] = \"r\";\r\n CharacterCodes[CharacterCodes[\"s\"] = 115] = \"s\";\r\n CharacterCodes[CharacterCodes[\"t\"] = 116] = \"t\";\r\n CharacterCodes[CharacterCodes[\"u\"] = 117] = \"u\";\r\n CharacterCodes[CharacterCodes[\"v\"] = 118] = \"v\";\r\n CharacterCodes[CharacterCodes[\"w\"] = 119] = \"w\";\r\n CharacterCodes[CharacterCodes[\"x\"] = 120] = \"x\";\r\n CharacterCodes[CharacterCodes[\"y\"] = 121] = \"y\";\r\n CharacterCodes[CharacterCodes[\"z\"] = 122] = \"z\";\r\n CharacterCodes[CharacterCodes[\"A\"] = 65] = \"A\";\r\n CharacterCodes[CharacterCodes[\"B\"] = 66] = \"B\";\r\n CharacterCodes[CharacterCodes[\"C\"] = 67] = \"C\";\r\n CharacterCodes[CharacterCodes[\"D\"] = 68] = \"D\";\r\n CharacterCodes[CharacterCodes[\"E\"] = 69] = \"E\";\r\n CharacterCodes[CharacterCodes[\"F\"] = 70] = \"F\";\r\n CharacterCodes[CharacterCodes[\"G\"] = 71] = \"G\";\r\n CharacterCodes[CharacterCodes[\"H\"] = 72] = \"H\";\r\n CharacterCodes[CharacterCodes[\"I\"] = 73] = \"I\";\r\n CharacterCodes[CharacterCodes[\"J\"] = 74] = \"J\";\r\n CharacterCodes[CharacterCodes[\"K\"] = 75] = \"K\";\r\n CharacterCodes[CharacterCodes[\"L\"] = 76] = \"L\";\r\n CharacterCodes[CharacterCodes[\"M\"] = 77] = \"M\";\r\n CharacterCodes[CharacterCodes[\"N\"] = 78] = \"N\";\r\n CharacterCodes[CharacterCodes[\"O\"] = 79] = \"O\";\r\n CharacterCodes[CharacterCodes[\"P\"] = 80] = \"P\";\r\n CharacterCodes[CharacterCodes[\"Q\"] = 81] = \"Q\";\r\n CharacterCodes[CharacterCodes[\"R\"] = 82] = \"R\";\r\n CharacterCodes[CharacterCodes[\"S\"] = 83] = \"S\";\r\n CharacterCodes[CharacterCodes[\"T\"] = 84] = \"T\";\r\n CharacterCodes[CharacterCodes[\"U\"] = 85] = \"U\";\r\n CharacterCodes[CharacterCodes[\"V\"] = 86] = \"V\";\r\n CharacterCodes[CharacterCodes[\"W\"] = 87] = \"W\";\r\n CharacterCodes[CharacterCodes[\"X\"] = 88] = \"X\";\r\n CharacterCodes[CharacterCodes[\"Y\"] = 89] = \"Y\";\r\n CharacterCodes[CharacterCodes[\"Z\"] = 90] = \"Z\";\r\n CharacterCodes[CharacterCodes[\"asterisk\"] = 42] = \"asterisk\";\r\n CharacterCodes[CharacterCodes[\"backslash\"] = 92] = \"backslash\";\r\n CharacterCodes[CharacterCodes[\"closeBrace\"] = 125] = \"closeBrace\";\r\n CharacterCodes[CharacterCodes[\"closeBracket\"] = 93] = \"closeBracket\";\r\n CharacterCodes[CharacterCodes[\"colon\"] = 58] = \"colon\";\r\n CharacterCodes[CharacterCodes[\"comma\"] = 44] = \"comma\";\r\n CharacterCodes[CharacterCodes[\"dot\"] = 46] = \"dot\";\r\n CharacterCodes[CharacterCodes[\"doubleQuote\"] = 34] = \"doubleQuote\";\r\n CharacterCodes[CharacterCodes[\"minus\"] = 45] = \"minus\";\r\n CharacterCodes[CharacterCodes[\"openBrace\"] = 123] = \"openBrace\";\r\n CharacterCodes[CharacterCodes[\"openBracket\"] = 91] = \"openBracket\";\r\n CharacterCodes[CharacterCodes[\"plus\"] = 43] = \"plus\";\r\n CharacterCodes[CharacterCodes[\"slash\"] = 47] = \"slash\";\r\n CharacterCodes[CharacterCodes[\"formFeed\"] = 12] = \"formFeed\";\r\n CharacterCodes[CharacterCodes[\"tab\"] = 9] = \"tab\";\r\n})(CharacterCodes || (CharacterCodes = {}));\r\n", "export const cachedSpaces = new Array(20).fill(0).map((_, index) => {\r\n return ' '.repeat(index);\r\n});\r\nconst maxCachedValues = 200;\r\nexport const cachedBreakLinesWithSpaces = {\r\n ' ': {\r\n '\\n': new Array(maxCachedValues).fill(0).map((_, index) => {\r\n return '\\n' + ' '.repeat(index);\r\n }),\r\n '\\r': new Array(maxCachedValues).fill(0).map((_, index) => {\r\n return '\\r' + ' '.repeat(index);\r\n }),\r\n '\\r\\n': new Array(maxCachedValues).fill(0).map((_, index) => {\r\n return '\\r\\n' + ' '.repeat(index);\r\n }),\r\n },\r\n '\\t': {\r\n '\\n': new Array(maxCachedValues).fill(0).map((_, index) => {\r\n return '\\n' + '\\t'.repeat(index);\r\n }),\r\n '\\r': new Array(maxCachedValues).fill(0).map((_, index) => {\r\n return '\\r' + '\\t'.repeat(index);\r\n }),\r\n '\\r\\n': new Array(maxCachedValues).fill(0).map((_, index) => {\r\n return '\\r\\n' + '\\t'.repeat(index);\r\n }),\r\n }\r\n};\r\nexport const supportedEols = ['\\n', '\\r', '\\r\\n'];\r\n", "/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n'use strict';\r\nimport { createScanner } from './scanner';\r\nimport { cachedSpaces, cachedBreakLinesWithSpaces, supportedEols } from './string-intern';\r\nexport function format(documentText, range, options) {\r\n let initialIndentLevel;\r\n let formatText;\r\n let formatTextStart;\r\n let rangeStart;\r\n let rangeEnd;\r\n if (range) {\r\n rangeStart = range.offset;\r\n rangeEnd = rangeStart + range.length;\r\n formatTextStart = rangeStart;\r\n while (formatTextStart > 0 && !isEOL(documentText, formatTextStart - 1)) {\r\n formatTextStart--;\r\n }\r\n let endOffset = rangeEnd;\r\n while (endOffset < documentText.length && !isEOL(documentText, endOffset)) {\r\n endOffset++;\r\n }\r\n formatText = documentText.substring(formatTextStart, endOffset);\r\n initialIndentLevel = computeIndentLevel(formatText, options);\r\n }\r\n else {\r\n formatText = documentText;\r\n initialIndentLevel = 0;\r\n formatTextStart = 0;\r\n rangeStart = 0;\r\n rangeEnd = documentText.length;\r\n }\r\n const eol = getEOL(options, documentText);\r\n const eolFastPathSupported = supportedEols.includes(eol);\r\n let numberLineBreaks = 0;\r\n let indentLevel = 0;\r\n let indentValue;\r\n if (options.insertSpaces) {\r\n indentValue = cachedSpaces[options.tabSize || 4] ?? repeat(cachedSpaces[1], options.tabSize || 4);\r\n }\r\n else {\r\n indentValue = '\\t';\r\n }\r\n const indentType = indentValue === '\\t' ? '\\t' : ' ';\r\n let scanner = createScanner(formatText, false);\r\n let hasError = false;\r\n function newLinesAndIndent() {\r\n if (numberLineBreaks > 1) {\r\n return repeat(eol, numberLineBreaks) + repeat(indentValue, initialIndentLevel + indentLevel);\r\n }\r\n const amountOfSpaces = indentValue.length * (initialIndentLevel + indentLevel);\r\n if (!eolFastPathSupported || amountOfSpaces > cachedBreakLinesWithSpaces[indentType][eol].length) {\r\n return eol + repeat(indentValue, initialIndentLevel + indentLevel);\r\n }\r\n if (amountOfSpaces <= 0) {\r\n return eol;\r\n }\r\n return cachedBreakLinesWithSpaces[indentType][eol][amountOfSpaces];\r\n }\r\n function scanNext() {\r\n let token = scanner.scan();\r\n numberLineBreaks = 0;\r\n while (token === 15 /* SyntaxKind.Trivia */ || token === 14 /* SyntaxKind.LineBreakTrivia */) {\r\n if (token === 14 /* SyntaxKind.LineBreakTrivia */ && options.keepLines) {\r\n numberLineBreaks += 1;\r\n }\r\n else if (token === 14 /* SyntaxKind.LineBreakTrivia */) {\r\n numberLineBreaks = 1;\r\n }\r\n token = scanner.scan();\r\n }\r\n hasError = token === 16 /* SyntaxKind.Unknown */ || scanner.getTokenError() !== 0 /* ScanError.None */;\r\n return token;\r\n }\r\n const editOperations = [];\r\n function addEdit(text, startOffset, endOffset) {\r\n if (!hasError && (!range || (startOffset < rangeEnd && endOffset > rangeStart)) && documentText.substring(startOffset, endOffset) !== text) {\r\n editOperations.push({ offset: startOffset, length: endOffset - startOffset, content: text });\r\n }\r\n }\r\n let firstToken = scanNext();\r\n if (options.keepLines && numberLineBreaks > 0) {\r\n addEdit(repeat(eol, numberLineBreaks), 0, 0);\r\n }\r\n if (firstToken !== 17 /* SyntaxKind.EOF */) {\r\n let firstTokenStart = scanner.getTokenOffset() + formatTextStart;\r\n let initialIndent = (indentValue.length * initialIndentLevel < 20) && options.insertSpaces\r\n ? cachedSpaces[indentValue.length * initialIndentLevel]\r\n : repeat(indentValue, initialIndentLevel);\r\n addEdit(initialIndent, formatTextStart, firstTokenStart);\r\n }\r\n while (firstToken !== 17 /* SyntaxKind.EOF */) {\r\n let firstTokenEnd = scanner.getTokenOffset() + scanner.getTokenLength() + formatTextStart;\r\n let secondToken = scanNext();\r\n let replaceContent = '';\r\n let needsLineBreak = false;\r\n while (numberLineBreaks === 0 && (secondToken === 12 /* SyntaxKind.LineCommentTrivia */ || secondToken === 13 /* SyntaxKind.BlockCommentTrivia */)) {\r\n let commentTokenStart = scanner.getTokenOffset() + formatTextStart;\r\n addEdit(cachedSpaces[1], firstTokenEnd, commentTokenStart);\r\n firstTokenEnd = scanner.getTokenOffset() + scanner.getTokenLength() + formatTextStart;\r\n needsLineBreak = secondToken === 12 /* SyntaxKind.LineCommentTrivia */;\r\n replaceContent = needsLineBreak ? newLinesAndIndent() : '';\r\n secondToken = scanNext();\r\n }\r\n if (secondToken === 2 /* SyntaxKind.CloseBraceToken */) {\r\n if (firstToken !== 1 /* SyntaxKind.OpenBraceToken */) {\r\n indentLevel--;\r\n }\r\n ;\r\n if (options.keepLines && numberLineBreaks > 0 || !options.keepLines && firstToken !== 1 /* SyntaxKind.OpenBraceToken */) {\r\n replaceContent = newLinesAndIndent();\r\n }\r\n else if (options.keepLines) {\r\n replaceContent = cachedSpaces[1];\r\n }\r\n }\r\n else if (secondToken === 4 /* SyntaxKind.CloseBracketToken */) {\r\n if (firstToken !== 3 /* SyntaxKind.OpenBracketToken */) {\r\n indentLevel--;\r\n }\r\n ;\r\n if (options.keepLines && numberLineBreaks > 0 || !options.keepLines && firstToken !== 3 /* SyntaxKind.OpenBracketToken */) {\r\n replaceContent = newLinesAndIndent();\r\n }\r\n else if (options.keepLines) {\r\n replaceContent = cachedSpaces[1];\r\n }\r\n }\r\n else {\r\n switch (firstToken) {\r\n case 3 /* SyntaxKind.OpenBracketToken */:\r\n case 1 /* SyntaxKind.OpenBraceToken */:\r\n indentLevel++;\r\n if (options.keepLines && numberLineBreaks > 0 || !options.keepLines) {\r\n replaceContent = newLinesAndIndent();\r\n }\r\n else {\r\n replaceContent = cachedSpaces[1];\r\n }\r\n break;\r\n case 5 /* SyntaxKind.CommaToken */:\r\n if (options.keepLines && numberLineBreaks > 0 || !options.keepLines) {\r\n replaceContent = newLinesAndIndent();\r\n }\r\n else {\r\n replaceContent = cachedSpaces[1];\r\n }\r\n break;\r\n case 12 /* SyntaxKind.LineCommentTrivia */:\r\n replaceContent = newLinesAndIndent();\r\n break;\r\n case 13 /* SyntaxKind.BlockCommentTrivia */:\r\n if (numberLineBreaks > 0) {\r\n replaceContent = newLinesAndIndent();\r\n }\r\n else if (!needsLineBreak) {\r\n replaceContent = cachedSpaces[1];\r\n }\r\n break;\r\n case 6 /* SyntaxKind.ColonToken */:\r\n if (options.keepLines && numberLineBreaks > 0) {\r\n replaceContent = newLinesAndIndent();\r\n }\r\n else if (!needsLineBreak) {\r\n replaceContent = cachedSpaces[1];\r\n }\r\n break;\r\n case 10 /* SyntaxKind.StringLiteral */:\r\n if (options.keepLines && numberLineBreaks > 0) {\r\n replaceContent = newLinesAndIndent();\r\n }\r\n else if (secondToken === 6 /* SyntaxKind.ColonToken */ && !needsLineBreak) {\r\n replaceContent = '';\r\n }\r\n break;\r\n case 7 /* SyntaxKind.NullKeyword */:\r\n case 8 /* SyntaxKind.TrueKeyword */:\r\n case 9 /* SyntaxKind.FalseKeyword */:\r\n case 11 /* SyntaxKind.NumericLiteral */:\r\n case 2 /* SyntaxKind.CloseBraceToken */:\r\n case 4 /* SyntaxKind.CloseBracketToken */:\r\n if (options.keepLines && numberLineBreaks > 0) {\r\n replaceContent = newLinesAndIndent();\r\n }\r\n else {\r\n if ((secondToken === 12 /* SyntaxKind.LineCommentTrivia */ || secondToken === 13 /* SyntaxKind.BlockCommentTrivia */) && !needsLineBreak) {\r\n replaceContent = cachedSpaces[1];\r\n }\r\n else if (secondToken !== 5 /* SyntaxKind.CommaToken */ && secondToken !== 17 /* SyntaxKind.EOF */) {\r\n hasError = true;\r\n }\r\n }\r\n break;\r\n case 16 /* SyntaxKind.Unknown */:\r\n hasError = true;\r\n break;\r\n }\r\n if (numberLineBreaks > 0 && (secondToken === 12 /* SyntaxKind.LineCommentTrivia */ || secondToken === 13 /* SyntaxKind.BlockCommentTrivia */)) {\r\n replaceContent = newLinesAndIndent();\r\n }\r\n }\r\n if (secondToken === 17 /* SyntaxKind.EOF */) {\r\n if (options.keepLines && numberLineBreaks > 0) {\r\n replaceContent = newLinesAndIndent();\r\n }\r\n else {\r\n replaceContent = options.insertFinalNewline ? eol : '';\r\n }\r\n }\r\n const secondTokenStart = scanner.getTokenOffset() + formatTextStart;\r\n addEdit(replaceContent, firstTokenEnd, secondTokenStart);\r\n firstToken = secondToken;\r\n }\r\n return editOperations;\r\n}\r\nfunction repeat(s, count) {\r\n let result = '';\r\n for (let i = 0; i < count; i++) {\r\n result += s;\r\n }\r\n return result;\r\n}\r\nfunction computeIndentLevel(content, options) {\r\n let i = 0;\r\n let nChars = 0;\r\n const tabSize = options.tabSize || 4;\r\n while (i < content.length) {\r\n let ch = content.charAt(i);\r\n if (ch === cachedSpaces[1]) {\r\n nChars++;\r\n }\r\n else if (ch === '\\t') {\r\n nChars += tabSize;\r\n }\r\n else {\r\n break;\r\n }\r\n i++;\r\n }\r\n return Math.floor(nChars / tabSize);\r\n}\r\nfunction getEOL(options, text) {\r\n for (let i = 0; i < text.length; i++) {\r\n const ch = text.charAt(i);\r\n if (ch === '\\r') {\r\n if (i + 1 < text.length && text.charAt(i + 1) === '\\n') {\r\n return '\\r\\n';\r\n }\r\n return '\\r';\r\n }\r\n else if (ch === '\\n') {\r\n return '\\n';\r\n }\r\n }\r\n return (options && options.eol) || '\\n';\r\n}\r\nexport function isEOL(text, offset) {\r\n return '\\r\\n'.indexOf(text.charAt(offset)) !== -1;\r\n}\r\n", "/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n'use strict';\r\nimport { createScanner } from './scanner';\r\nvar ParseOptions;\r\n(function (ParseOptions) {\r\n ParseOptions.DEFAULT = {\r\n allowTrailingComma: false\r\n };\r\n})(ParseOptions || (ParseOptions = {}));\r\n/**\r\n * For a given offset, evaluate the location in the JSON document. Each segment in the location path is either a property name or an array index.\r\n */\r\nexport function getLocation(text, position) {\r\n const segments = []; // strings or numbers\r\n const earlyReturnException = new Object();\r\n let previousNode = undefined;\r\n const previousNodeInst = {\r\n value: {},\r\n offset: 0,\r\n length: 0,\r\n type: 'object',\r\n parent: undefined\r\n };\r\n let isAtPropertyKey = false;\r\n function setPreviousNode(value, offset, length, type) {\r\n previousNodeInst.value = value;\r\n previousNodeInst.offset = offset;\r\n previousNodeInst.length = length;\r\n previousNodeInst.type = type;\r\n previousNodeInst.colonOffset = undefined;\r\n previousNode = previousNodeInst;\r\n }\r\n try {\r\n visit(text, {\r\n onObjectBegin: (offset, length) => {\r\n if (position <= offset) {\r\n throw earlyReturnException;\r\n }\r\n previousNode = undefined;\r\n isAtPropertyKey = position > offset;\r\n segments.push(''); // push a placeholder (will be replaced)\r\n },\r\n onObjectProperty: (name, offset, length) => {\r\n if (position < offset) {\r\n throw earlyReturnException;\r\n }\r\n setPreviousNode(name, offset, length, 'property');\r\n segments[segments.length - 1] = name;\r\n if (position <= offset + length) {\r\n throw earlyReturnException;\r\n }\r\n },\r\n onObjectEnd: (offset, length) => {\r\n if (position <= offset) {\r\n throw earlyReturnException;\r\n }\r\n previousNode = undefined;\r\n segments.pop();\r\n },\r\n onArrayBegin: (offset, length) => {\r\n if (position <= offset) {\r\n throw earlyReturnException;\r\n }\r\n previousNode = undefined;\r\n segments.push(0);\r\n },\r\n onArrayEnd: (offset, length) => {\r\n if (position <= offset) {\r\n throw earlyReturnException;\r\n }\r\n previousNode = undefined;\r\n segments.pop();\r\n },\r\n onLiteralValue: (value, offset, length) => {\r\n if (position < offset) {\r\n throw earlyReturnException;\r\n }\r\n setPreviousNode(value, offset, length, getNodeType(value));\r\n if (position <= offset + length) {\r\n throw earlyReturnException;\r\n }\r\n },\r\n onSeparator: (sep, offset, length) => {\r\n if (position <= offset) {\r\n throw earlyReturnException;\r\n }\r\n if (sep === ':' && previousNode && previousNode.type === 'property') {\r\n previousNode.colonOffset = offset;\r\n isAtPropertyKey = false;\r\n previousNode = undefined;\r\n }\r\n else if (sep === ',') {\r\n const last = segments[segments.length - 1];\r\n if (typeof last === 'number') {\r\n segments[segments.length - 1] = last + 1;\r\n }\r\n else {\r\n isAtPropertyKey = true;\r\n segments[segments.length - 1] = '';\r\n }\r\n previousNode = undefined;\r\n }\r\n }\r\n });\r\n }\r\n catch (e) {\r\n if (e !== earlyReturnException) {\r\n throw e;\r\n }\r\n }\r\n return {\r\n path: segments,\r\n previousNode,\r\n isAtPropertyKey,\r\n matches: (pattern) => {\r\n let k = 0;\r\n for (let i = 0; k < pattern.length && i < segments.length; i++) {\r\n if (pattern[k] === segments[i] || pattern[k] === '*') {\r\n k++;\r\n }\r\n else if (pattern[k] !== '**') {\r\n return false;\r\n }\r\n }\r\n return k === pattern.length;\r\n }\r\n };\r\n}\r\n/**\r\n * Parses the given text and returns the object the JSON content represents. On invalid input, the parser tries to be as fault tolerant as possible, but still return a result.\r\n * Therefore always check the errors list to find out if the input was valid.\r\n */\r\nexport function parse(text, errors = [], options = ParseOptions.DEFAULT) {\r\n let currentProperty = null;\r\n let currentParent = [];\r\n const previousParents = [];\r\n function onValue(value) {\r\n if (Array.isArray(currentParent)) {\r\n currentParent.push(value);\r\n }\r\n else if (currentProperty !== null) {\r\n currentParent[currentProperty] = value;\r\n }\r\n }\r\n const visitor = {\r\n onObjectBegin: () => {\r\n const object = {};\r\n onValue(object);\r\n previousParents.push(currentParent);\r\n currentParent = object;\r\n currentProperty = null;\r\n },\r\n onObjectProperty: (name) => {\r\n currentProperty = name;\r\n },\r\n onObjectEnd: () => {\r\n currentParent = previousParents.pop();\r\n },\r\n onArrayBegin: () => {\r\n const array = [];\r\n onValue(array);\r\n previousParents.push(currentParent);\r\n currentParent = array;\r\n currentProperty = null;\r\n },\r\n onArrayEnd: () => {\r\n currentParent = previousParents.pop();\r\n },\r\n onLiteralValue: onValue,\r\n onError: (error, offset, length) => {\r\n errors.push({ error, offset, length });\r\n }\r\n };\r\n visit(text, visitor, options);\r\n return currentParent[0];\r\n}\r\n/**\r\n * Parses the given text and returns a tree representation the JSON content. On invalid input, the parser tries to be as fault tolerant as possible, but still return a result.\r\n */\r\nexport function parseTree(text, errors = [], options = ParseOptions.DEFAULT) {\r\n let currentParent = { type: 'array', offset: -1, length: -1, children: [], parent: undefined }; // artificial root\r\n function ensurePropertyComplete(endOffset) {\r\n if (currentParent.type === 'property') {\r\n currentParent.length = endOffset - currentParent.offset;\r\n currentParent = currentParent.parent;\r\n }\r\n }\r\n function onValue(valueNode) {\r\n currentParent.children.push(valueNode);\r\n return valueNode;\r\n }\r\n const visitor = {\r\n onObjectBegin: (offset) => {\r\n currentParent = onValue({ type: 'object', offset, length: -1, parent: currentParent, children: [] });\r\n },\r\n onObjectProperty: (name, offset, length) => {\r\n currentParent = onValue({ type: 'property', offset, length: -1, parent: currentParent, children: [] });\r\n currentParent.children.push({ type: 'string', value: name, offset, length, parent: currentParent });\r\n },\r\n onObjectEnd: (offset, length) => {\r\n ensurePropertyComplete(offset + length); // in case of a missing value for a property: make sure property is complete\r\n currentParent.length = offset + length - currentParent.offset;\r\n currentParent = currentParent.parent;\r\n ensurePropertyComplete(offset + length);\r\n },\r\n onArrayBegin: (offset, length) => {\r\n currentParent = onValue({ type: 'array', offset, length: -1, parent: currentParent, children: [] });\r\n },\r\n onArrayEnd: (offset, length) => {\r\n currentParent.length = offset + length - currentParent.offset;\r\n currentParent = currentParent.parent;\r\n ensurePropertyComplete(offset + length);\r\n },\r\n onLiteralValue: (value, offset, length) => {\r\n onValue({ type: getNodeType(value), offset, length, parent: currentParent, value });\r\n ensurePropertyComplete(offset + length);\r\n },\r\n onSeparator: (sep, offset, length) => {\r\n if (currentParent.type === 'property') {\r\n if (sep === ':') {\r\n currentParent.colonOffset = offset;\r\n }\r\n else if (sep === ',') {\r\n ensurePropertyComplete(offset);\r\n }\r\n }\r\n },\r\n onError: (error, offset, length) => {\r\n errors.push({ error, offset, length });\r\n }\r\n };\r\n visit(text, visitor, options);\r\n const result = currentParent.children[0];\r\n if (result) {\r\n delete result.parent;\r\n }\r\n return result;\r\n}\r\n/**\r\n * Finds the node at the given path in a JSON DOM.\r\n */\r\nexport function findNodeAtLocation(root, path) {\r\n if (!root) {\r\n return undefined;\r\n }\r\n let node = root;\r\n for (let segment of path) {\r\n if (typeof segment === 'string') {\r\n if (node.type !== 'object' || !Array.isArray(node.children)) {\r\n return undefined;\r\n }\r\n let found = false;\r\n for (const propertyNode of node.children) {\r\n if (Array.isArray(propertyNode.children) && propertyNode.children[0].value === segment && propertyNode.children.length === 2) {\r\n node = propertyNode.children[1];\r\n found = true;\r\n break;\r\n }\r\n }\r\n if (!found) {\r\n return undefined;\r\n }\r\n }\r\n else {\r\n const index = segment;\r\n if (node.type !== 'array' || index < 0 || !Array.isArray(node.children) || index >= node.children.length) {\r\n return undefined;\r\n }\r\n node = node.children[index];\r\n }\r\n }\r\n return node;\r\n}\r\n/**\r\n * Gets the JSON path of the given JSON DOM node\r\n */\r\nexport function getNodePath(node) {\r\n if (!node.parent || !node.parent.children) {\r\n return [];\r\n }\r\n const path = getNodePath(node.parent);\r\n if (node.parent.type === 'property') {\r\n const key = node.parent.children[0].value;\r\n path.push(key);\r\n }\r\n else if (node.parent.type === 'array') {\r\n const index = node.parent.children.indexOf(node);\r\n if (index !== -1) {\r\n path.push(index);\r\n }\r\n }\r\n return path;\r\n}\r\n/**\r\n * Evaluates the JavaScript object of the given JSON DOM node\r\n */\r\nexport function getNodeValue(node) {\r\n switch (node.type) {\r\n case 'array':\r\n return node.children.map(getNodeValue);\r\n case 'object':\r\n const obj = Object.create(null);\r\n for (let prop of node.children) {\r\n const valueNode = prop.children[1];\r\n if (valueNode) {\r\n obj[prop.children[0].value] = getNodeValue(valueNode);\r\n }\r\n }\r\n return obj;\r\n case 'null':\r\n case 'string':\r\n case 'number':\r\n case 'boolean':\r\n return node.value;\r\n default:\r\n return undefined;\r\n }\r\n}\r\nexport function contains(node, offset, includeRightBound = false) {\r\n return (offset >= node.offset && offset < (node.offset + node.length)) || includeRightBound && (offset === (node.offset + node.length));\r\n}\r\n/**\r\n * Finds the most inner node at the given offset. If includeRightBound is set, also finds nodes that end at the given offset.\r\n */\r\nexport function findNodeAtOffset(node, offset, includeRightBound = false) {\r\n if (contains(node, offset, includeRightBound)) {\r\n const children = node.children;\r\n if (Array.isArray(children)) {\r\n for (let i = 0; i < children.length && children[i].offset <= offset; i++) {\r\n const item = findNodeAtOffset(children[i], offset, includeRightBound);\r\n if (item) {\r\n return item;\r\n }\r\n }\r\n }\r\n return node;\r\n }\r\n return undefined;\r\n}\r\n/**\r\n * Parses the given text and invokes the visitor functions for each object, array and literal reached.\r\n */\r\nexport function visit(text, visitor, options = ParseOptions.DEFAULT) {\r\n const _scanner = createScanner(text, false);\r\n // Important: Only pass copies of this to visitor functions to prevent accidental modification, and\r\n // to not affect visitor functions which stored a reference to a previous JSONPath\r\n const _jsonPath = [];\r\n // Depth of onXXXBegin() callbacks suppressed. onXXXEnd() decrements this if it isn't 0 already.\r\n // Callbacks are only called when this value is 0.\r\n let suppressedCallbacks = 0;\r\n function toNoArgVisit(visitFunction) {\r\n return visitFunction ? () => suppressedCallbacks === 0 && visitFunction(_scanner.getTokenOffset(), _scanner.getTokenLength(), _scanner.getTokenStartLine(), _scanner.getTokenStartCharacter()) : () => true;\r\n }\r\n function toOneArgVisit(visitFunction) {\r\n return visitFunction ? (arg) => suppressedCallbacks === 0 && visitFunction(arg, _scanner.getTokenOffset(), _scanner.getTokenLength(), _scanner.getTokenStartLine(), _scanner.getTokenStartCharacter()) : () => true;\r\n }\r\n function toOneArgVisitWithPath(visitFunction) {\r\n return visitFunction ? (arg) => suppressedCallbacks === 0 && visitFunction(arg, _scanner.getTokenOffset(), _scanner.getTokenLength(), _scanner.getTokenStartLine(), _scanner.getTokenStartCharacter(), () => _jsonPath.slice()) : () => true;\r\n }\r\n function toBeginVisit(visitFunction) {\r\n return visitFunction ?\r\n () => {\r\n if (suppressedCallbacks > 0) {\r\n suppressedCallbacks++;\r\n }\r\n else {\r\n let cbReturn = visitFunction(_scanner.getTokenOffset(), _scanner.getTokenLength(), _scanner.getTokenStartLine(), _scanner.getTokenStartCharacter(), () => _jsonPath.slice());\r\n if (cbReturn === false) {\r\n suppressedCallbacks = 1;\r\n }\r\n }\r\n }\r\n : () => true;\r\n }\r\n function toEndVisit(visitFunction) {\r\n return visitFunction ?\r\n () => {\r\n if (suppressedCallbacks > 0) {\r\n suppressedCallbacks--;\r\n }\r\n if (suppressedCallbacks === 0) {\r\n visitFunction(_scanner.getTokenOffset(), _scanner.getTokenLength(), _scanner.getTokenStartLine(), _scanner.getTokenStartCharacter());\r\n }\r\n }\r\n : () => true;\r\n }\r\n const onObjectBegin = toBeginVisit(visitor.onObjectBegin), onObjectProperty = toOneArgVisitWithPath(visitor.onObjectProperty), onObjectEnd = toEndVisit(visitor.onObjectEnd), onArrayBegin = toBeginVisit(visitor.onArrayBegin), onArrayEnd = toEndVisit(visitor.onArrayEnd), onLiteralValue = toOneArgVisitWithPath(visitor.onLiteralValue), onSeparator = toOneArgVisit(visitor.onSeparator), onComment = toNoArgVisit(visitor.onComment), onError = toOneArgVisit(visitor.onError);\r\n const disallowComments = options && options.disallowComments;\r\n const allowTrailingComma = options && options.allowTrailingComma;\r\n function scanNext() {\r\n while (true) {\r\n const token = _scanner.scan();\r\n switch (_scanner.getTokenError()) {\r\n case 4 /* ScanError.InvalidUnicode */:\r\n handleError(14 /* ParseErrorCode.InvalidUnicode */);\r\n break;\r\n case 5 /* ScanError.InvalidEscapeCharacter */:\r\n handleError(15 /* ParseErrorCode.InvalidEscapeCharacter */);\r\n break;\r\n case 3 /* ScanError.UnexpectedEndOfNumber */:\r\n handleError(13 /* ParseErrorCode.UnexpectedEndOfNumber */);\r\n break;\r\n case 1 /* ScanError.UnexpectedEndOfComment */:\r\n if (!disallowComments) {\r\n handleError(11 /* ParseErrorCode.UnexpectedEndOfComment */);\r\n }\r\n break;\r\n case 2 /* ScanError.UnexpectedEndOfString */:\r\n handleError(12 /* ParseErrorCode.UnexpectedEndOfString */);\r\n break;\r\n case 6 /* ScanError.InvalidCharacter */:\r\n handleError(16 /* ParseErrorCode.InvalidCharacter */);\r\n break;\r\n }\r\n switch (token) {\r\n case 12 /* SyntaxKind.LineCommentTrivia */:\r\n case 13 /* SyntaxKind.BlockCommentTrivia */:\r\n if (disallowComments) {\r\n handleError(10 /* ParseErrorCode.InvalidCommentToken */);\r\n }\r\n else {\r\n onComment();\r\n }\r\n break;\r\n case 16 /* SyntaxKind.Unknown */:\r\n handleError(1 /* ParseErrorCode.InvalidSymbol */);\r\n break;\r\n case 15 /* SyntaxKind.Trivia */:\r\n case 14 /* SyntaxKind.LineBreakTrivia */:\r\n break;\r\n default:\r\n return token;\r\n }\r\n }\r\n }\r\n function handleError(error, skipUntilAfter = [], skipUntil = []) {\r\n onError(error);\r\n if (skipUntilAfter.length + skipUntil.length > 0) {\r\n let token = _scanner.getToken();\r\n while (token !== 17 /* SyntaxKind.EOF */) {\r\n if (skipUntilAfter.indexOf(token) !== -1) {\r\n scanNext();\r\n break;\r\n }\r\n else if (skipUntil.indexOf(token) !== -1) {\r\n break;\r\n }\r\n token = scanNext();\r\n }\r\n }\r\n }\r\n function parseString(isValue) {\r\n const value = _scanner.getTokenValue();\r\n if (isValue) {\r\n onLiteralValue(value);\r\n }\r\n else {\r\n onObjectProperty(value);\r\n // add property name afterwards\r\n _jsonPath.push(value);\r\n }\r\n scanNext();\r\n return true;\r\n }\r\n function parseLiteral() {\r\n switch (_scanner.getToken()) {\r\n case 11 /* SyntaxKind.NumericLiteral */:\r\n const tokenValue = _scanner.getTokenValue();\r\n let value = Number(tokenValue);\r\n if (isNaN(value)) {\r\n handleError(2 /* ParseErrorCode.InvalidNumberFormat */);\r\n value = 0;\r\n }\r\n onLiteralValue(value);\r\n break;\r\n case 7 /* SyntaxKind.NullKeyword */:\r\n onLiteralValue(null);\r\n break;\r\n case 8 /* SyntaxKind.TrueKeyword */:\r\n onLiteralValue(true);\r\n break;\r\n case 9 /* SyntaxKind.FalseKeyword */:\r\n onLiteralValue(false);\r\n break;\r\n default:\r\n return false;\r\n }\r\n scanNext();\r\n return true;\r\n }\r\n function parseProperty() {\r\n if (_scanner.getToken() !== 10 /* SyntaxKind.StringLiteral */) {\r\n handleError(3 /* ParseErrorCode.PropertyNameExpected */, [], [2 /* SyntaxKind.CloseBraceToken */, 5 /* SyntaxKind.CommaToken */]);\r\n return false;\r\n }\r\n parseString(false);\r\n if (_scanner.getToken() === 6 /* SyntaxKind.ColonToken */) {\r\n onSeparator(':');\r\n scanNext(); // consume colon\r\n if (!parseValue()) {\r\n handleError(4 /* ParseErrorCode.ValueExpected */, [], [2 /* SyntaxKind.CloseBraceToken */, 5 /* SyntaxKind.CommaToken */]);\r\n }\r\n }\r\n else {\r\n handleError(5 /* ParseErrorCode.ColonExpected */, [], [2 /* SyntaxKind.CloseBraceToken */, 5 /* SyntaxKind.CommaToken */]);\r\n }\r\n _jsonPath.pop(); // remove processed property name\r\n return true;\r\n }\r\n function parseObject() {\r\n onObjectBegin();\r\n scanNext(); // consume open brace\r\n let needsComma = false;\r\n while (_scanner.getToken() !== 2 /* SyntaxKind.CloseBraceToken */ && _scanner.getToken() !== 17 /* SyntaxKind.EOF */) {\r\n if (_scanner.getToken() === 5 /* SyntaxKind.CommaToken */) {\r\n if (!needsComma) {\r\n handleError(4 /* ParseErrorCode.ValueExpected */, [], []);\r\n }\r\n onSeparator(',');\r\n scanNext(); // consume comma\r\n if (_scanner.getToken() === 2 /* SyntaxKind.CloseBraceToken */ && allowTrailingComma) {\r\n break;\r\n }\r\n }\r\n else if (needsComma) {\r\n handleError(6 /* ParseErrorCode.CommaExpected */, [], []);\r\n }\r\n if (!parseProperty()) {\r\n handleError(4 /* ParseErrorCode.ValueExpected */, [], [2 /* SyntaxKind.CloseBraceToken */, 5 /* SyntaxKind.CommaToken */]);\r\n }\r\n needsComma = true;\r\n }\r\n onObjectEnd();\r\n if (_scanner.getToken() !== 2 /* SyntaxKind.CloseBraceToken */) {\r\n handleError(7 /* ParseErrorCode.CloseBraceExpected */, [2 /* SyntaxKind.CloseBraceToken */], []);\r\n }\r\n else {\r\n scanNext(); // consume close brace\r\n }\r\n return true;\r\n }\r\n function parseArray() {\r\n onArrayBegin();\r\n scanNext(); // consume open bracket\r\n let isFirstElement = true;\r\n let needsComma = false;\r\n while (_scanner.getToken() !== 4 /* SyntaxKind.CloseBracketToken */ && _scanner.getToken() !== 17 /* SyntaxKind.EOF */) {\r\n if (_scanner.getToken() === 5 /* SyntaxKind.CommaToken */) {\r\n if (!needsComma) {\r\n handleError(4 /* ParseErrorCode.ValueExpected */, [], []);\r\n }\r\n onSeparator(',');\r\n scanNext(); // consume comma\r\n if (_scanner.getToken() === 4 /* SyntaxKind.CloseBracketToken */ && allowTrailingComma) {\r\n break;\r\n }\r\n }\r\n else if (needsComma) {\r\n handleError(6 /* ParseErrorCode.CommaExpected */, [], []);\r\n }\r\n if (isFirstElement) {\r\n _jsonPath.push(0);\r\n isFirstElement = false;\r\n }\r\n else {\r\n _jsonPath[_jsonPath.length - 1]++;\r\n }\r\n if (!parseValue()) {\r\n handleError(4 /* ParseErrorCode.ValueExpected */, [], [4 /* SyntaxKind.CloseBracketToken */, 5 /* SyntaxKind.CommaToken */]);\r\n }\r\n needsComma = true;\r\n }\r\n onArrayEnd();\r\n if (!isFirstElement) {\r\n _jsonPath.pop(); // remove array index\r\n }\r\n if (_scanner.getToken() !== 4 /* SyntaxKind.CloseBracketToken */) {\r\n handleError(8 /* ParseErrorCode.CloseBracketExpected */, [4 /* SyntaxKind.CloseBracketToken */], []);\r\n }\r\n else {\r\n scanNext(); // consume close bracket\r\n }\r\n return true;\r\n }\r\n function parseValue() {\r\n switch (_scanner.getToken()) {\r\n case 3 /* SyntaxKind.OpenBracketToken */:\r\n return parseArray();\r\n case 1 /* SyntaxKind.OpenBraceToken */:\r\n return parseObject();\r\n case 10 /* SyntaxKind.StringLiteral */:\r\n return parseString(true);\r\n default:\r\n return parseLiteral();\r\n }\r\n }\r\n scanNext();\r\n if (_scanner.getToken() === 17 /* SyntaxKind.EOF */) {\r\n if (options.allowEmptyContent) {\r\n return true;\r\n }\r\n handleError(4 /* ParseErrorCode.ValueExpected */, [], []);\r\n return false;\r\n }\r\n if (!parseValue()) {\r\n handleError(4 /* ParseErrorCode.ValueExpected */, [], []);\r\n return false;\r\n }\r\n if (_scanner.getToken() !== 17 /* SyntaxKind.EOF */) {\r\n handleError(9 /* ParseErrorCode.EndOfFileExpected */, [], []);\r\n }\r\n return true;\r\n}\r\n/**\r\n * Takes JSON with JavaScript-style comments and remove\r\n * them. Optionally replaces every none-newline character\r\n * of comments with a replaceCharacter\r\n */\r\nexport function stripComments(text, replaceCh) {\r\n let _scanner = createScanner(text), parts = [], kind, offset = 0, pos;\r\n do {\r\n pos = _scanner.getPosition();\r\n kind = _scanner.scan();\r\n switch (kind) {\r\n case 12 /* SyntaxKind.LineCommentTrivia */:\r\n case 13 /* SyntaxKind.BlockCommentTrivia */:\r\n case 17 /* SyntaxKind.EOF */:\r\n if (offset !== pos) {\r\n parts.push(text.substring(offset, pos));\r\n }\r\n if (replaceCh !== undefined) {\r\n parts.push(_scanner.getTokenValue().replace(/[^\\r\\n]/g, replaceCh));\r\n }\r\n offset = _scanner.getPosition();\r\n break;\r\n }\r\n } while (kind !== 17 /* SyntaxKind.EOF */);\r\n return parts.join('');\r\n}\r\nexport function getNodeType(value) {\r\n switch (typeof value) {\r\n case 'boolean': return 'boolean';\r\n case 'number': return 'number';\r\n case 'string': return 'string';\r\n case 'object': {\r\n if (!value) {\r\n return 'null';\r\n }\r\n else if (Array.isArray(value)) {\r\n return 'array';\r\n }\r\n return 'object';\r\n }\r\n default: return 'null';\r\n }\r\n}\r\n", "/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n'use strict';\r\nimport { format, isEOL } from './format';\r\nimport { parseTree, findNodeAtLocation } from './parser';\r\nexport function removeProperty(text, path, options) {\r\n return setProperty(text, path, void 0, options);\r\n}\r\nexport function setProperty(text, originalPath, value, options) {\r\n const path = originalPath.slice();\r\n const errors = [];\r\n const root = parseTree(text, errors);\r\n let parent = void 0;\r\n let lastSegment = void 0;\r\n while (path.length > 0) {\r\n lastSegment = path.pop();\r\n parent = findNodeAtLocation(root, path);\r\n if (parent === void 0 && value !== void 0) {\r\n if (typeof lastSegment === 'string') {\r\n value = { [lastSegment]: value };\r\n }\r\n else {\r\n value = [value];\r\n }\r\n }\r\n else {\r\n break;\r\n }\r\n }\r\n if (!parent) {\r\n // empty document\r\n if (value === void 0) { // delete\r\n throw new Error('Can not delete in empty document');\r\n }\r\n return withFormatting(text, { offset: root ? root.offset : 0, length: root ? root.length : 0, content: JSON.stringify(value) }, options);\r\n }\r\n else if (parent.type === 'object' && typeof lastSegment === 'string' && Array.isArray(parent.children)) {\r\n const existing = findNodeAtLocation(parent, [lastSegment]);\r\n if (existing !== void 0) {\r\n if (value === void 0) { // delete\r\n if (!existing.parent) {\r\n throw new Error('Malformed AST');\r\n }\r\n const propertyIndex = parent.children.indexOf(existing.parent);\r\n let removeBegin;\r\n let removeEnd = existing.parent.offset + existing.parent.length;\r\n if (propertyIndex > 0) {\r\n // remove the comma of the previous node\r\n let previous = parent.children[propertyIndex - 1];\r\n removeBegin = previous.offset + previous.length;\r\n }\r\n else {\r\n removeBegin = parent.offset + 1;\r\n if (parent.children.length > 1) {\r\n // remove the comma of the next node\r\n let next = parent.children[1];\r\n removeEnd = next.offset;\r\n }\r\n }\r\n return withFormatting(text, { offset: removeBegin, length: removeEnd - removeBegin, content: '' }, options);\r\n }\r\n else {\r\n // set value of existing property\r\n return withFormatting(text, { offset: existing.offset, length: existing.length, content: JSON.stringify(value) }, options);\r\n }\r\n }\r\n else {\r\n if (value === void 0) { // delete\r\n return []; // property does not exist, nothing to do\r\n }\r\n const newProperty = `${JSON.stringify(lastSegment)}: ${JSON.stringify(value)}`;\r\n const index = options.getInsertionIndex ? options.getInsertionIndex(parent.children.map(p => p.children[0].value)) : parent.children.length;\r\n let edit;\r\n if (index > 0) {\r\n let previous = parent.children[index - 1];\r\n edit = { offset: previous.offset + previous.length, length: 0, content: ',' + newProperty };\r\n }\r\n else if (parent.children.length === 0) {\r\n edit = { offset: parent.offset + 1, length: 0, content: newProperty };\r\n }\r\n else {\r\n edit = { offset: parent.offset + 1, length: 0, content: newProperty + ',' };\r\n }\r\n return withFormatting(text, edit, options);\r\n }\r\n }\r\n else if (parent.type === 'array' && typeof lastSegment === 'number' && Array.isArray(parent.children)) {\r\n const insertIndex = lastSegment;\r\n if (insertIndex === -1) {\r\n // Insert\r\n const newProperty = `${JSON.stringify(value)}`;\r\n let edit;\r\n if (parent.children.length === 0) {\r\n edit = { offset: parent.offset + 1, length: 0, content: newProperty };\r\n }\r\n else {\r\n const previous = parent.children[parent.children.length - 1];\r\n edit = { offset: previous.offset + previous.length, length: 0, content: ',' + newProperty };\r\n }\r\n return withFormatting(text, edit, options);\r\n }\r\n else if (value === void 0 && parent.children.length >= 0) {\r\n // Removal\r\n const removalIndex = lastSegment;\r\n const toRemove = parent.children[removalIndex];\r\n let edit;\r\n if (parent.children.length === 1) {\r\n // only item\r\n edit = { offset: parent.offset + 1, length: parent.length - 2, content: '' };\r\n }\r\n else if (parent.children.length - 1 === removalIndex) {\r\n // last item\r\n let previous = parent.children[removalIndex - 1];\r\n let offset = previous.offset + previous.length;\r\n let parentEndOffset = parent.offset + parent.length;\r\n edit = { offset, length: parentEndOffset - 2 - offset, content: '' };\r\n }\r\n else {\r\n edit = { offset: toRemove.offset, length: parent.children[removalIndex + 1].offset - toRemove.offset, content: '' };\r\n }\r\n return withFormatting(text, edit, options);\r\n }\r\n else if (value !== void 0) {\r\n let edit;\r\n const newProperty = `${JSON.stringify(value)}`;\r\n if (!options.isArrayInsertion && parent.children.length > lastSegment) {\r\n const toModify = parent.children[lastSegment];\r\n edit = { offset: toModify.offset, length: toModify.length, content: newProperty };\r\n }\r\n else if (parent.children.length === 0 || lastSegment === 0) {\r\n edit = { offset: parent.offset + 1, length: 0, content: parent.children.length === 0 ? newProperty : newProperty + ',' };\r\n }\r\n else {\r\n const index = lastSegment > parent.children.length ? parent.children.length : lastSegment;\r\n const previous = parent.children[index - 1];\r\n edit = { offset: previous.offset + previous.length, length: 0, content: ',' + newProperty };\r\n }\r\n return withFormatting(text, edit, options);\r\n }\r\n else {\r\n throw new Error(`Can not ${value === void 0 ? 'remove' : (options.isArrayInsertion ? 'insert' : 'modify')} Array index ${insertIndex} as length is not sufficient`);\r\n }\r\n }\r\n else {\r\n throw new Error(`Can not add ${typeof lastSegment !== 'number' ? 'index' : 'property'} to parent of type ${parent.type}`);\r\n }\r\n}\r\nfunction withFormatting(text, edit, options) {\r\n if (!options.formattingOptions) {\r\n return [edit];\r\n }\r\n // apply the edit\r\n let newText = applyEdit(text, edit);\r\n // format the new text\r\n let begin = edit.offset;\r\n let end = edit.offset + edit.content.length;\r\n if (edit.length === 0 || edit.content.length === 0) { // insert or remove\r\n while (begin > 0 && !isEOL(newText, begin - 1)) {\r\n begin--;\r\n }\r\n while (end < newText.length && !isEOL(newText, end)) {\r\n end++;\r\n }\r\n }\r\n const edits = format(newText, { offset: begin, length: end - begin }, { ...options.formattingOptions, keepLines: false });\r\n // apply the formatting edits and track the begin and end offsets of the changes\r\n for (let i = edits.length - 1; i >= 0; i--) {\r\n const edit = edits[i];\r\n newText = applyEdit(newText, edit);\r\n begin = Math.min(begin, edit.offset);\r\n end = Math.max(end, edit.offset + edit.length);\r\n end += edit.content.length - edit.length;\r\n }\r\n // create a single edit with all changes\r\n const editLength = text.length - (newText.length - end) - begin;\r\n return [{ offset: begin, length: editLength, content: newText.substring(begin, end) }];\r\n}\r\nexport function applyEdit(text, edit) {\r\n return text.substring(0, edit.offset) + edit.content + text.substring(edit.offset + edit.length);\r\n}\r\nexport function isWS(text, offset) {\r\n return '\\r\\n \\t'.indexOf(text.charAt(offset)) !== -1;\r\n}\r\n", "/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n'use strict';\r\nimport * as formatter from './impl/format';\r\nimport * as edit from './impl/edit';\r\nimport * as scanner from './impl/scanner';\r\nimport * as parser from './impl/parser';\r\n/**\r\n * Creates a JSON scanner on the given text.\r\n * If ignoreTrivia is set, whitespaces or comments are ignored.\r\n */\r\nexport const createScanner = scanner.createScanner;\r\nexport var ScanError;\r\n(function (ScanError) {\r\n ScanError[ScanError[\"None\"] = 0] = \"None\";\r\n ScanError[ScanError[\"UnexpectedEndOfComment\"] = 1] = \"UnexpectedEndOfComment\";\r\n ScanError[ScanError[\"UnexpectedEndOfString\"] = 2] = \"UnexpectedEndOfString\";\r\n ScanError[ScanError[\"UnexpectedEndOfNumber\"] = 3] = \"UnexpectedEndOfNumber\";\r\n ScanError[ScanError[\"InvalidUnicode\"] = 4] = \"InvalidUnicode\";\r\n ScanError[ScanError[\"InvalidEscapeCharacter\"] = 5] = \"InvalidEscapeCharacter\";\r\n ScanError[ScanError[\"InvalidCharacter\"] = 6] = \"InvalidCharacter\";\r\n})(ScanError || (ScanError = {}));\r\nexport var SyntaxKind;\r\n(function (SyntaxKind) {\r\n SyntaxKind[SyntaxKind[\"OpenBraceToken\"] = 1] = \"OpenBraceToken\";\r\n SyntaxKind[SyntaxKind[\"CloseBraceToken\"] = 2] = \"CloseBraceToken\";\r\n SyntaxKind[SyntaxKind[\"OpenBracketToken\"] = 3] = \"OpenBracketToken\";\r\n SyntaxKind[SyntaxKind[\"CloseBracketToken\"] = 4] = \"CloseBracketToken\";\r\n SyntaxKind[SyntaxKind[\"CommaToken\"] = 5] = \"CommaToken\";\r\n SyntaxKind[SyntaxKind[\"ColonToken\"] = 6] = \"ColonToken\";\r\n SyntaxKind[SyntaxKind[\"NullKeyword\"] = 7] = \"NullKeyword\";\r\n SyntaxKind[SyntaxKind[\"TrueKeyword\"] = 8] = \"TrueKeyword\";\r\n SyntaxKind[SyntaxKind[\"FalseKeyword\"] = 9] = \"FalseKeyword\";\r\n SyntaxKind[SyntaxKind[\"StringLiteral\"] = 10] = \"StringLiteral\";\r\n SyntaxKind[SyntaxKind[\"NumericLiteral\"] = 11] = \"NumericLiteral\";\r\n SyntaxKind[SyntaxKind[\"LineCommentTrivia\"] = 12] = \"LineCommentTrivia\";\r\n SyntaxKind[SyntaxKind[\"BlockCommentTrivia\"] = 13] = \"BlockCommentTrivia\";\r\n SyntaxKind[SyntaxKind[\"LineBreakTrivia\"] = 14] = \"LineBreakTrivia\";\r\n SyntaxKind[SyntaxKind[\"Trivia\"] = 15] = \"Trivia\";\r\n SyntaxKind[SyntaxKind[\"Unknown\"] = 16] = \"Unknown\";\r\n SyntaxKind[SyntaxKind[\"EOF\"] = 17] = \"EOF\";\r\n})(SyntaxKind || (SyntaxKind = {}));\r\n/**\r\n * For a given offset, evaluate the location in the JSON document. Each segment in the location path is either a property name or an array index.\r\n */\r\nexport const getLocation = parser.getLocation;\r\n/**\r\n * Parses the given text and returns the object the JSON content represents. On invalid input, the parser tries to be as fault tolerant as possible, but still return a result.\r\n * Therefore, always check the errors list to find out if the input was valid.\r\n */\r\nexport const parse = parser.parse;\r\n/**\r\n * Parses the given text and returns a tree representation the JSON content. On invalid input, the parser tries to be as fault tolerant as possible, but still return a result.\r\n */\r\nexport const parseTree = parser.parseTree;\r\n/**\r\n * Finds the node at the given path in a JSON DOM.\r\n */\r\nexport const findNodeAtLocation = parser.findNodeAtLocation;\r\n/**\r\n * Finds the innermost node at the given offset. If includeRightBound is set, also finds nodes that end at the given offset.\r\n */\r\nexport const findNodeAtOffset = parser.findNodeAtOffset;\r\n/**\r\n * Gets the JSON path of the given JSON DOM node\r\n */\r\nexport const getNodePath = parser.getNodePath;\r\n/**\r\n * Evaluates the JavaScript object of the given JSON DOM node\r\n */\r\nexport const getNodeValue = parser.getNodeValue;\r\n/**\r\n * Parses the given text and invokes the visitor functions for each object, array and literal reached.\r\n */\r\nexport const visit = parser.visit;\r\n/**\r\n * Takes JSON with JavaScript-style comments and remove\r\n * them. Optionally replaces every none-newline character\r\n * of comments with a replaceCharacter\r\n */\r\nexport const stripComments = parser.stripComments;\r\nexport var ParseErrorCode;\r\n(function (ParseErrorCode) {\r\n ParseErrorCode[ParseErrorCode[\"InvalidSymbol\"] = 1] = \"InvalidSymbol\";\r\n ParseErrorCode[ParseErrorCode[\"InvalidNumberFormat\"] = 2] = \"InvalidNumberFormat\";\r\n ParseErrorCode[ParseErrorCode[\"PropertyNameExpected\"] = 3] = \"PropertyNameExpected\";\r\n ParseErrorCode[ParseErrorCode[\"ValueExpected\"] = 4] = \"ValueExpected\";\r\n ParseErrorCode[ParseErrorCode[\"ColonExpected\"] = 5] = \"ColonExpected\";\r\n ParseErrorCode[ParseErrorCode[\"CommaExpected\"] = 6] = \"CommaExpected\";\r\n ParseErrorCode[ParseErrorCode[\"CloseBraceExpected\"] = 7] = \"CloseBraceExpected\";\r\n ParseErrorCode[ParseErrorCode[\"CloseBracketExpected\"] = 8] = \"CloseBracketExpected\";\r\n ParseErrorCode[ParseErrorCode[\"EndOfFileExpected\"] = 9] = \"EndOfFileExpected\";\r\n ParseErrorCode[ParseErrorCode[\"InvalidCommentToken\"] = 10] = \"InvalidCommentToken\";\r\n ParseErrorCode[ParseErrorCode[\"UnexpectedEndOfComment\"] = 11] = \"UnexpectedEndOfComment\";\r\n ParseErrorCode[ParseErrorCode[\"UnexpectedEndOfString\"] = 12] = \"UnexpectedEndOfString\";\r\n ParseErrorCode[ParseErrorCode[\"UnexpectedEndOfNumber\"] = 13] = \"UnexpectedEndOfNumber\";\r\n ParseErrorCode[ParseErrorCode[\"InvalidUnicode\"] = 14] = \"InvalidUnicode\";\r\n ParseErrorCode[ParseErrorCode[\"InvalidEscapeCharacter\"] = 15] = \"InvalidEscapeCharacter\";\r\n ParseErrorCode[ParseErrorCode[\"InvalidCharacter\"] = 16] = \"InvalidCharacter\";\r\n})(ParseErrorCode || (ParseErrorCode = {}));\r\nexport function printParseErrorCode(code) {\r\n switch (code) {\r\n case 1 /* ParseErrorCode.InvalidSymbol */: return 'InvalidSymbol';\r\n case 2 /* ParseErrorCode.InvalidNumberFormat */: return 'InvalidNumberFormat';\r\n case 3 /* ParseErrorCode.PropertyNameExpected */: return 'PropertyNameExpected';\r\n case 4 /* ParseErrorCode.ValueExpected */: return 'ValueExpected';\r\n case 5 /* ParseErrorCode.ColonExpected */: return 'ColonExpected';\r\n case 6 /* ParseErrorCode.CommaExpected */: return 'CommaExpected';\r\n case 7 /* ParseErrorCode.CloseBraceExpected */: return 'CloseBraceExpected';\r\n case 8 /* ParseErrorCode.CloseBracketExpected */: return 'CloseBracketExpected';\r\n case 9 /* ParseErrorCode.EndOfFileExpected */: return 'EndOfFileExpected';\r\n case 10 /* ParseErrorCode.InvalidCommentToken */: return 'InvalidCommentToken';\r\n case 11 /* ParseErrorCode.UnexpectedEndOfComment */: return 'UnexpectedEndOfComment';\r\n case 12 /* ParseErrorCode.UnexpectedEndOfString */: return 'UnexpectedEndOfString';\r\n case 13 /* ParseErrorCode.UnexpectedEndOfNumber */: return 'UnexpectedEndOfNumber';\r\n case 14 /* ParseErrorCode.InvalidUnicode */: return 'InvalidUnicode';\r\n case 15 /* ParseErrorCode.InvalidEscapeCharacter */: return 'InvalidEscapeCharacter';\r\n case 16 /* ParseErrorCode.InvalidCharacter */: return 'InvalidCharacter';\r\n }\r\n return '<unknown ParseErrorCode>';\r\n}\r\n/**\r\n * Computes the edit operations needed to format a JSON document.\r\n *\r\n * @param documentText The input text\r\n * @param range The range to format or `undefined` to format the full content\r\n * @param options The formatting options\r\n * @returns The edit operations describing the formatting changes to the original document following the format described in {@linkcode EditResult}.\r\n * To apply the edit operations to the input, use {@linkcode applyEdits}.\r\n */\r\nexport function format(documentText, range, options) {\r\n return formatter.format(documentText, range, options);\r\n}\r\n/**\r\n * Computes the edit operations needed to modify a value in the JSON document.\r\n *\r\n * @param documentText The input text\r\n * @param path The path of the value to change. The path represents either to the document root, a property or an array item.\r\n * If the path points to an non-existing property or item, it will be created.\r\n * @param value The new value for the specified property or item. If the value is undefined,\r\n * the property or item will be removed.\r\n * @param options Options\r\n * @returns The edit operations describing the changes to the original document, following the format described in {@linkcode EditResult}.\r\n * To apply the edit operations to the input, use {@linkcode applyEdits}.\r\n */\r\nexport function modify(text, path, value, options) {\r\n return edit.setProperty(text, path, value, options);\r\n}\r\n/**\r\n * Applies edits to an input string.\r\n * @param text The input text\r\n * @param edits Edit operations following the format described in {@linkcode EditResult}.\r\n * @returns The text with the applied edits.\r\n * @throws An error if the edit operations are not well-formed as described in {@linkcode EditResult}.\r\n */\r\nexport function applyEdits(text, edits) {\r\n let sortedEdits = edits.slice(0).sort((a, b) => {\r\n const diff = a.offset - b.offset;\r\n if (diff === 0) {\r\n return a.length - b.length;\r\n }\r\n return diff;\r\n });\r\n let lastModifiedOffset = text.length;\r\n for (let i = sortedEdits.length - 1; i >= 0; i--) {\r\n let e = sortedEdits[i];\r\n if (e.offset + e.length <= lastModifiedOffset) {\r\n text = edit.applyEdit(text, e);\r\n }\r\n else {\r\n throw new Error('Overlapping edit');\r\n }\r\n lastModifiedOffset = e.offset;\r\n }\r\n return text;\r\n}\r\n", "import type { Plugin } from './types/index.js'\r\nimport { syncNIMModels } from './plugin/nim-sync.js'\r\n\r\nexport default syncNIMModels as Plugin"],
5
+ "mappings": "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Ae,IAAI,IAAI,EAAE,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,IAAI,IAAI,EAAE,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,IAAI,IAAI,EAAE,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,IAAI,IAAI,EAAE,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,IAAI,IAAI,EAAE,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,IAAI,IAAI,EAAE,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,IAAI,IAAI,EAAE,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,IAAI,IAAI,EAAE,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,IAAI,IAAI,EAAE,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,EAAE,IAAI;AAC3C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,EAAE,IAAI;AAC3C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,EAAE,IAAI;AAC3C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,GAAG,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,GAAG,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,GAAG,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,GAAG,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,GAAG,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,GAAG,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,GAAG,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,GAAG,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,GAAG,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,GAAG,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,GAAG,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,GAAG,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,GAAG,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,GAAG,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,GAAG,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,GAAG,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,GAAG,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,GAAG,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,GAAG,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,GAAG,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,GAAG,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,GAAG,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,GAAG,IAAI;AAC5C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,EAAE,IAAI;AAC3C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,EAAE,IAAI;AAC3C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,EAAE,IAAI;AAC3C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,EAAE,IAAI;AAC3C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,EAAE,IAAI;AAC3C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,EAAE,IAAI;AAC3C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,EAAE,IAAI;AAC3C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,EAAE,IAAI;AAC3C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,EAAE,IAAI;AAC3C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,EAAE,IAAI;AAC3C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,EAAE,IAAI;AAC3C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,EAAE,IAAI;AAC3C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,EAAE,IAAI;AAC3C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,EAAE,IAAI;AAC3C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,EAAE,IAAI;AAC3C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,EAAE,IAAI;AAC3C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,EAAE,IAAI;AAC3C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,EAAE,IAAI;AAC3C,EAAAA,gBAAeA,gBAAe,GAAG,IAAI,EA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",
6
+ "names": ["path", "value", "CharacterCodes", "ParseOptions", "path", "path", "edit", "ScanError", "SyntaxKind", "parse", "ParseErrorCode", "path", "parse", "path"]
7
+ }
@@ -0,0 +1,46 @@
1
+ import type { PluginAPI, NIMModel } from '../types/index.js';
2
+ /**
3
+ * Creates a NVIDIA NIM model synchronization plugin for OpenCode.
4
+ *
5
+ * This plugin automatically fetches available models from NVIDIA's API and updates
6
+ * the OpenCode configuration with the latest model list. It provides:
7
+ * - Automatic sync on startup with 24-hour TTL caching
8
+ * - Manual refresh via `/nim-refresh` command with rate limiting (60s cooldown)
9
+ * - Atomic file operations with lock-based concurrency control
10
+ * - Graceful error handling with user-friendly toast notifications
11
+ *
12
+ * @param api - Plugin API provided by OpenCode framework
13
+ * @returns Plugin instance with lifecycle methods and exposed utilities
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * // Plugin is automatically loaded by OpenCode
18
+ * const plugin = await syncNIMModels(api)
19
+ * await plugin.init?.()
20
+ *
21
+ * // Manual refresh via command
22
+ * await plugin.refreshModels?.(true)
23
+ * ```
24
+ *
25
+ * @remarks
26
+ * - Requires NVIDIA API key in `auth.json` or `NVIDIA_API_KEY` environment variable
27
+ * - Updates `provider.nim.models` in `opencode.jsonc`
28
+ * - Cache stored in `nim-sync-cache.json` with 24-hour TTL
29
+ * - Prevents concurrent refreshes with in-memory flag
30
+ */
31
+ export declare function syncNIMModels(api: PluginAPI): Promise<{
32
+ /** Initialize plugin and register commands */
33
+ init?: () => Promise<void>;
34
+ /** Hook handlers for server and session events */
35
+ hooks?: Record<string, () => Promise<void>>;
36
+ /** Get NVIDIA API key from auth config or environment */
37
+ getAPIKey?: () => Promise<string | null>;
38
+ /** Update OpenCode configuration with new models */
39
+ updateConfig?: (models: NIMModel[]) => Promise<boolean>;
40
+ /** Refresh models from NVIDIA API */
41
+ refreshModels?: (force?: boolean) => Promise<void>;
42
+ /** Check if model refresh is needed based on cache TTL */
43
+ shouldRefresh?: () => Promise<boolean>;
44
+ }>;
45
+ export default syncNIMModels;
46
+ //# sourceMappingURL=nim-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nim-sync.d.ts","sourceRoot":"","sources":["../../src/plugin/nim-sync.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAyC,MAAM,mBAAmB,CAAA;AA0BnG;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC;IAC3D,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAC3C,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IACxC,oDAAoD;IACpD,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IACvD,qCAAqC;IACrC,aAAa,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAClD,0DAA0D;IAC1D,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;CACvC,CAAC,CAuQD;AAED,eAAe,aAAa,CAAA"}