@pstdio/workbench 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +66 -72
- package/dist/composition-resolver-types-CWykPyEK.js +241 -0
- package/dist/composition-resolver-types-CWykPyEK.js.map +1 -0
- package/dist/extensions.d.ts +359 -43
- package/dist/extensions.js +1595 -1044
- package/dist/extensions.js.map +1 -1
- package/dist/file-renderer-view-zpunbE4I.js +432 -0
- package/dist/file-renderer-view-zpunbE4I.js.map +1 -0
- package/dist/file-section-navigation-CfYqVObc.js +30 -0
- package/dist/file-section-navigation-CfYqVObc.js.map +1 -0
- package/dist/index.d.ts +287 -19
- package/dist/index.js +2323 -2011
- package/dist/index.js.map +1 -1
- package/dist/layout-types-DMoZz38-.js.map +1 -1
- package/dist/react.d.ts +157 -16
- package/dist/react.js +2675 -2736
- package/dist/react.js.map +1 -1
- package/dist/storage.d.ts +96 -2
- package/dist/storage.js +173 -115
- package/dist/storage.js.map +1 -1
- package/dist/testing.d.ts +146 -14
- package/dist/webview-runtime.js +1 -1
- package/dist/webview-runtime.js.map +1 -1
- package/dist/workbench-built-ins-BtgeB274.js +1171 -0
- package/dist/workbench-built-ins-BtgeB274.js.map +1 -0
- package/dist/workbench-menu-paths-Bb0ICxeG.js +20 -0
- package/dist/workbench-menu-paths-Bb0ICxeG.js.map +1 -0
- package/package.json +3 -3
- package/dist/context-key-service-W4QEfVdN.js +0 -1031
- package/dist/context-key-service-W4QEfVdN.js.map +0 -1
- package/dist/file-renderer-view-DrrhYnb_.js +0 -171
- package/dist/file-renderer-view-DrrhYnb_.js.map +0 -1
- package/dist/workbench-menu-paths-B_QJzcNU.js +0 -12
- package/dist/workbench-menu-paths-B_QJzcNU.js.map +0 -1
package/dist/storage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sources":["../src/storage/local-storage-persistence.ts"],"sourcesContent":["import type {\n LastResourcePersistenceAdapter,\n LayoutPersistenceAdapter,\n PersistedTreeRendererStates,\n PersistedWorkbenchHistory,\n PersistedWorkbenchPanels,\n ResourceRef,\n TreeRendererPersistenceAdapter,\n WorkbenchHistoryPersistence,\n WorkbenchLayout,\n WorkbenchPanelsPersistenceAdapter,\n WorkbenchPersistenceAdapter,\n} from \"../core\";\nimport { workbenchRegions } from \"../core\";\n\nexport interface WorkbenchStorageLike {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem?(key: string): void;\n}\n\nexport type WorkbenchStoragePersistenceKind =\n | \"history\"\n | \"layout\"\n | \"layout-resource-index\"\n | \"panels\"\n | \"tree\"\n | \"last-resource\";\n\ninterface PersistedWorkbenchLayoutV1 {\n version: 1;\n layout: WorkbenchLayout;\n}\n\ninterface PersistedWorkbenchLayoutV2 {\n version: 2;\n layout: WorkbenchLayout;\n}\n\ntype PersistedWorkbenchLayout = PersistedWorkbenchLayoutV1 | PersistedWorkbenchLayoutV2;\n\nconst WORKBENCH_LAYOUT_VERSION = 2 as const;\nconst WORKBENCH_LAYOUT_RESOURCE_INDEX_VERSION = 1 as const;\nconst WORKBENCH_LAYOUT_RESOURCE_LIMIT = 50;\n\ninterface PersistedWorkbenchLayoutResourceIndex {\n version: 1;\n scopes: string[];\n}\n\ninterface CreateWorkbenchStoragePersistenceInput {\n debounceMs?: number;\n eventTarget?: {\n addEventListener(type: \"pagehide\", listener: () => void): void;\n removeEventListener(type: \"pagehide\", listener: () => void): void;\n };\n namespace: string;\n storage?: WorkbenchStorageLike;\n}\n\nexport interface CreateLocalStoragePanelsPersistenceInput extends CreateWorkbenchStoragePersistenceInput {\n scope: string;\n}\n\nexport interface CreateLocalStorageTreePersistenceInput extends CreateWorkbenchStoragePersistenceInput {\n scope?: string;\n}\n\nexport interface CreateLocalStorageWorkbenchPersistenceInput extends CreateWorkbenchStoragePersistenceInput {\n scope?: string;\n}\n\nexport const workbenchStoragePersistenceKey = (\n namespace: string,\n kind: WorkbenchStoragePersistenceKind,\n scope: string | undefined,\n) => `${namespace}:${kind}:${scope ?? \"global\"}`;\n\nconst createMemoryStorage = (): WorkbenchStorageLike => {\n const map = new Map<string, string>();\n return {\n getItem: (key) => map.get(key) ?? null,\n setItem: (key, value) => {\n map.set(key, value);\n },\n removeItem: (key) => {\n map.delete(key);\n },\n };\n};\n\nconst resolveStorage = (storage?: WorkbenchStorageLike): WorkbenchStorageLike => {\n if (storage) return storage;\n if (typeof localStorage !== \"undefined\") return localStorage;\n return createMemoryStorage();\n};\n\nconst readJson = <T>(storage: WorkbenchStorageLike, key: string): T | undefined => {\n const raw = storage.getItem(key);\n if (!raw) return undefined;\n try {\n return JSON.parse(raw) as T;\n } catch {\n return undefined;\n }\n};\n\nexport const createLocalStorageLayoutPersistence = (\n input: CreateWorkbenchStoragePersistenceInput,\n): LayoutPersistenceAdapter => {\n const storage = resolveStorage(input.storage);\n const pending = new Map<string, { legacyPanelsKey?: string; raw: string; scope: string | undefined }>();\n const debounceMs = input.debounceMs ?? 250;\n const eventTarget =\n input.eventTarget ??\n (typeof window !== \"undefined\"\n ? {\n addEventListener: (type: \"pagehide\", listener: () => void) => window.addEventListener(type, listener),\n removeEventListener: (type: \"pagehide\", listener: () => void) => window.removeEventListener(type, listener),\n }\n : undefined);\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const resourceProjectId = (scope: string | undefined) =>\n scope?.match(/^project\\/([^/]+)\\/mode\\/[^/]+\\/resource\\//)?.[1];\n\n const touchResourceScope = (scope: string | undefined) => {\n const projectId = resourceProjectId(scope);\n if (!projectId || !scope) return;\n\n const indexKey = workbenchStoragePersistenceKey(input.namespace, \"layout-resource-index\", projectId);\n const persisted = readJson<unknown>(storage, indexKey);\n const scopes =\n typeof persisted === \"object\" &&\n persisted !== null &&\n \"version\" in persisted &&\n persisted.version === WORKBENCH_LAYOUT_RESOURCE_INDEX_VERSION &&\n \"scopes\" in persisted &&\n Array.isArray(persisted.scopes)\n ? persisted.scopes.filter(\n (candidate): candidate is string =>\n typeof candidate === \"string\" &&\n candidate !== scope &&\n storage.getItem(workbenchStoragePersistenceKey(input.namespace, \"layout\", candidate)) !== null,\n )\n : [];\n scopes.push(scope);\n\n for (const evictedScope of scopes.splice(0, Math.max(0, scopes.length - WORKBENCH_LAYOUT_RESOURCE_LIMIT))) {\n storage.removeItem?.(workbenchStoragePersistenceKey(input.namespace, \"layout\", evictedScope));\n storage.removeItem?.(workbenchStoragePersistenceKey(input.namespace, \"panels\", evictedScope));\n }\n\n const next: PersistedWorkbenchLayoutResourceIndex = {\n version: WORKBENCH_LAYOUT_RESOURCE_INDEX_VERSION,\n scopes,\n };\n storage.setItem(indexKey, JSON.stringify(next));\n };\n\n const flush = () => {\n if (timer) clearTimeout(timer);\n timer = undefined;\n const writes = [...pending.values()];\n pending.clear();\n for (const write of writes) {\n storage.setItem(workbenchStoragePersistenceKey(input.namespace, \"layout\", write.scope), write.raw);\n touchResourceScope(write.scope);\n if (write.legacyPanelsKey) storage.removeItem?.(write.legacyPanelsKey);\n }\n };\n\n const scheduleFlush = () => {\n if (timer) clearTimeout(timer);\n timer = setTimeout(flush, debounceMs);\n };\n\n eventTarget?.addEventListener(\"pagehide\", flush);\n\n return {\n getLayout: (scope) => {\n const key = workbenchStoragePersistenceKey(input.namespace, \"layout\", scope);\n const persisted = pending.has(key)\n ? (JSON.parse(pending.get(key)!.raw) as PersistedWorkbenchLayout)\n : readJson<PersistedWorkbenchLayout>(storage, key);\n if (persisted?.version === WORKBENCH_LAYOUT_VERSION) return persisted.layout;\n if (persisted?.version !== 1) return undefined;\n\n const legacyPanelsKey = workbenchStoragePersistenceKey(input.namespace, \"panels\", scope);\n const panels = readJson<unknown>(storage, legacyPanelsKey);\n const openByRegionId =\n typeof panels === \"object\" &&\n panels !== null &&\n \"openByRegionId\" in panels &&\n typeof panels.openByRegionId === \"object\" &&\n panels.openByRegionId !== null\n ? panels.openByRegionId\n : {};\n const regions = { ...persisted.layout.regions };\n for (const region of workbenchRegions) {\n const open = (openByRegionId as Record<string, unknown>)[region];\n if (typeof open === \"boolean\" && regions[region]) {\n regions[region] = { ...regions[region], visible: open };\n }\n }\n const layout = { ...persisted.layout, regions };\n const migrated: PersistedWorkbenchLayoutV2 = { version: WORKBENCH_LAYOUT_VERSION, layout };\n pending.set(key, {\n legacyPanelsKey: storage.getItem(legacyPanelsKey) === null ? undefined : legacyPanelsKey,\n raw: JSON.stringify(migrated),\n scope,\n });\n scheduleFlush();\n return layout;\n },\n setLayout: (layout, scope) => {\n const persisted: PersistedWorkbenchLayoutV2 = { version: WORKBENCH_LAYOUT_VERSION, layout };\n const key = workbenchStoragePersistenceKey(input.namespace, \"layout\", scope);\n const legacyPanelsKey = workbenchStoragePersistenceKey(input.namespace, \"panels\", scope);\n pending.delete(key);\n pending.set(key, {\n legacyPanelsKey: storage.getItem(legacyPanelsKey) === null ? undefined : legacyPanelsKey,\n raw: JSON.stringify(persisted),\n scope,\n });\n scheduleFlush();\n },\n flush,\n dispose() {\n flush();\n eventTarget?.removeEventListener(\"pagehide\", flush);\n },\n };\n};\n\nexport const createLocalStorageHistoryPersistence = (\n input: CreateWorkbenchStoragePersistenceInput,\n): WorkbenchHistoryPersistence => {\n const storage = resolveStorage(input.storage);\n return {\n getHistory: (scope) =>\n readJson<PersistedWorkbenchHistory>(storage, workbenchStoragePersistenceKey(input.namespace, \"history\", scope)),\n setHistory: (history, scope) => {\n storage.setItem(workbenchStoragePersistenceKey(input.namespace, \"history\", scope), JSON.stringify(history));\n },\n };\n};\n\nexport const createLocalStoragePanelsPersistence = (\n input: CreateLocalStoragePanelsPersistenceInput,\n): WorkbenchPanelsPersistenceAdapter => {\n const storage = resolveStorage(input.storage);\n return {\n getPanelStates: (scope) =>\n readJson<PersistedWorkbenchPanels>(\n storage,\n workbenchStoragePersistenceKey(input.namespace, \"panels\", scope ?? input.scope),\n ),\n setPanelStates: (state, scope) => {\n const key = workbenchStoragePersistenceKey(input.namespace, \"panels\", scope ?? input.scope);\n storage.setItem(key, JSON.stringify(state));\n },\n };\n};\n\nexport const createLocalStorageTreePersistence = (\n input: CreateLocalStorageTreePersistenceInput,\n): TreeRendererPersistenceAdapter => {\n const storage = resolveStorage(input.storage);\n const key = workbenchStoragePersistenceKey(input.namespace, \"tree\", input.scope);\n return {\n getTreeStates: () => readJson<PersistedTreeRendererStates>(storage, key),\n setTreeStates: (state) => {\n storage.setItem(key, JSON.stringify(state));\n },\n };\n};\n\nexport interface CreateLocalStorageLastResourcePersistenceInput extends CreateWorkbenchStoragePersistenceInput {\n scope?: string;\n}\n\nconst isResourceRef = (value: unknown): value is ResourceRef =>\n Boolean(value) && typeof (value as ResourceRef).kind === \"string\" && typeof (value as ResourceRef).uri === \"string\";\n\nexport const createLocalStorageLastResourcePersistence = (\n input: CreateLocalStorageLastResourcePersistenceInput,\n): LastResourcePersistenceAdapter => {\n const storage = resolveStorage(input.storage);\n const key = workbenchStoragePersistenceKey(input.namespace, \"last-resource\", input.scope);\n return {\n getLastResource: () => {\n const parsed = readJson<unknown>(storage, key);\n return isResourceRef(parsed) ? parsed : undefined;\n },\n setLastResource: (resource) => {\n if (!resource) {\n storage.removeItem?.(key);\n return;\n }\n storage.setItem(key, JSON.stringify(resource));\n },\n };\n};\n\nexport const createLocalStorageWorkbenchPersistence = (input: CreateLocalStorageWorkbenchPersistenceInput) => {\n const storage = resolveStorage(input.storage);\n const layoutPersistence = createLocalStorageLayoutPersistence({\n debounceMs: input.debounceMs,\n eventTarget: input.eventTarget,\n namespace: input.namespace,\n storage,\n });\n const snapshotPersistence: WorkbenchPersistenceAdapter = {\n getSnapshot: (scope) => {\n const layout = layoutPersistence.getLayout(scope);\n return layout ? { layout } : undefined;\n },\n setSnapshot: (snapshot, scope) => layoutPersistence.setLayout(snapshot.layout, scope),\n flush: layoutPersistence.flush,\n dispose: layoutPersistence.dispose,\n };\n\n return {\n snapshotPersistence,\n historyPersistence: createLocalStorageHistoryPersistence({\n namespace: input.namespace,\n storage,\n }),\n layoutPersistence,\n panelsPersistence: createLocalStoragePanelsPersistence({\n namespace: input.namespace,\n scope: input.scope ?? \"global\",\n storage,\n }),\n treePersistence: createLocalStorageTreePersistence({\n namespace: input.namespace,\n scope: input.scope,\n storage,\n }),\n lastResourcePersistence: createLocalStorageLastResourcePersistence({\n namespace: input.namespace,\n scope: input.scope,\n storage,\n }),\n };\n};\n"],"names":["WORKBENCH_LAYOUT_VERSION","WORKBENCH_LAYOUT_RESOURCE_INDEX_VERSION","WORKBENCH_LAYOUT_RESOURCE_LIMIT","workbenchStoragePersistenceKey","namespace","kind","scope","createMemoryStorage","map","Map","getItem","key","get","setItem","value","set","removeItem","delete","resolveStorage","storage","localStorage","readJson","raw","JSON","parse","createLocalStorageLayoutPersistence","input","pending","debounceMs","eventTarget","window","addEventListener","type","listener","removeEventListener","undefined","timer","resourceProjectId","match","touchResourceScope","projectId","indexKey","persisted","scopes","version","Array","isArray","filter","candidate","push","evictedScope","splice","Math","max","length","next","stringify","flush","writes","values","clear","write","legacyPanelsKey","scheduleFlush","setTimeout","getLayout","has","layout","panels","openByRegionId","regions","region","workbenchRegions","open","visible","migrated","setLayout","dispose","createLocalStorageHistoryPersistence","getHistory","setHistory","history","createLocalStoragePanelsPersistence","getPanelStates","setPanelStates","state","createLocalStorageTreePersistence","getTreeStates","setTreeStates","isResourceRef","Boolean","uri","createLocalStorageLastResourcePersistence","getLastResource","parsed","setLastResource","resource","createLocalStorageWorkbenchPersistence","layoutPersistence","snapshotPersistence","getSnapshot","setSnapshot","snapshot","historyPersistence","panelsPersistence","treePersistence","lastResourcePersistence"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"storage.js","sources":["../src/storage/local-storage-persistence-helpers.ts","../src/storage/local-storage-layout-persistence.ts","../src/storage/local-storage-persistence.ts"],"sourcesContent":["export interface WorkbenchStorageLike {\n readonly length?: number;\n getItem(key: string): string | null;\n key?(index: number): string | null;\n setItem(key: string, value: string): void;\n removeItem?(key: string): void;\n}\n\nexport type WorkbenchStoragePersistenceKind =\n | \"history\"\n | \"layout\"\n | \"layout-compatibility\"\n | \"layout-generation\"\n | \"layout-resource-index\"\n | \"layout-scope-index\"\n | \"panels\"\n | \"side-panel\"\n | \"tree\"\n | \"last-resource\";\n\nexport interface CreateWorkbenchStoragePersistenceInput {\n debounceMs?: number;\n eventTarget?: {\n addEventListener(type: \"pagehide\", listener: () => void): void;\n removeEventListener(type: \"pagehide\", listener: () => void): void;\n };\n namespace: string;\n storage?: WorkbenchStorageLike;\n}\n\nexport const workbenchStoragePersistenceKey = (\n namespace: string,\n kind: WorkbenchStoragePersistenceKind,\n scope: string | undefined,\n) => `${namespace}:${kind}:${scope ?? \"global\"}`;\n\nconst createMemoryStorage = (): WorkbenchStorageLike => {\n const map = new Map<string, string>();\n return {\n get length() {\n return map.size;\n },\n getItem: (key) => map.get(key) ?? null,\n key: (index) => [...map.keys()][index] ?? null,\n setItem: (key, value) => {\n map.set(key, value);\n },\n removeItem: (key) => {\n map.delete(key);\n },\n };\n};\n\nexport const resolveStorage = (storage?: WorkbenchStorageLike): WorkbenchStorageLike => {\n if (storage) return storage;\n if (typeof localStorage !== \"undefined\") return localStorage;\n return createMemoryStorage();\n};\n\nexport const readJson = <T>(storage: WorkbenchStorageLike, key: string): T | undefined => {\n const raw = storage.getItem(key);\n if (!raw) return undefined;\n try {\n return JSON.parse(raw) as T;\n } catch {\n return undefined;\n }\n};\n","import type { LayoutPersistenceAdapter, WorkbenchLayout } from \"../core\";\nimport {\n type CreateWorkbenchStoragePersistenceInput,\n readJson,\n resolveStorage,\n workbenchStoragePersistenceKey,\n} from \"./local-storage-persistence-helpers\";\n\ninterface PersistedWorkbenchLayoutV3 {\n version: 3;\n layout: WorkbenchLayout;\n}\n\ntype PersistedWorkbenchLayout = PersistedWorkbenchLayoutV3;\n\n// Version 3 is the composition-resolver layout model (PS-267). Layouts persisted by\n// earlier versions carry replaced panel roles and bindings, so they are discarded\n// rather than interpreted.\nconst WORKBENCH_LAYOUT_VERSION = 3 as const;\nconst WORKBENCH_LAYOUT_INDEX_VERSION = 1 as const;\nconst WORKBENCH_LAYOUT_RESOURCE_LIMIT = 50;\n\ninterface PersistedWorkbenchLayoutScopeIndex {\n version: 1;\n scopes: string[];\n}\n\ninterface PersistedWorkbenchLayoutGeneration {\n version: 1;\n generation: number;\n}\n\nexport const createLocalStorageLayoutPersistence = (\n input: CreateWorkbenchStoragePersistenceInput,\n): LayoutPersistenceAdapter => {\n const storage = resolveStorage(input.storage);\n const pending = new Map<\n string,\n { generation: number; legacyPanelsKey?: string; raw: string; scope: string | undefined }\n >();\n const debounceMs = input.debounceMs ?? 250;\n const eventTarget =\n input.eventTarget ??\n (typeof window !== \"undefined\"\n ? {\n addEventListener: (type: \"pagehide\", listener: () => void) => window.addEventListener(type, listener),\n removeEventListener: (type: \"pagehide\", listener: () => void) => window.removeEventListener(type, listener),\n }\n : undefined);\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const generationKey = workbenchStoragePersistenceKey(input.namespace, \"layout-generation\", undefined);\n const getGeneration = () => {\n const persisted = readJson<unknown>(storage, generationKey);\n return typeof persisted === \"object\" &&\n persisted !== null &&\n \"version\" in persisted &&\n persisted.version === 1 &&\n \"generation\" in persisted &&\n typeof persisted.generation === \"number\"\n ? persisted.generation\n : 0;\n };\n\n const advanceGeneration = () => {\n const generation = getGeneration() + 1;\n const persisted: PersistedWorkbenchLayoutGeneration = { version: 1, generation };\n storage.setItem(generationKey, JSON.stringify(persisted));\n return generation;\n };\n\n const resourceProjectId = (scope: string | undefined) =>\n scope?.match(/^project\\/([^/]+)\\/mode\\/[^/]+\\/resource\\//)?.[1];\n const scopeProjectId = (scope: string | undefined) => scope?.match(/^project\\/([^/]+)/)?.[1];\n\n const storedProjectScopes = (projectId: string) => {\n if (!storage.key) return [];\n const prefix = `${input.namespace}:layout:`;\n const scopes: string[] = [];\n for (let index = 0; index < (storage.length ?? 0); index += 1) {\n const key = storage.key(index);\n if (!key?.startsWith(prefix)) continue;\n const scope = key.slice(prefix.length);\n if (scopeProjectId(scope) === projectId) scopes.push(scope);\n }\n return scopes;\n };\n\n const readScopes = (kind: \"layout-resource-index\" | \"layout-scope-index\", projectId: string) => {\n const persisted = readJson<unknown>(storage, workbenchStoragePersistenceKey(input.namespace, kind, projectId));\n return typeof persisted === \"object\" &&\n persisted !== null &&\n \"version\" in persisted &&\n persisted.version === WORKBENCH_LAYOUT_INDEX_VERSION &&\n \"scopes\" in persisted &&\n Array.isArray(persisted.scopes)\n ? persisted.scopes.filter(\n (scope): scope is string =>\n typeof scope === \"string\" &&\n storage.getItem(workbenchStoragePersistenceKey(input.namespace, \"layout\", scope)) !== null,\n )\n : [];\n };\n\n const writeScopes = (kind: \"layout-resource-index\" | \"layout-scope-index\", projectId: string, scopes: string[]) => {\n const next: PersistedWorkbenchLayoutScopeIndex = { version: WORKBENCH_LAYOUT_INDEX_VERSION, scopes };\n storage.setItem(workbenchStoragePersistenceKey(input.namespace, kind, projectId), JSON.stringify(next));\n };\n\n const touchProjectScope = (scope: string | undefined) => {\n const projectId = scopeProjectId(scope);\n if (!projectId || !scope) return;\n const scopes = readScopes(\"layout-scope-index\", projectId).filter((candidate) => candidate !== scope);\n scopes.push(scope);\n writeScopes(\"layout-scope-index\", projectId, scopes);\n };\n\n const touchResourceScope = (scope: string | undefined) => {\n const projectId = resourceProjectId(scope);\n if (!projectId || !scope) return;\n const scopes = readScopes(\"layout-resource-index\", projectId).filter((candidate) => candidate !== scope);\n scopes.push(scope);\n for (const evictedScope of scopes.splice(0, Math.max(0, scopes.length - WORKBENCH_LAYOUT_RESOURCE_LIMIT))) {\n storage.removeItem?.(workbenchStoragePersistenceKey(input.namespace, \"layout\", evictedScope));\n storage.removeItem?.(workbenchStoragePersistenceKey(input.namespace, \"panels\", evictedScope));\n }\n writeScopes(\"layout-resource-index\", projectId, scopes);\n };\n\n const flush = () => {\n if (timer) clearTimeout(timer);\n timer = undefined;\n const writes = [...pending.values()];\n pending.clear();\n const generation = getGeneration();\n for (const write of writes) {\n if (write.generation !== generation) continue;\n storage.setItem(workbenchStoragePersistenceKey(input.namespace, \"layout\", write.scope), write.raw);\n touchProjectScope(write.scope);\n touchResourceScope(write.scope);\n if (write.legacyPanelsKey) storage.removeItem?.(write.legacyPanelsKey);\n }\n };\n\n const scheduleFlush = () => {\n if (timer) clearTimeout(timer);\n timer = setTimeout(flush, debounceMs);\n };\n\n eventTarget?.addEventListener(\"pagehide\", flush);\n\n return {\n getLayout: (scope) => {\n const key = workbenchStoragePersistenceKey(input.namespace, \"layout\", scope);\n const pendingWrite = pending.get(key);\n const persisted =\n pendingWrite && pendingWrite.generation === getGeneration()\n ? (JSON.parse(pendingWrite.raw) as PersistedWorkbenchLayout)\n : readJson<PersistedWorkbenchLayout>(storage, key);\n if (persisted?.version === WORKBENCH_LAYOUT_VERSION) return persisted.layout;\n return undefined;\n },\n setLayout: (layout, scope) => {\n const persisted: PersistedWorkbenchLayoutV3 = { version: WORKBENCH_LAYOUT_VERSION, layout };\n const key = workbenchStoragePersistenceKey(input.namespace, \"layout\", scope);\n const legacyPanelsKey = workbenchStoragePersistenceKey(input.namespace, \"panels\", scope);\n pending.delete(key);\n pending.set(key, {\n generation: getGeneration(),\n legacyPanelsKey: storage.getItem(legacyPanelsKey) === null ? undefined : legacyPanelsKey,\n raw: JSON.stringify(persisted),\n scope,\n });\n scheduleFlush();\n },\n flush,\n listScopes(projectId) {\n return [\n ...new Set([\n ...readScopes(\"layout-scope-index\", projectId),\n ...readScopes(\"layout-resource-index\", projectId),\n ...storedProjectScopes(projectId),\n ]),\n ];\n },\n transformLayouts(projectId, transform) {\n flush();\n advanceGeneration();\n for (const scope of this.listScopes?.(projectId) ?? []) {\n const key = workbenchStoragePersistenceKey(input.namespace, \"layout\", scope);\n const persisted = readJson<PersistedWorkbenchLayout>(storage, key);\n if (persisted?.version !== WORKBENCH_LAYOUT_VERSION) continue;\n const layout = transform(persisted.layout, scope);\n if (!layout) {\n storage.removeItem?.(key);\n continue;\n }\n storage.setItem(\n key,\n JSON.stringify({ version: WORKBENCH_LAYOUT_VERSION, layout } satisfies PersistedWorkbenchLayoutV3),\n );\n }\n },\n getCompatibilityMarker: (key) =>\n readJson<string>(storage, workbenchStoragePersistenceKey(input.namespace, \"layout-compatibility\", key)),\n setCompatibilityMarker: (key, value) => {\n advanceGeneration();\n storage.setItem(\n workbenchStoragePersistenceKey(input.namespace, \"layout-compatibility\", key),\n JSON.stringify(value),\n );\n },\n advanceWriteGeneration: advanceGeneration,\n dispose() {\n flush();\n eventTarget?.removeEventListener(\"pagehide\", flush);\n },\n };\n};\n","import type {\n LastResourcePersistenceAdapter,\n PersistedTreeRendererStates,\n PersistedWorkbenchHistory,\n PersistedWorkbenchPanels,\n ResourceRef,\n TreeRendererPersistenceAdapter,\n WorkbenchHistoryPersistence,\n WorkbenchPanelsPersistenceAdapter,\n WorkbenchPersistenceAdapter,\n WorkbenchSidePanelMode,\n WorkbenchSidePanelPersistenceAdapter,\n} from \"../core\";\nimport { createLocalStorageLayoutPersistence } from \"./local-storage-layout-persistence\";\nimport {\n type CreateWorkbenchStoragePersistenceInput,\n readJson,\n resolveStorage,\n workbenchStoragePersistenceKey,\n} from \"./local-storage-persistence-helpers\";\n\nexport type {\n WorkbenchStorageLike,\n WorkbenchStoragePersistenceKind,\n} from \"./local-storage-persistence-helpers\";\nexport { createLocalStorageLayoutPersistence, workbenchStoragePersistenceKey };\n\nexport interface CreateLocalStoragePanelsPersistenceInput extends CreateWorkbenchStoragePersistenceInput {\n scope: string;\n}\n\nexport interface CreateLocalStorageTreePersistenceInput extends CreateWorkbenchStoragePersistenceInput {\n scope?: string;\n}\n\nexport interface CreateLocalStorageWorkbenchPersistenceInput extends CreateWorkbenchStoragePersistenceInput {\n scope?: string;\n}\n\nexport const createLocalStorageHistoryPersistence = (\n input: CreateWorkbenchStoragePersistenceInput,\n): WorkbenchHistoryPersistence => {\n const storage = resolveStorage(input.storage);\n return {\n getHistory: (scope) =>\n readJson<PersistedWorkbenchHistory>(storage, workbenchStoragePersistenceKey(input.namespace, \"history\", scope)),\n setHistory: (history, scope) => {\n storage.setItem(workbenchStoragePersistenceKey(input.namespace, \"history\", scope), JSON.stringify(history));\n },\n };\n};\n\nexport const createLocalStoragePanelsPersistence = (\n input: CreateLocalStoragePanelsPersistenceInput,\n): WorkbenchPanelsPersistenceAdapter => {\n const storage = resolveStorage(input.storage);\n return {\n getPanelStates: (scope) =>\n readJson<PersistedWorkbenchPanels>(\n storage,\n workbenchStoragePersistenceKey(input.namespace, \"panels\", scope ?? input.scope),\n ),\n setPanelStates: (state, scope) => {\n const key = workbenchStoragePersistenceKey(input.namespace, \"panels\", scope ?? input.scope);\n storage.setItem(key, JSON.stringify(state));\n },\n };\n};\n\nexport const createLocalStorageTreePersistence = (\n input: CreateLocalStorageTreePersistenceInput,\n): TreeRendererPersistenceAdapter => {\n const storage = resolveStorage(input.storage);\n const key = workbenchStoragePersistenceKey(input.namespace, \"tree\", input.scope);\n return {\n getTreeStates: () => readJson<PersistedTreeRendererStates>(storage, key),\n setTreeStates: (state) => {\n storage.setItem(key, JSON.stringify(state));\n },\n };\n};\n\nexport interface CreateLocalStorageLastResourcePersistenceInput extends CreateWorkbenchStoragePersistenceInput {\n scope?: string;\n}\n\nconst isResourceRef = (value: unknown): value is ResourceRef =>\n Boolean(value) && typeof (value as ResourceRef).kind === \"string\" && typeof (value as ResourceRef).uri === \"string\";\n\nexport const createLocalStorageLastResourcePersistence = (\n input: CreateLocalStorageLastResourcePersistenceInput,\n): LastResourcePersistenceAdapter => {\n const storage = resolveStorage(input.storage);\n const key = workbenchStoragePersistenceKey(input.namespace, \"last-resource\", input.scope);\n return {\n getLastResource: () => {\n const parsed = readJson<unknown>(storage, key);\n return isResourceRef(parsed) ? parsed : undefined;\n },\n setLastResource: (resource) => {\n if (!resource) {\n storage.removeItem?.(key);\n return;\n }\n storage.setItem(key, JSON.stringify(resource));\n },\n };\n};\n\ninterface PersistedWorkbenchSidePanel {\n version: 1;\n mode: WorkbenchSidePanelMode;\n}\n\nconst WORKBENCH_SIDE_PANEL_VERSION = 1 as const;\nconst sidePanelModes: readonly WorkbenchSidePanelMode[] = [\"attached\", \"closed\", \"floating\"];\n\nexport interface CreateLocalStorageSidePanelPersistenceInput extends CreateWorkbenchStoragePersistenceInput {\n scope?: string;\n}\n\nexport const createLocalStorageSidePanelPersistence = (\n input: CreateLocalStorageSidePanelPersistenceInput,\n): WorkbenchSidePanelPersistenceAdapter => {\n const storage = resolveStorage(input.storage);\n const key = workbenchStoragePersistenceKey(input.namespace, \"side-panel\", input.scope);\n return {\n getMode: () => {\n const persisted = readJson<PersistedWorkbenchSidePanel>(storage, key);\n if (persisted?.version !== WORKBENCH_SIDE_PANEL_VERSION) return undefined;\n return sidePanelModes.includes(persisted.mode) ? persisted.mode : undefined;\n },\n setMode: (mode) => {\n const persisted: PersistedWorkbenchSidePanel = { version: WORKBENCH_SIDE_PANEL_VERSION, mode };\n storage.setItem(key, JSON.stringify(persisted));\n },\n };\n};\n\nexport const createLocalStorageWorkbenchPersistence = (input: CreateLocalStorageWorkbenchPersistenceInput) => {\n const storage = resolveStorage(input.storage);\n const layoutPersistence = createLocalStorageLayoutPersistence({\n debounceMs: input.debounceMs,\n eventTarget: input.eventTarget,\n namespace: input.namespace,\n storage,\n });\n const snapshotPersistence: WorkbenchPersistenceAdapter = {\n getSnapshot: (scope) => {\n const layout = layoutPersistence.getLayout(scope);\n return layout ? { layout } : undefined;\n },\n setSnapshot: (snapshot, scope) => layoutPersistence.setLayout(snapshot.layout, scope),\n flush: layoutPersistence.flush,\n dispose: layoutPersistence.dispose,\n };\n\n return {\n snapshotPersistence,\n historyPersistence: createLocalStorageHistoryPersistence({ namespace: input.namespace, storage }),\n layoutPersistence,\n panelsPersistence: createLocalStoragePanelsPersistence({\n namespace: input.namespace,\n scope: input.scope ?? \"global\",\n storage,\n }),\n treePersistence: createLocalStorageTreePersistence({ namespace: input.namespace, scope: input.scope, storage }),\n lastResourcePersistence: createLocalStorageLastResourcePersistence({\n namespace: input.namespace,\n scope: input.scope,\n storage,\n }),\n sidePanelPersistence: createLocalStorageSidePanelPersistence({\n namespace: input.namespace,\n scope: input.scope,\n storage,\n }),\n };\n};\n"],"names":["workbenchStoragePersistenceKey","namespace","kind","scope","createMemoryStorage","map","Map","length","size","getItem","key","get","index","keys","setItem","value","set","removeItem","delete","resolveStorage","storage","localStorage","readJson","raw","JSON","parse","createLocalStorageLayoutPersistence","input","pending","debounceMs","eventTarget","window","addEventListener","type","listener","removeEventListener","undefined","timer","generationKey","getGeneration","persisted","version","generation","advanceGeneration","stringify","resourceProjectId","match","scopeProjectId","storedProjectScopes","projectId","prefix","scopes","startsWith","slice","push","readScopes","WORKBENCH_LAYOUT_INDEX_VERSION","Array","isArray","filter","writeScopes","next","touchProjectScope","candidate","touchResourceScope","evictedScope","splice","Math","max","WORKBENCH_LAYOUT_RESOURCE_LIMIT","flush","writes","values","clear","write","legacyPanelsKey","scheduleFlush","setTimeout","getLayout","pendingWrite","WORKBENCH_LAYOUT_VERSION","layout","setLayout","listScopes","Set","transformLayouts","transform","getCompatibilityMarker","setCompatibilityMarker","advanceWriteGeneration","dispose","createLocalStorageHistoryPersistence","getHistory","setHistory","history","createLocalStoragePanelsPersistence","getPanelStates","setPanelStates","state","createLocalStorageTreePersistence","getTreeStates","setTreeStates","isResourceRef","Boolean","uri","createLocalStorageLastResourcePersistence","getLastResource","parsed","setLastResource","resource","sidePanelModes","createLocalStorageSidePanelPersistence","getMode","WORKBENCH_SIDE_PANEL_VERSION","includes","mode","setMode","createLocalStorageWorkbenchPersistence","layoutPersistence","snapshotPersistence","getSnapshot","setSnapshot","snapshot","historyPersistence","panelsPersistence","treePersistence","lastResourcePersistence","sidePanelPersistence"],"mappings":"AA8BO,MAAMA,IAAiCA,CAC5CC,GACAC,GACAC,MACG,GAAGF,CAAS,IAAIC,CAAI,IAAIC,KAAS,QAAQ,IAExCC,IAAsBA,MAA4B;AACtD,QAAMC,wBAAUC,IAAAA;AAChB,SAAO;AAAA,IACL,IAAIC,SAAS;AACX,aAAOF,EAAIG;AAAAA,IACb;AAAA,IACAC,SAAUC,CAAAA,MAAQL,EAAIM,IAAID,CAAG,KAAK;AAAA,IAClCA,KAAME,OAAU,CAAC,GAAGP,EAAIQ,MAAM,EAAED,CAAK,KAAK;AAAA,IAC1CE,SAASA,CAACJ,GAAKK,MAAU;AACvBV,MAAAA,EAAIW,IAAIN,GAAKK,CAAK;AAAA,IACpB;AAAA,IACAE,YAAaP,CAAAA,MAAQ;AACnBL,MAAAA,EAAIa,OAAOR,CAAG;AAAA,IAChB;AAAA,EAAA;AAEJ,GAEaS,IAAiBA,CAACC,MACzBA,MACA,OAAOC,eAAiB,MAAoBA,eACzCjB,EAAAA,IAGIkB,IAAW,CAAIF,GAA+BV,MAA+B;AACxF,QAAMa,IAAMH,EAAQX,QAAQC,CAAG;AAC/B,MAAKa;AACL,QAAI;AACF,aAAOC,KAAKC,MAAMF,CAAG;AAAA,IACvB,QAAQ;AACN;AAAA,IACF;AACF;ACnCO,MAAMG,IAAsCA,CACjDC,MAC6B;AAC7B,QAAMP,IAAUD,EAAeQ,EAAMP,OAAO,GACtCQ,wBAActB,IAAAA,GAIduB,IAAaF,EAAME,cAAc,KACjCC,IACJH,EAAMG,gBACL,OAAOC,SAAW,MACf;AAAA,IACEC,kBAAkBA,CAACC,GAAkBC,MAAyBH,OAAOC,iBAAiBC,GAAMC,CAAQ;AAAA,IACpGC,qBAAqBA,CAACF,GAAkBC,MAAyBH,OAAOI,oBAAoBF,GAAMC,CAAQ;AAAA,EAAA,IAE5GE;AACN,MAAIC;AAEJ,QAAMC,IAAgBtC,EAA+B2B,EAAM1B,WAAW,qBAAqBmC,MAAS,GAC9FG,IAAgBA,MAAM;AAC1B,UAAMC,IAAYlB,EAAkBF,GAASkB,CAAa;AAC1D,WAAO,OAAOE,KAAc,YAC1BA,MAAc,QACd,aAAaA,KACbA,EAAUC,YAAY,KACtB,gBAAgBD,KAChB,OAAOA,EAAUE,cAAe,WAC9BF,EAAUE,aACV;AAAA,EACN,GAEMC,IAAoBA,MAAM;AAC9B,UAAMD,IAAaH,MAAkB,GAC/BC,IAAgD;AAAA,MAAEC,SAAS;AAAA,MAAGC,YAAAA;AAAAA,IAAAA;AACpEtB,WAAAA,EAAQN,QAAQwB,GAAed,KAAKoB,UAAUJ,CAAS,CAAC,GACjDE;AAAAA,EACT,GAEMG,IAAoBA,CAAC1C,MACzBA,GAAO2C,MAAM,4CAA4C,IAAI,CAAC,GAC1DC,IAAiBA,CAAC5C,MAA8BA,GAAO2C,MAAM,mBAAmB,IAAI,CAAC,GAErFE,IAAsBA,CAACC,MAAsB;AACjD,QAAI,CAAC7B,EAAQV,IAAK,QAAO,CAAA;AACzB,UAAMwC,IAAS,GAAGvB,EAAM1B,SAAS,YAC3BkD,IAAmB,CAAA;AACzB,aAASvC,IAAQ,GAAGA,KAASQ,EAAQb,UAAU,IAAIK,KAAS,GAAG;AAC7D,YAAMF,IAAMU,EAAQV,IAAIE,CAAK;AAC7B,UAAI,CAACF,GAAK0C,WAAWF,CAAM,EAAG;AAC9B,YAAM/C,IAAQO,EAAI2C,MAAMH,EAAO3C,MAAM;AACrC,MAAIwC,EAAe5C,CAAK,MAAM8C,KAAWE,EAAOG,KAAKnD,CAAK;AAAA,IAC5D;AACA,WAAOgD;AAAAA,EACT,GAEMI,IAAaA,CAACrD,GAAsD+C,MAAsB;AAC9F,UAAMT,IAAYlB,EAAkBF,GAASpB,EAA+B2B,EAAM1B,WAAWC,GAAM+C,CAAS,CAAC;AAC7G,WAAO,OAAOT,KAAc,YAC1BA,MAAc,QACd,aAAaA,KACbA,EAAUC,YAAYe,KACtB,YAAYhB,KACZiB,MAAMC,QAAQlB,EAAUW,MAAM,IAC5BX,EAAUW,OAAOQ,OACf,CAACxD,MACC,OAAOA,KAAU,YACjBiB,EAAQX,QAAQT,EAA+B2B,EAAM1B,WAAW,UAAUE,CAAK,CAAC,MAAM,IAC1F,IACA,CAAA;AAAA,EACN,GAEMyD,IAAcA,CAAC1D,GAAsD+C,GAAmBE,MAAqB;AACjH,UAAMU,IAA2C;AAAA,MAAEpB,SAASe;AAAAA,MAAgCL,QAAAA;AAAAA,IAAAA;AAC5F/B,IAAAA,EAAQN,QAAQd,EAA+B2B,EAAM1B,WAAWC,GAAM+C,CAAS,GAAGzB,KAAKoB,UAAUiB,CAAI,CAAC;AAAA,EACxG,GAEMC,IAAoBA,CAAC3D,MAA8B;AACvD,UAAM8C,IAAYF,EAAe5C,CAAK;AACtC,QAAI,CAAC8C,KAAa,CAAC9C,EAAO;AAC1B,UAAMgD,IAASI,EAAW,sBAAsBN,CAAS,EAAEU,OAAQI,CAAAA,MAAcA,MAAc5D,CAAK;AACpGgD,IAAAA,EAAOG,KAAKnD,CAAK,GACjByD,EAAY,sBAAsBX,GAAWE,CAAM;AAAA,EACrD,GAEMa,IAAqBA,CAAC7D,MAA8B;AACxD,UAAM8C,IAAYJ,EAAkB1C,CAAK;AACzC,QAAI,CAAC8C,KAAa,CAAC9C,EAAO;AAC1B,UAAMgD,IAASI,EAAW,yBAAyBN,CAAS,EAAEU,OAAQI,CAAAA,MAAcA,MAAc5D,CAAK;AACvGgD,IAAAA,EAAOG,KAAKnD,CAAK;AACjB,eAAW8D,KAAgBd,EAAOe,OAAO,GAAGC,KAAKC,IAAI,GAAGjB,EAAO5C,SAAS8D,EAA+B,CAAC;AACtGjD,MAAAA,EAAQH,aAAajB,EAA+B2B,EAAM1B,WAAW,UAAUgE,CAAY,CAAC,GAC5F7C,EAAQH,aAAajB,EAA+B2B,EAAM1B,WAAW,UAAUgE,CAAY,CAAC;AAE9FL,IAAAA,EAAY,yBAAyBX,GAAWE,CAAM;AAAA,EACxD,GAEMmB,IAAQA,MAAM;AAClB,IAAIjC,kBAAoBA,CAAK,GAC7BA,IAAQD;AACR,UAAMmC,IAAS,CAAC,GAAG3C,EAAQ4C,QAAQ;AACnC5C,IAAAA,EAAQ6C,MAAAA;AACR,UAAM/B,IAAaH,EAAAA;AACnB,eAAWmC,KAASH;AAClB,MAAIG,EAAMhC,eAAeA,MACzBtB,EAAQN,QAAQd,EAA+B2B,EAAM1B,WAAW,UAAUyE,EAAMvE,KAAK,GAAGuE,EAAMnD,GAAG,GACjGuC,EAAkBY,EAAMvE,KAAK,GAC7B6D,EAAmBU,EAAMvE,KAAK,GAC1BuE,EAAMC,mBAAiBvD,EAAQH,aAAayD,EAAMC,eAAe;AAAA,EAEzE,GAEMC,IAAgBA,MAAM;AAC1B,IAAIvC,kBAAoBA,CAAK,GAC7BA,IAAQwC,WAAWP,GAAOzC,CAAU;AAAA,EACtC;AAEAC,SAAAA,GAAaE,iBAAiB,YAAYsC,CAAK,GAExC;AAAA,IACLQ,WAAY3E,CAAAA,MAAU;AACpB,YAAMO,IAAMV,EAA+B2B,EAAM1B,WAAW,UAAUE,CAAK,GACrE4E,IAAenD,EAAQjB,IAAID,CAAG,GAC9B8B,IACJuC,KAAgBA,EAAarC,eAAeH,EAAAA,IACvCf,KAAKC,MAAMsD,EAAaxD,GAAG,IAC5BD,EAAmCF,GAASV,CAAG;AACrD,UAAI8B,GAAWC,YAAYuC,EAA0B,QAAOxC,EAAUyC;AAAAA,IAExE;AAAA,IACAC,WAAWA,CAACD,GAAQ9E,MAAU;AAC5B,YAAMqC,IAAwC;AAAA,QAAEC,SAASuC;AAAAA,QAA0BC,QAAAA;AAAAA,MAAAA,GAC7EvE,IAAMV,EAA+B2B,EAAM1B,WAAW,UAAUE,CAAK,GACrEwE,IAAkB3E,EAA+B2B,EAAM1B,WAAW,UAAUE,CAAK;AACvFyB,MAAAA,EAAQV,OAAOR,CAAG,GAClBkB,EAAQZ,IAAIN,GAAK;AAAA,QACfgC,YAAYH,EAAAA;AAAAA,QACZoC,iBAAiBvD,EAAQX,QAAQkE,CAAe,MAAM,OAAOvC,SAAYuC;AAAAA,QACzEpD,KAAKC,KAAKoB,UAAUJ,CAAS;AAAA,QAC7BrC,OAAAA;AAAAA,MAAAA,CACD,GACDyE,EAAAA;AAAAA,IACF;AAAA,IACAN,OAAAA;AAAAA,IACAa,WAAWlC,GAAW;AACpB,aAAO,CACL,GAAG,oBAAImC,IAAI,CACT,GAAG7B,EAAW,sBAAsBN,CAAS,GAC7C,GAAGM,EAAW,yBAAyBN,CAAS,GAChD,GAAGD,EAAoBC,CAAS,CAAC,CAClC,CAAC;AAAA,IAEN;AAAA,IACAoC,iBAAiBpC,GAAWqC,GAAW;AACrChB,MAAAA,EAAAA,GACA3B,EAAAA;AACA,iBAAWxC,KAAS,KAAKgF,aAAalC,CAAS,KAAK,CAAA,GAAI;AACtD,cAAMvC,IAAMV,EAA+B2B,EAAM1B,WAAW,UAAUE,CAAK,GACrEqC,IAAYlB,EAAmCF,GAASV,CAAG;AACjE,YAAI8B,GAAWC,YAAYuC,EAA0B;AACrD,cAAMC,IAASK,EAAU9C,EAAUyC,QAAQ9E,CAAK;AAChD,YAAI,CAAC8E,GAAQ;AACX7D,UAAAA,EAAQH,aAAaP,CAAG;AACxB;AAAA,QACF;AACAU,QAAAA,EAAQN,QACNJ,GACAc,KAAKoB,UAAU;AAAA,UAAEH,SAASuC;AAAAA,UAA0BC,QAAAA;AAAAA,QAAAA,CAA6C,CACnG;AAAA,MACF;AAAA,IACF;AAAA,IACAM,wBAAyB7E,OACvBY,EAAiBF,GAASpB,EAA+B2B,EAAM1B,WAAW,wBAAwBS,CAAG,CAAC;AAAA,IACxG8E,wBAAwBA,CAAC9E,GAAKK,MAAU;AACtC4B,MAAAA,EAAAA,GACAvB,EAAQN,QACNd,EAA+B2B,EAAM1B,WAAW,wBAAwBS,CAAG,GAC3Ec,KAAKoB,UAAU7B,CAAK,CACtB;AAAA,IACF;AAAA,IACA0E,wBAAwB9C;AAAAA,IACxB+C,UAAU;AACRpB,MAAAA,EAAAA,GACAxC,GAAaK,oBAAoB,YAAYmC,CAAK;AAAA,IACpD;AAAA,EAAA;AAEJ,GCnLaqB,IAAuCA,CAClDhE,MACgC;AAChC,QAAMP,IAAUD,EAAeQ,EAAMP,OAAO;AAC5C,SAAO;AAAA,IACLwE,YAAazF,OACXmB,EAAoCF,GAASpB,EAA+B2B,EAAM1B,WAAW,WAAWE,CAAK,CAAC;AAAA,IAChH0F,YAAYA,CAACC,GAAS3F,MAAU;AAC9BiB,MAAAA,EAAQN,QAAQd,EAA+B2B,EAAM1B,WAAW,WAAWE,CAAK,GAAGqB,KAAKoB,UAAUkD,CAAO,CAAC;AAAA,IAC5G;AAAA,EAAA;AAEJ,GAEaC,IAAsCA,CACjDpE,MACsC;AACtC,QAAMP,IAAUD,EAAeQ,EAAMP,OAAO;AAC5C,SAAO;AAAA,IACL4E,gBAAiB7F,CAAAA,MACfmB,EACEF,GACApB,EAA+B2B,EAAM1B,WAAW,UAAUE,KAASwB,EAAMxB,KAAK,CAChF;AAAA,IACF8F,gBAAgBA,CAACC,GAAO/F,MAAU;AAChC,YAAMO,IAAMV,EAA+B2B,EAAM1B,WAAW,UAAUE,KAASwB,EAAMxB,KAAK;AAC1FiB,MAAAA,EAAQN,QAAQJ,GAAKc,KAAKoB,UAAUsD,CAAK,CAAC;AAAA,IAC5C;AAAA,EAAA;AAEJ,GAEaC,IAAoCA,CAC/CxE,MACmC;AACnC,QAAMP,IAAUD,EAAeQ,EAAMP,OAAO,GACtCV,IAAMV,EAA+B2B,EAAM1B,WAAW,QAAQ0B,EAAMxB,KAAK;AAC/E,SAAO;AAAA,IACLiG,eAAeA,MAAM9E,EAAsCF,GAASV,CAAG;AAAA,IACvE2F,eAAgBH,CAAAA,MAAU;AACxB9E,MAAAA,EAAQN,QAAQJ,GAAKc,KAAKoB,UAAUsD,CAAK,CAAC;AAAA,IAC5C;AAAA,EAAA;AAEJ,GAMMI,IAAgBA,CAACvF,MACrBwF,EAAQxF,KAAU,OAAQA,EAAsBb,QAAS,YAAY,OAAQa,EAAsByF,OAAQ,UAEhGC,IAA4CA,CACvD9E,MACmC;AACnC,QAAMP,IAAUD,EAAeQ,EAAMP,OAAO,GACtCV,IAAMV,EAA+B2B,EAAM1B,WAAW,iBAAiB0B,EAAMxB,KAAK;AACxF,SAAO;AAAA,IACLuG,iBAAiBA,MAAM;AACrB,YAAMC,IAASrF,EAAkBF,GAASV,CAAG;AAC7C,aAAO4F,EAAcK,CAAM,IAAIA,IAASvE;AAAAA,IAC1C;AAAA,IACAwE,iBAAkBC,CAAAA,MAAa;AAC7B,UAAI,CAACA,GAAU;AACbzF,QAAAA,EAAQH,aAAaP,CAAG;AACxB;AAAA,MACF;AACAU,MAAAA,EAAQN,QAAQJ,GAAKc,KAAKoB,UAAUiE,CAAQ,CAAC;AAAA,IAC/C;AAAA,EAAA;AAEJ;AAQA,MAAMC,IAAoD,CAAC,YAAY,UAAU,UAAU,GAM9EC,IAAyCA,CACpDpF,MACyC;AACzC,QAAMP,IAAUD,EAAeQ,EAAMP,OAAO,GACtCV,IAAMV,EAA+B2B,EAAM1B,WAAW,cAAc0B,EAAMxB,KAAK;AACrF,SAAO;AAAA,IACL6G,SAASA,MAAM;AACb,YAAMxE,IAAYlB,EAAsCF,GAASV,CAAG;AACpE,UAAI8B,GAAWC,YAAYwE;AAC3B,eAAOH,EAAeI,SAAS1E,EAAU2E,IAAI,IAAI3E,EAAU2E,OAAO/E;AAAAA,IACpE;AAAA,IACAgF,SAAUD,CAAAA,MAAS;AACjB,YAAM3E,IAAyC;AAAA,QAAEC,SAASwE;AAAAA,QAA8BE,MAAAA;AAAAA,MAAAA;AACxF/F,MAAAA,EAAQN,QAAQJ,GAAKc,KAAKoB,UAAUJ,CAAS,CAAC;AAAA,IAChD;AAAA,EAAA;AAEJ,GAEa6E,IAAyCA,CAAC1F,MAAuD;AAC5G,QAAMP,IAAUD,EAAeQ,EAAMP,OAAO,GACtCkG,IAAoB5F,EAAoC;AAAA,IAC5DG,YAAYF,EAAME;AAAAA,IAClBC,aAAaH,EAAMG;AAAAA,IACnB7B,WAAW0B,EAAM1B;AAAAA,IACjBmB,SAAAA;AAAAA,EAAAA,CACD;AAWD,SAAO;AAAA,IACLmG,qBAXuD;AAAA,MACvDC,aAAcrH,CAAAA,MAAU;AACtB,cAAM8E,IAASqC,EAAkBxC,UAAU3E,CAAK;AAChD,eAAO8E,IAAS;AAAA,UAAEA,QAAAA;AAAAA,QAAAA,IAAW7C;AAAAA,MAC/B;AAAA,MACAqF,aAAaA,CAACC,GAAUvH,MAAUmH,EAAkBpC,UAAUwC,EAASzC,QAAQ9E,CAAK;AAAA,MACpFmE,OAAOgD,EAAkBhD;AAAAA,MACzBoB,SAAS4B,EAAkB5B;AAAAA,IAAAA;AAAAA,IAK3BiC,oBAAoBhC,EAAqC;AAAA,MAAE1F,WAAW0B,EAAM1B;AAAAA,MAAWmB,SAAAA;AAAAA,IAAAA,CAAS;AAAA,IAChGkG,mBAAAA;AAAAA,IACAM,mBAAmB7B,EAAoC;AAAA,MACrD9F,WAAW0B,EAAM1B;AAAAA,MACjBE,OAAOwB,EAAMxB,SAAS;AAAA,MACtBiB,SAAAA;AAAAA,IAAAA,CACD;AAAA,IACDyG,iBAAiB1B,EAAkC;AAAA,MAAElG,WAAW0B,EAAM1B;AAAAA,MAAWE,OAAOwB,EAAMxB;AAAAA,MAAOiB,SAAAA;AAAAA,IAAAA,CAAS;AAAA,IAC9G0G,yBAAyBrB,EAA0C;AAAA,MACjExG,WAAW0B,EAAM1B;AAAAA,MACjBE,OAAOwB,EAAMxB;AAAAA,MACbiB,SAAAA;AAAAA,IAAAA,CACD;AAAA,IACD2G,sBAAsBhB,EAAuC;AAAA,MAC3D9G,WAAW0B,EAAM1B;AAAAA,MACjBE,OAAOwB,EAAMxB;AAAAA,MACbiB,SAAAA;AAAAA,IAAAA,CACD;AAAA,EAAA;AAEL;"}
|
package/dist/testing.d.ts
CHANGED
|
@@ -153,6 +153,7 @@ declare interface CommandParamDescriptor {
|
|
|
153
153
|
declare interface CommandParamOption {
|
|
154
154
|
label: string;
|
|
155
155
|
value: string;
|
|
156
|
+
icon?: string;
|
|
156
157
|
}
|
|
157
158
|
|
|
158
159
|
declare type CommandParamSchema = Record<string, CommandParamDescriptor>;
|
|
@@ -342,7 +343,7 @@ declare interface DataTableRendererContribution {
|
|
|
342
343
|
emptyDescription?: string;
|
|
343
344
|
executeQuery(context: DataTableRendererQueryContext): Promise<DataTableRendererQueryResult> | DataTableRendererQueryResult;
|
|
344
345
|
subscribe?: (listener: () => void) => Disposable_2 | (() => void);
|
|
345
|
-
|
|
346
|
+
onRowActivate?: (row: DataTableRendererRow) => Promise<void> | void;
|
|
346
347
|
}
|
|
347
348
|
|
|
348
349
|
declare type DataTableRendererImplementation = (input: WorkbenchPanelRenderInput & {
|
|
@@ -473,6 +474,8 @@ declare interface FileRendererContent {
|
|
|
473
474
|
content?: string;
|
|
474
475
|
dataUrl?: string;
|
|
475
476
|
placeholder?: string;
|
|
477
|
+
/** Ordered backing-store revision when one is available. */
|
|
478
|
+
revision?: string;
|
|
476
479
|
}
|
|
477
480
|
|
|
478
481
|
declare interface FileRendererContribution {
|
|
@@ -482,35 +485,53 @@ declare interface FileRendererContribution {
|
|
|
482
485
|
/** Resolve the file's content (and identity) for the bound resource. */
|
|
483
486
|
load(resource: ResourceRef | undefined): Promise<FileRendererContent> | FileRendererContent;
|
|
484
487
|
/** Persist edited text. Absent ⇒ read-only. Never called for images. */
|
|
485
|
-
save?(resource: ResourceRef | undefined, content: string): Promise<
|
|
488
|
+
save?(resource: ResourceRef | undefined, content: string, origin?: FileRendererRefreshOrigin): Promise<FileRendererSaveResult | undefined> | FileRendererSaveResult | void;
|
|
486
489
|
}
|
|
487
490
|
|
|
488
491
|
declare type FileRendererImplementation = (input: WorkbenchPanelRenderInput & {
|
|
489
492
|
fileRendererId: string;
|
|
490
493
|
}) => unknown;
|
|
491
494
|
|
|
492
|
-
declare interface
|
|
495
|
+
declare interface FileRendererRefreshEnvelope {
|
|
496
|
+
resourceUri?: string;
|
|
497
|
+
origin?: FileRendererRefreshOrigin;
|
|
498
|
+
revision?: string;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
declare interface FileRendererRefreshEvent extends FileRendererRefreshEnvelope {
|
|
493
502
|
fileRendererId: string;
|
|
494
503
|
}
|
|
495
504
|
|
|
496
505
|
declare type FileRendererRefreshListener = (event: FileRendererRefreshEvent) => void;
|
|
497
506
|
|
|
507
|
+
declare interface FileRendererRefreshOrigin {
|
|
508
|
+
rendererId: string;
|
|
509
|
+
instanceId: string;
|
|
510
|
+
operationId: string;
|
|
511
|
+
}
|
|
512
|
+
|
|
498
513
|
declare interface FileRendererRegistry {
|
|
499
514
|
fileRendererStore: WorkbenchStore<FileRendererStoreState>;
|
|
500
515
|
registerFileRenderer(contribution: FileRendererContribution, metadata?: ContributionMetadata): Disposable_2;
|
|
501
516
|
setFileRendererImplementation(impl: FileRendererImplementation): void;
|
|
502
517
|
getFileRenderer(id: string): RegisteredFileRendererContribution | undefined;
|
|
503
518
|
listFileRenderers(): RegisteredFileRendererContribution[];
|
|
504
|
-
refreshFileRenderer(id: string): void;
|
|
519
|
+
refreshFileRenderer(id: string, event?: FileRendererRefreshEnvelope): void;
|
|
505
520
|
onDidRefreshFileRenderer(listener: FileRendererRefreshListener): Disposable_2;
|
|
506
521
|
}
|
|
507
522
|
|
|
523
|
+
declare interface FileRendererSaveResult {
|
|
524
|
+
revision?: string;
|
|
525
|
+
}
|
|
526
|
+
|
|
508
527
|
declare interface FileRendererStoreState {
|
|
509
528
|
renderers: Record<string, RegisteredFileRendererContribution>;
|
|
510
529
|
}
|
|
511
530
|
|
|
512
531
|
declare interface HistoryController {
|
|
513
532
|
store: WorkbenchStore<HistoryStoreState>;
|
|
533
|
+
/** Snapshot the history for a compound navigation; the returned function restores it. */
|
|
534
|
+
createCheckpoint(): () => void;
|
|
514
535
|
goBack(): HistoryEntry | undefined;
|
|
515
536
|
goForward(): HistoryEntry | undefined;
|
|
516
537
|
goPrevious(): HistoryEntry | undefined;
|
|
@@ -536,6 +557,8 @@ declare interface KanbanRendererContribution<TRow extends KanbanRendererRow = Ka
|
|
|
536
557
|
id: string;
|
|
537
558
|
title: string;
|
|
538
559
|
resourceKind?: string;
|
|
560
|
+
/** Host-owned scope for persisted display settings. */
|
|
561
|
+
storageScope?: string;
|
|
539
562
|
/**
|
|
540
563
|
* Declarative attribute schema. The renderer dispatches filter / group /
|
|
541
564
|
* sort / display / inline-edit behavior on each descriptor's `type.kind`.
|
|
@@ -563,8 +586,8 @@ declare interface KanbanRendererContribution<TRow extends KanbanRendererRow = Ka
|
|
|
563
586
|
*/
|
|
564
587
|
executeQuery(state: KanbanRendererQueryState): Promise<TRow[]> | TRow[];
|
|
565
588
|
subscribe?: (listener: () => void) => Disposable_2 | (() => void);
|
|
566
|
-
/** Row
|
|
567
|
-
|
|
589
|
+
/** Row activation surfaced by the renderer (mirrored from <KanbanRenderer>). */
|
|
590
|
+
onRowActivate?: (row: TRow) => Promise<void> | void;
|
|
568
591
|
/** Per-row right-click context menu actions (mirrored from <KanbanRenderer>). */
|
|
569
592
|
getRowContextMenuActions?: (row: TRow) => ResourceContextAction[];
|
|
570
593
|
/**
|
|
@@ -658,7 +681,7 @@ declare interface KanbanRendererRow {
|
|
|
658
681
|
title: string;
|
|
659
682
|
/**
|
|
660
683
|
* Optional navigation handle. When set, the renderer's default click handler
|
|
661
|
-
* routes through the contribution's
|
|
684
|
+
* routes through the contribution's onRowActivate (which typically opens the
|
|
662
685
|
* resource via the workbench).
|
|
663
686
|
*/
|
|
664
687
|
resource?: unknown;
|
|
@@ -763,6 +786,16 @@ declare interface LayoutModel {
|
|
|
763
786
|
carryRegionState?: readonly WorkbenchRegion[];
|
|
764
787
|
}): void;
|
|
765
788
|
getPersistenceScope(): LayoutScope | undefined;
|
|
789
|
+
/** True when the current persistence scope already stores a layout. A new scope returns false. */
|
|
790
|
+
/** Whether anything is stored for the active scope right now. */
|
|
791
|
+
hasPersistedLayout(): boolean;
|
|
792
|
+
/**
|
|
793
|
+
* Whether the active scope was entered with a layout the user already had. Unlike
|
|
794
|
+
* `hasPersistedLayout`, writes made while entering a mode do not change the answer.
|
|
795
|
+
*/
|
|
796
|
+
enteredWithPersistedLayout(): boolean;
|
|
797
|
+
/** Moves owned panel menus beside their owner's current region and removes orphan menus. */
|
|
798
|
+
reconcilePanelMenus(): void;
|
|
766
799
|
onWillChangePersistenceScope(listener: (scope: LayoutScope | undefined) => void): {
|
|
767
800
|
dispose(): void;
|
|
768
801
|
};
|
|
@@ -875,6 +908,7 @@ declare interface OpenWidgetInput {
|
|
|
875
908
|
resource?: ResourceRef;
|
|
876
909
|
title?: string;
|
|
877
910
|
region?: WorkbenchRegion;
|
|
911
|
+
role?: WorkbenchWidgetRole;
|
|
878
912
|
ownerId?: string;
|
|
879
913
|
source?: ContributionSource;
|
|
880
914
|
pinned?: boolean;
|
|
@@ -892,7 +926,9 @@ declare interface OpenWorkbenchPanelInput {
|
|
|
892
926
|
resource?: ResourceRef;
|
|
893
927
|
title?: string;
|
|
894
928
|
region?: WorkbenchRegion;
|
|
929
|
+
role?: WorkbenchWidgetRole;
|
|
895
930
|
pinned?: boolean;
|
|
931
|
+
closable?: boolean;
|
|
896
932
|
mountStrategy?: WorkbenchPanelMountStrategy;
|
|
897
933
|
hiddenByDefault?: boolean;
|
|
898
934
|
tab?: WorkbenchPanelTab;
|
|
@@ -1006,7 +1042,6 @@ declare type RegisteredWidgetContribution = Omit<WidgetContribution, "priority"
|
|
|
1006
1042
|
ownedPanelMenuIds?: readonly string[];
|
|
1007
1043
|
singleton: boolean;
|
|
1008
1044
|
reuse: WidgetReusePolicy;
|
|
1009
|
-
role: WorkbenchWidgetRole;
|
|
1010
1045
|
} & RegisteredContributionMetadata;
|
|
1011
1046
|
|
|
1012
1047
|
declare interface RegisteredWorkbenchNotification extends RegisteredContributionMetadata {
|
|
@@ -1044,6 +1079,14 @@ declare interface ResourceContextAction {
|
|
|
1044
1079
|
separatorBefore?: boolean;
|
|
1045
1080
|
}
|
|
1046
1081
|
|
|
1082
|
+
declare interface ResourceHierarchyCycle {
|
|
1083
|
+
code: typeof resourceHierarchyCycleCode;
|
|
1084
|
+
path: ResourceRef[];
|
|
1085
|
+
repeatedUri: string;
|
|
1086
|
+
}
|
|
1087
|
+
|
|
1088
|
+
declare const resourceHierarchyCycleCode = "resource_hierarchy_cycle";
|
|
1089
|
+
|
|
1047
1090
|
declare interface ResourceHierarchyProvider {
|
|
1048
1091
|
id: string;
|
|
1049
1092
|
priority?: number;
|
|
@@ -1116,6 +1159,7 @@ declare interface ResourceRegistry {
|
|
|
1116
1159
|
registerHierarchyProvider(provider: ResourceHierarchyProvider): Disposable_2;
|
|
1117
1160
|
listHierarchyProviders(): ResolvedResourceHierarchyProvider[];
|
|
1118
1161
|
walkHierarchy(resource: ResourceRef | undefined): ResourceRef[];
|
|
1162
|
+
onDidDetectHierarchyCycle(listener: (cycle: ResourceHierarchyCycle) => void): Disposable_2;
|
|
1119
1163
|
isOpeningResource(): boolean;
|
|
1120
1164
|
openResource(resource: ResourceRef, input?: OpenResourceInput): Promise<WorkbenchPanelInstance>;
|
|
1121
1165
|
onDidOpenResource(listener: (resource: ResourceRef) => void): Disposable_2;
|
|
@@ -1395,6 +1439,7 @@ declare interface WidgetContribution {
|
|
|
1395
1439
|
mountStrategy?: WidgetMountStrategy;
|
|
1396
1440
|
closable?: boolean;
|
|
1397
1441
|
hiddenByDefault?: boolean;
|
|
1442
|
+
subPanelsOnly?: boolean;
|
|
1398
1443
|
regionSize?: WorkbenchRegionSize;
|
|
1399
1444
|
regionCollapsible?: boolean;
|
|
1400
1445
|
headerBorderBottom?: boolean;
|
|
@@ -1403,7 +1448,6 @@ declare interface WidgetContribution {
|
|
|
1403
1448
|
priority?: number;
|
|
1404
1449
|
rendererId: string;
|
|
1405
1450
|
openCommandId?: string;
|
|
1406
|
-
role?: WorkbenchWidgetRole;
|
|
1407
1451
|
eligibleLocations?: WorkbenchLocationEligibility;
|
|
1408
1452
|
panelMenuOwner?: WorkbenchPanelMenuOwner;
|
|
1409
1453
|
tab?: WorkbenchWidgetTab;
|
|
@@ -1503,6 +1547,20 @@ declare interface WorkbenchCommandParamsRequest {
|
|
|
1503
1547
|
context?: WorkbenchCommandExecutionContext;
|
|
1504
1548
|
}
|
|
1505
1549
|
|
|
1550
|
+
declare interface WorkbenchCompositionAddablePanel extends WorkbenchModeAddablePanel {
|
|
1551
|
+
contribution: RegisteredWidgetContribution;
|
|
1552
|
+
}
|
|
1553
|
+
|
|
1554
|
+
declare interface WorkbenchCompositionController {
|
|
1555
|
+
panelsFor(region: WorkbenchPanelRegion): WorkbenchCompositionRegionPanels;
|
|
1556
|
+
}
|
|
1557
|
+
|
|
1558
|
+
declare interface WorkbenchCompositionRegionPanels {
|
|
1559
|
+
open: readonly WorkbenchWidgetPlacement[];
|
|
1560
|
+
addable: readonly WorkbenchCompositionAddablePanel[];
|
|
1561
|
+
closable: readonly string[];
|
|
1562
|
+
}
|
|
1563
|
+
|
|
1506
1564
|
declare interface WorkbenchCore extends WorkbenchCoreContributionContext {
|
|
1507
1565
|
host: WorkbenchHost;
|
|
1508
1566
|
registerModule(module: WorkbenchModuleContribution): Disposable_2;
|
|
@@ -1514,6 +1572,7 @@ declare interface WorkbenchCoreContributionContext {
|
|
|
1514
1572
|
commandPalette: WorkbenchCommandPaletteController;
|
|
1515
1573
|
commandPaletteResources: CommandPaletteResourceRegistry;
|
|
1516
1574
|
commands: CommandRegistry;
|
|
1575
|
+
composition: WorkbenchCompositionController;
|
|
1517
1576
|
context: ContextKeyService;
|
|
1518
1577
|
focus: WorkbenchFocusController;
|
|
1519
1578
|
history: HistoryController;
|
|
@@ -1522,6 +1581,7 @@ declare interface WorkbenchCoreContributionContext {
|
|
|
1522
1581
|
layout: WorkbenchLayoutModel;
|
|
1523
1582
|
modes: WorkbenchModeRegistry;
|
|
1524
1583
|
navigation: NavigationRegistry;
|
|
1584
|
+
navigator: WorkbenchNavigator;
|
|
1525
1585
|
notifications: NotificationRegistry;
|
|
1526
1586
|
panels: WorkbenchPanelsController;
|
|
1527
1587
|
preferences: PreferenceRegistry;
|
|
@@ -1594,7 +1654,7 @@ declare interface WorkbenchLayoutStoreState {
|
|
|
1594
1654
|
placeholders: Partial<Record<WorkbenchRegion, RegisteredPlaceholderContribution>>;
|
|
1595
1655
|
}
|
|
1596
1656
|
|
|
1597
|
-
declare type WorkbenchLocationContribution =
|
|
1657
|
+
declare type WorkbenchLocationContribution = WidgetContribution & WorkbenchPanelMenusContribution;
|
|
1598
1658
|
|
|
1599
1659
|
declare interface WorkbenchLocationEligibility {
|
|
1600
1660
|
modeIds?: string[];
|
|
@@ -1616,15 +1676,31 @@ declare type WorkbenchModeActivationContext = WorkbenchCoreContributionContext;
|
|
|
1616
1676
|
|
|
1617
1677
|
declare type WorkbenchModeActivationResult = Disposable_2 | readonly Disposable_2[] | undefined;
|
|
1618
1678
|
|
|
1679
|
+
declare interface WorkbenchModeAddablePanel {
|
|
1680
|
+
panelId: string;
|
|
1681
|
+
region: WorkbenchPanelRegion;
|
|
1682
|
+
allowedRegions?: readonly WorkbenchRegion[];
|
|
1683
|
+
pinned?: boolean;
|
|
1684
|
+
}
|
|
1685
|
+
|
|
1686
|
+
declare interface WorkbenchModeAddablePanelContext {
|
|
1687
|
+
layout: WorkbenchLayout;
|
|
1688
|
+
resource?: ResourceRef;
|
|
1689
|
+
}
|
|
1690
|
+
|
|
1619
1691
|
declare type WorkbenchModeChangeListener = () => void;
|
|
1620
1692
|
|
|
1621
1693
|
declare interface WorkbenchModeContribution {
|
|
1622
1694
|
id: string;
|
|
1623
1695
|
label?: string;
|
|
1624
1696
|
panels?: readonly WorkbenchPanelRegion[];
|
|
1697
|
+
resourceKinds?: readonly string[];
|
|
1698
|
+
defaultResource?: ResourceRef | (() => Promise<ResourceRef | undefined> | ResourceRef | undefined);
|
|
1699
|
+
listAddablePanels?(context: WorkbenchModeAddablePanelContext): readonly WorkbenchModeAddablePanel[];
|
|
1625
1700
|
activate(ctx: WorkbenchModeActivationContext): WorkbenchModeActivationResult;
|
|
1626
1701
|
seed?(ctx: WorkbenchModeActivationContext): void;
|
|
1627
1702
|
enter?(ctx: WorkbenchModeActivationContext): WorkbenchModeActivationResult;
|
|
1703
|
+
reconcile?(ctx: WorkbenchModeActivationContext): void;
|
|
1628
1704
|
}
|
|
1629
1705
|
|
|
1630
1706
|
declare interface WorkbenchModeRegistry {
|
|
@@ -1660,6 +1736,14 @@ declare interface WorkbenchModuleContribution {
|
|
|
1660
1736
|
|
|
1661
1737
|
declare type WorkbenchModuleContributionContext = WorkbenchModuleContext;
|
|
1662
1738
|
|
|
1739
|
+
declare interface WorkbenchNavigationCommit {
|
|
1740
|
+
modeId: string | undefined;
|
|
1741
|
+
resource: ResourceRef | undefined;
|
|
1742
|
+
replaceActive: boolean;
|
|
1743
|
+
}
|
|
1744
|
+
|
|
1745
|
+
declare type WorkbenchNavigationDiagnosticCode = "navigation_mode_missing" | "navigation_resource_missing" | "navigation_resource_incompatible" | "navigation_default_missing" | "navigation_target_stale";
|
|
1746
|
+
|
|
1663
1747
|
declare interface WorkbenchNavigationEntry {
|
|
1664
1748
|
entryId: string;
|
|
1665
1749
|
recordedAt: number;
|
|
@@ -1674,6 +1758,53 @@ declare interface WorkbenchNavigationEntry {
|
|
|
1674
1758
|
closedSubPanel?: WorkbenchClosedSubPanel;
|
|
1675
1759
|
}
|
|
1676
1760
|
|
|
1761
|
+
declare type WorkbenchNavigationResult = {
|
|
1762
|
+
ok: true;
|
|
1763
|
+
modeId: string | undefined;
|
|
1764
|
+
resource: ResourceRef | undefined;
|
|
1765
|
+
} | {
|
|
1766
|
+
ok: false;
|
|
1767
|
+
code: WorkbenchNavigationDiagnosticCode;
|
|
1768
|
+
message: string;
|
|
1769
|
+
};
|
|
1770
|
+
|
|
1771
|
+
declare interface WorkbenchNavigationTarget {
|
|
1772
|
+
modeId?: string;
|
|
1773
|
+
resource?: ResourceRef;
|
|
1774
|
+
replaceActive?: boolean;
|
|
1775
|
+
}
|
|
1776
|
+
|
|
1777
|
+
declare interface WorkbenchNavigator {
|
|
1778
|
+
configure(hooks: WorkbenchNavigatorHostHooks): void;
|
|
1779
|
+
getSelectedResource(): ResourceRef | undefined;
|
|
1780
|
+
open(target: WorkbenchNavigationTarget): Promise<WorkbenchNavigationResult>;
|
|
1781
|
+
commitContext(input: WorkbenchNavigatorCommitInput): WorkbenchNavigationResult;
|
|
1782
|
+
getLastResource(projectId: string | undefined, modeId: string): ResourceRef | undefined;
|
|
1783
|
+
forgetResource(uri: string): void;
|
|
1784
|
+
onDidCommit(listener: (commit: WorkbenchNavigationCommit) => void): {
|
|
1785
|
+
dispose(): void;
|
|
1786
|
+
};
|
|
1787
|
+
}
|
|
1788
|
+
|
|
1789
|
+
declare interface WorkbenchNavigatorCommitInput {
|
|
1790
|
+
modeId?: string | null;
|
|
1791
|
+
resource?: ResourceRef | null;
|
|
1792
|
+
replaceActive?: boolean;
|
|
1793
|
+
present?: boolean;
|
|
1794
|
+
}
|
|
1795
|
+
|
|
1796
|
+
declare interface WorkbenchNavigatorHostHooks {
|
|
1797
|
+
getProjectId?(): string | undefined;
|
|
1798
|
+
getSelectedResource?(): ResourceRef | undefined;
|
|
1799
|
+
interpretSelection?(resource: ResourceRef): ResourceRef | undefined;
|
|
1800
|
+
applySelection?(resource: ResourceRef | undefined): void;
|
|
1801
|
+
applyScope?(commit: WorkbenchNavigationCommit): void;
|
|
1802
|
+
applyBreadcrumb?(resource: ResourceRef | undefined): void;
|
|
1803
|
+
presentResource?(resource: ResourceRef, input: {
|
|
1804
|
+
replaceActive: boolean;
|
|
1805
|
+
}): Promise<unknown> | unknown;
|
|
1806
|
+
}
|
|
1807
|
+
|
|
1677
1808
|
declare interface WorkbenchNotification {
|
|
1678
1809
|
id?: string;
|
|
1679
1810
|
level: WorkbenchNotificationLevel;
|
|
@@ -1715,11 +1846,11 @@ declare interface WorkbenchPanelContribution {
|
|
|
1715
1846
|
region: WorkbenchRegion;
|
|
1716
1847
|
fallbackRegion?: WorkbenchRegion;
|
|
1717
1848
|
rendererId: string;
|
|
1718
|
-
closable: boolean;
|
|
1719
1849
|
singleton?: boolean;
|
|
1720
1850
|
reuse?: WorkbenchPanelReusePolicy;
|
|
1721
1851
|
mountStrategy?: WorkbenchPanelMountStrategy;
|
|
1722
1852
|
hiddenByDefault?: boolean;
|
|
1853
|
+
subPanelsOnly?: boolean;
|
|
1723
1854
|
regionSize?: WorkbenchRegionSize;
|
|
1724
1855
|
regionCollapsible?: boolean;
|
|
1725
1856
|
headerBorderBottom?: boolean;
|
|
@@ -1770,7 +1901,7 @@ declare interface WorkbenchPanelInstance_2 {
|
|
|
1770
1901
|
tab?: WorkbenchPanelTab_2;
|
|
1771
1902
|
}
|
|
1772
1903
|
|
|
1773
|
-
declare type WorkbenchPanelMenuContribution = Omit<WidgetContribution, "region" | "fallbackRegion"
|
|
1904
|
+
declare type WorkbenchPanelMenuContribution = Omit<WidgetContribution, "region" | "fallbackRegion"> & {
|
|
1774
1905
|
region: WorkbenchPanelMenuRegion;
|
|
1775
1906
|
fallbackRegion?: WorkbenchPanelMenuRegion;
|
|
1776
1907
|
};
|
|
@@ -1828,13 +1959,14 @@ declare type WorkbenchPanelMountStrategy = WidgetMountStrategy;
|
|
|
1828
1959
|
declare type WorkbenchPanelMountStrategy_2 = WidgetMountStrategy_2;
|
|
1829
1960
|
|
|
1830
1961
|
declare type WorkbenchPanelOpenStrategy = {
|
|
1831
|
-
kind: "
|
|
1962
|
+
kind: "persistent";
|
|
1832
1963
|
position?: WorkbenchTabPosition;
|
|
1833
1964
|
} | {
|
|
1834
1965
|
kind: "replace-active";
|
|
1835
1966
|
} | {
|
|
1836
1967
|
kind: "replace-panel";
|
|
1837
1968
|
instanceId: string;
|
|
1969
|
+
retention?: WorkbenchTabRetention;
|
|
1838
1970
|
} | {
|
|
1839
1971
|
kind: "preview";
|
|
1840
1972
|
position?: WorkbenchTabPosition;
|
|
@@ -1975,7 +2107,7 @@ declare type WorkbenchStoreSelector<TState, TValue> = (state: TState) => TValue;
|
|
|
1975
2107
|
|
|
1976
2108
|
declare type WorkbenchStoreSelectorListener<TValue> = (value: TValue, previousValue: TValue) => void;
|
|
1977
2109
|
|
|
1978
|
-
declare type WorkbenchSubPanelContribution = Omit<WidgetContribution, "region" | "fallbackRegion"
|
|
2110
|
+
declare type WorkbenchSubPanelContribution = Omit<WidgetContribution, "region" | "fallbackRegion"> & {
|
|
1979
2111
|
region: WorkbenchPanelRegion;
|
|
1980
2112
|
fallbackRegion?: WorkbenchPanelRegion;
|
|
1981
2113
|
} & WorkbenchPanelMenusContribution;
|
package/dist/webview-runtime.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const r = '// Generated by packages/pstdio-extensions/scripts/build-runtime.ts\nfunction d(){let P=globalThis;if(P.window!==void 0&&P.document!==void 0)return"browser";if(P.WorkerGlobalScope!==void 0&&P.self!==void 0&&P.self instanceof P.WorkerGlobalScope||P.window===void 0&&P.self!==void 0&&typeof P.importScripts=="function")return"worker";let G=P.process;if(G&&typeof G=="object"){let R=G.versions??{},J=G.release?.name;if(R.bun||J==="bun"||P.Bun!==void 0)return"bun";if(R.node&&J==="node")return"node"}return P.Bun===void 0?"browser":"bun"}function V(){return d()}function b(){return V()==="worker"}function x(){let P=V();return P==="node"||P==="bun"}function u(){return window.self!==window.top}function p(P){let G={};return function R(J,X=""){Object.keys(J).forEach((Q)=>{let K=X?`${X}.${Q}`:Q;J[Q]===Object(J[Q])&&R(J[Q],K),typeof J[Q]=="function"&&(G[K]=J[Q],delete J[Q])})}(P),G}function i(P){return!P||P==="null"?"*":P}function l(P,G,R){if(!P||typeof P!="object")return P;let J=Array.isArray(G)?G:G.split(".").map((Q)=>Q.match(/^\\d+$/)?Number(Q):Q),X=P;for(let Q=0;Q<J.length;Q++){let K=J[Q];Q===J.length-1?X[K]=R:((!X[K]||typeof X[K]!="object")&&(X[K]=typeof J[Q+1]=="number"?[]:{}),X=X[K])}return P}function r(P=10){let G="";for(let R=0;R<P;R++)G+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".charAt(Math.floor(Math.random()*62));return G}var E=V(),_=null;if(E==="node"||E==="bun")try{let P=globalThis.require;_=P?.("node:worker_threads")?.parentPort??null}catch{}function s(){if(x())return _;if(b())return self;if(u())return window.parent;throw Error("No valid target found for postMessage")}function D(P,G,R,J){if(!P)throw Error("Rimless Error: No target specified for postMessage");if(x()&&P===_){P.postMessage(G,{transfer:J});return}if(b()){P.postMessage(G,{transfer:J});return}if(P.postMessage){P.postMessage(G,{targetOrigin:i(R),transfer:J});return}throw Error("Rimless Error: Invalid target for postMessage")}function S(P){return _!==null&&P===_}function j(P,G,R){S(P)?P.on(G,R):("addEventListener"in P)&&P.addEventListener(G,R)}function H(P,G,R){S(P)?P.off(G,R):("removeEventListener"in P)&&P.removeEventListener(G,R)}function w(P){return P.data||P}var
|
|
1
|
+
const r = '// Generated by packages/pstdio-extensions/scripts/build-runtime.ts\nfunction d(){let P=globalThis;if(P.window!==void 0&&P.document!==void 0)return"browser";if(P.WorkerGlobalScope!==void 0&&P.self!==void 0&&P.self instanceof P.WorkerGlobalScope||P.window===void 0&&P.self!==void 0&&typeof P.importScripts=="function")return"worker";let G=P.process;if(G&&typeof G=="object"){let R=G.versions??{},J=G.release?.name;if(R.bun||J==="bun"||P.Bun!==void 0)return"bun";if(R.node&&J==="node")return"node"}return P.Bun===void 0?"browser":"bun"}function V(){return d()}function b(){return V()==="worker"}function x(){let P=V();return P==="node"||P==="bun"}function u(){return window.self!==window.top}function p(P){let G={};return function R(J,X=""){Object.keys(J).forEach((Q)=>{let K=X?`${X}.${Q}`:Q;J[Q]===Object(J[Q])&&R(J[Q],K),typeof J[Q]=="function"&&(G[K]=J[Q],delete J[Q])})}(P),G}function i(P){return!P||P==="null"?"*":P}function l(P,G,R){if(!P||typeof P!="object")return P;let J=Array.isArray(G)?G:G.split(".").map((Q)=>Q.match(/^\\d+$/)?Number(Q):Q),X=P;for(let Q=0;Q<J.length;Q++){let K=J[Q];Q===J.length-1?X[K]=R:((!X[K]||typeof X[K]!="object")&&(X[K]=typeof J[Q+1]=="number"?[]:{}),X=X[K])}return P}function r(P=10){let G="";for(let R=0;R<P;R++)G+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".charAt(Math.floor(Math.random()*62));return G}var E=V(),_=null;if(E==="node"||E==="bun")try{let P=globalThis.require;_=P?.("node:worker_threads")?.parentPort??null}catch{}function s(){if(x())return _;if(b())return self;if(u())return window.parent;throw Error("No valid target found for postMessage")}function D(P,G,R,J){if(!P)throw Error("Rimless Error: No target specified for postMessage");if(x()&&P===_){P.postMessage(G,{transfer:J});return}if(b()){P.postMessage(G,{transfer:J});return}if(P.postMessage){P.postMessage(G,{targetOrigin:i(R),transfer:J});return}throw Error("Rimless Error: Invalid target for postMessage")}function S(P){return _!==null&&P===_}function j(P,G,R){S(P)?P.on(G,R):("addEventListener"in P)&&P.addEventListener(G,R)}function H(P,G,R){S(P)?P.off(G,R):("removeEventListener"in P)&&P.removeEventListener(G,R)}function w(P){return P.data||P}var L=function(P){return P.MESSAGE="message",P}({}),M=function(P){return P.HANDSHAKE_REQUEST="RIMLESS/HANDSHAKE_REQUEST",P.HANDSHAKE_REPLY="RIMLESS/HANDSHAKE_REPLY",P.RPC_REQUEST="RIMLESS/RPC_REQUEST",P.RPC_RESOLVE="RIMLESS/RPC_RESOLVE",P.RPC_REJECT="RIMLESS/RPC_REJECT",P}({}),A=Symbol();function o(P={},G,R,J,X){let Q=[];for(let[K,Z]of Object.entries(P)){async function Y(B){let{action:N,callID:q,connectionID:$,callName:O,args:U=[]}=w(B);if(N!==M.RPC_REQUEST||!q||!O||O!==K||$!==G)return;let F={action:M.RPC_RESOLVE,callID:q,callName:O,connectionID:$,error:null,result:null},T;try{F.result=await Z(...U,X),F.result?.[A]&&(T=F.result[A]??[],delete F.result[A])}catch(C){F.action=M.RPC_REJECT,F.error=JSON.parse(JSON.stringify(C,Object.getOwnPropertyNames(C)))}D(J,F,B?.origin,T)}j(R,L.MESSAGE,Y),Q.push(()=>H(R,L.MESSAGE,Y))}return()=>Q.forEach((K)=>K())}function t(P,G,R,J=[],X,Q){return(...K)=>new Promise((Z,Y)=>{let B=r();function N(O){let{callID:U,connectionID:F,callName:T,result:C,error:v,action:I}=w(O);if(!(!U||!T)&&T===P&&U===B&&F===G){if(I===M.RPC_RESOLVE)return Z(C);if(I===M.RPC_REJECT)return Y(v)}}let q={action:M.RPC_REQUEST,args:K,callID:B,callName:P,connectionID:G},$=K.reduce((O,U)=>U[A]?.length?O.concat(U[A]):O,K[A]??[]);j(X,L.MESSAGE,N),J.push(()=>H(X,L.MESSAGE,N)),D(Q,q,R?.origin,$)})}function a(P={},G=[],R,J,X,Q){let K={...P},Z=[];for(let Y of G)l(K,Y,t(Y,R,J,Z,X,Q));return{remote:K,unregisterRemote:()=>Z.forEach((Y)=>Y())}}function n(P={},G){return new Promise(async(R)=>{let J=p(P),X=s(),Q=self||window;async function K(Z){let Y=w(Z);if(Y?.action!==M.HANDSHAKE_REPLY)return;let{remote:B,unregisterRemote:N}=a(Y.schema,Y.methodNames,Y.connectionID,Z,Q,X),q=o(J,Y.connectionID,Q,X,B);return await G?.onConnectionSetup?.(B),D(X,{action:M.HANDSHAKE_REPLY,connectionID:Y.connectionID},Z?.origin),R({remote:B,close:()=>{H(Q,L.MESSAGE,K),N(),q()},id:Y.connectionID})}j(Q,L.MESSAGE,K),D(X,{action:M.HANDSHAKE_REQUEST,methodNames:Object.keys(J),schema:P})})}var f={connect:n};var e=(P)=>typeof P==="object"&&P!==null,y=(P)=>{try{let G=JSON.stringify(P);if(typeof G==="string"&&G.length>0)return G}catch{}try{return String(P)}catch{return"Unknown error"}},k=(P)=>{if(P instanceof Error)return{message:P.message,stack:P.stack};if(typeof P==="string")return{message:P};if(e(P)){let G=typeof P.message==="string"?P.message:null,R=typeof P.stack==="string"?P.stack:void 0;if(G)return R?{message:G,stack:R}:{message:G};return{message:y(P)}}if(P===null||P===void 0)return{message:"Unknown error"};return{message:y(P)}};var z=(P)=>({id:P}),W=(P,G)=>({id:P,kind:G.kind,label:G.label,description:G.description,metadata:G.metadata}),zP={sidenav:W("project.sidenav",{kind:"panel"}),headerPrimary:W("project.headerPrimary",{kind:"menu"}),headerOverflow:W("project.headerOverflow",{kind:"menu"}),settingsPanels:W("project.settingsPanels",{kind:"settings"})},BP={headerPrimary:W("session.headerPrimary",{kind:"menu"}),headerOverflow:W("session.headerOverflow",{kind:"menu"}),transcriptActions:W("session.transcriptActions",{kind:"menu"})},WP={headerPrimary:W("workspace.headerPrimary",{kind:"menu"}),headerOverflow:W("workspace.headerOverflow",{kind:"menu"}),sidenav:W("workspace.sidenav",{kind:"panel"})},qP={opened:z("project.opened")},FP={started:z("session.started"),resumed:z("session.resumed"),awaitingInput:z("session.awaitingInput"),succeeded:z("session.succeeded"),failed:z("session.failed"),completed:z("session.completed")},MP={created:z("workspace.created"),provision:z("workspace.provision"),ready:z("workspace.ready"),archived:z("workspace.archived"),deleted:z("workspace.deleted")},NP={removed:z("worktree.removed")},OP={committed:z("git.committed"),rebased:z("git.rebased"),merged:z("git.merged"),conflicted:z("git.conflicted")};var PP=["commands.execute","resource.open","notification.show","notification.action","notification.resolve","notification.dismiss","preferences.get","preferences.set","extension.settings.all","extension.settings.get","extension.settings.set","extension.settings.delete","terminal.session","files.upload","files.list","files.delete"],GP=["host.dispatchKeyboardEvent"],UP=[...PP,...GP];var c=(P,G)=>({call:async(R,J)=>await P({method:R,params:J}),onEvent:G}),g=(P)=>{let G=P,R=new Set;return{get:()=>G,subscribe:(J)=>{return R.add(J),()=>R.delete(J)},set:(J)=>{G=J;for(let X of R)X(G)}}};var h="pstdio-extension-mount",RP=()=>{let P=new Map;return{get length(){return P.size},clear:()=>P.clear(),getItem:(G)=>P.get(G)??null,key:(G)=>Array.from(P.keys())[G]??null,removeItem:(G)=>P.delete(G),setItem:(G,R)=>P.set(G,R)}},JP=()=>{for(let P of["localStorage","sessionStorage"])try{window[P]}catch{Object.defineProperty(window,P,{configurable:!0,value:RP()})}},m=(P,G)=>{let R=document.documentElement,J=P==="dark"?"light":"dark";R.classList.remove(J),R.classList.add(P),R.setAttribute("data-theme",P),R.style.colorScheme=P;for(let[X,Q]of Object.entries(G))if(X.startsWith("--"))R.style.setProperty(X,Q)},KP=(P)=>{for(let G of P){let R=document.createElement("link");R.rel="stylesheet",R.href=G,document.head.appendChild(R)}},QP=()=>{let P=document.getElementById(h);if(!P)P=document.createElement("div"),P.id=h,P.style.height="100%",P.style.width="100%",document.body.appendChild(P);return P},XP=(P)=>P instanceof HTMLInputElement||P instanceof HTMLTextAreaElement||P instanceof HTMLSelectElement||P instanceof HTMLElement&&P.isContentEditable,YP=async()=>{JP();let P=g(void 0),G=new Map,R=(K,Z)=>{let Y=G.get(K)??new Set;return Y.add(Z),G.set(K,Y),()=>{Y.delete(Z)}},J,X=!1,Q=await f.connect({init:async(K)=>{try{m(K.theme,K.themeVariables),KP(K.styles),P.set(K.props);let Z=QP(),Y=await import(K.moduleUrl),B=Y.default??(Y.mount?Y:void 0);if(!B?.mount)throw Error("Extension module does not export a default view (defineExtensionView).");let N=c(($)=>Q.remote.call($),R),q=await B.mount(Z,N,P);if(J=typeof q==="function"?q:void 0,!X)X=!0,document.addEventListener("keydown",($)=>{if(!$.ctrlKey&&!$.metaKey&&!$.altKey)return;if(XP($.target)&&!$.shiftKey)return;Q.remote.call({method:"host.dispatchKeyboardEvent",params:{key:$.key,code:$.code,ctrlKey:$.ctrlKey,metaKey:$.metaKey,altKey:$.altKey,shiftKey:$.shiftKey,repeat:$.repeat}}).catch(()=>{})},!0)}catch(Z){let Y=k(Z);throw Q.remote.runtimeError(Y),Z instanceof Error?Z:Error(Y.message)}},themeUpdate:(K)=>{m(K.theme,K.variables)},propsUpdate:(K)=>{P.set(K.props)},hostEvent:(K)=>{for(let Z of G.get(K.scope)??[])Z(K.payload)}});Q.remote.ready({}),window.addEventListener("beforeunload",()=>{J?.()})};YP();\n', t = "pstdio-extension-mount", o = (e) => e.replaceAll("&", "&").replaceAll('"', """).replaceAll("<", "<"), i = (e) => e.replaceAll("<\/script", "<\\/script").replaceAll("<!--", "<\\!--"), n = (e) => `<!doctype html>
|
|
2
2
|
<html lang="en">
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="utf-8" />
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webview-runtime.js","sources":["../../pstdio-extensions/src/bridge/webview-runtime/runtime.bundle.js?raw","../../pstdio-extensions/src/bridge/webview-runtime/runtime-html.ts","../src/webview-runtime/index.ts"],"sourcesContent":["export default \"// Generated by packages/pstdio-extensions/scripts/build-runtime.ts\\nfunction d(){let P=globalThis;if(P.window!==void 0&&P.document!==void 0)return\\\"browser\\\";if(P.WorkerGlobalScope!==void 0&&P.self!==void 0&&P.self instanceof P.WorkerGlobalScope||P.window===void 0&&P.self!==void 0&&typeof P.importScripts==\\\"function\\\")return\\\"worker\\\";let G=P.process;if(G&&typeof G==\\\"object\\\"){let R=G.versions??{},J=G.release?.name;if(R.bun||J===\\\"bun\\\"||P.Bun!==void 0)return\\\"bun\\\";if(R.node&&J===\\\"node\\\")return\\\"node\\\"}return P.Bun===void 0?\\\"browser\\\":\\\"bun\\\"}function V(){return d()}function b(){return V()===\\\"worker\\\"}function x(){let P=V();return P===\\\"node\\\"||P===\\\"bun\\\"}function u(){return window.self!==window.top}function p(P){let G={};return function R(J,X=\\\"\\\"){Object.keys(J).forEach((Q)=>{let K=X?`${X}.${Q}`:Q;J[Q]===Object(J[Q])&&R(J[Q],K),typeof J[Q]==\\\"function\\\"&&(G[K]=J[Q],delete J[Q])})}(P),G}function i(P){return!P||P===\\\"null\\\"?\\\"*\\\":P}function l(P,G,R){if(!P||typeof P!=\\\"object\\\")return P;let J=Array.isArray(G)?G:G.split(\\\".\\\").map((Q)=>Q.match(/^\\\\d+$/)?Number(Q):Q),X=P;for(let Q=0;Q<J.length;Q++){let K=J[Q];Q===J.length-1?X[K]=R:((!X[K]||typeof X[K]!=\\\"object\\\")&&(X[K]=typeof J[Q+1]==\\\"number\\\"?[]:{}),X=X[K])}return P}function r(P=10){let G=\\\"\\\";for(let R=0;R<P;R++)G+=\\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\\\".charAt(Math.floor(Math.random()*62));return G}var E=V(),_=null;if(E===\\\"node\\\"||E===\\\"bun\\\")try{let P=globalThis.require;_=P?.(\\\"node:worker_threads\\\")?.parentPort??null}catch{}function s(){if(x())return _;if(b())return self;if(u())return window.parent;throw Error(\\\"No valid target found for postMessage\\\")}function D(P,G,R,J){if(!P)throw Error(\\\"Rimless Error: No target specified for postMessage\\\");if(x()&&P===_){P.postMessage(G,{transfer:J});return}if(b()){P.postMessage(G,{transfer:J});return}if(P.postMessage){P.postMessage(G,{targetOrigin:i(R),transfer:J});return}throw Error(\\\"Rimless Error: Invalid target for postMessage\\\")}function S(P){return _!==null&&P===_}function j(P,G,R){S(P)?P.on(G,R):(\\\"addEventListener\\\"in P)&&P.addEventListener(G,R)}function H(P,G,R){S(P)?P.off(G,R):(\\\"removeEventListener\\\"in P)&&P.removeEventListener(G,R)}function w(P){return P.data||P}var N=function(P){return P.MESSAGE=\\\"message\\\",P}({}),M=function(P){return P.HANDSHAKE_REQUEST=\\\"RIMLESS/HANDSHAKE_REQUEST\\\",P.HANDSHAKE_REPLY=\\\"RIMLESS/HANDSHAKE_REPLY\\\",P.RPC_REQUEST=\\\"RIMLESS/RPC_REQUEST\\\",P.RPC_RESOLVE=\\\"RIMLESS/RPC_RESOLVE\\\",P.RPC_REJECT=\\\"RIMLESS/RPC_REJECT\\\",P}({}),L=Symbol();function o(P={},G,R,J,X){let Q=[];for(let[K,Z]of Object.entries(P)){async function Y(B){let{action:O,callID:q,connectionID:$,callName:U,args:A=[]}=w(B);if(O!==M.RPC_REQUEST||!q||!U||U!==K||$!==G)return;let F={action:M.RPC_RESOLVE,callID:q,callName:U,connectionID:$,error:null,result:null},T;try{F.result=await Z(...A,X),F.result?.[L]&&(T=F.result[L]??[],delete F.result[L])}catch(C){F.action=M.RPC_REJECT,F.error=JSON.parse(JSON.stringify(C,Object.getOwnPropertyNames(C)))}D(J,F,B?.origin,T)}j(R,N.MESSAGE,Y),Q.push(()=>H(R,N.MESSAGE,Y))}return()=>Q.forEach((K)=>K())}function t(P,G,R,J=[],X,Q){return(...K)=>new Promise((Z,Y)=>{let B=r();function O(U){let{callID:A,connectionID:F,callName:T,result:C,error:v,action:I}=w(U);if(!(!A||!T)&&T===P&&A===B&&F===G){if(I===M.RPC_RESOLVE)return Z(C);if(I===M.RPC_REJECT)return Y(v)}}let q={action:M.RPC_REQUEST,args:K,callID:B,callName:P,connectionID:G},$=K.reduce((U,A)=>A[L]?.length?U.concat(A[L]):U,K[L]??[]);j(X,N.MESSAGE,O),J.push(()=>H(X,N.MESSAGE,O)),D(Q,q,R?.origin,$)})}function a(P={},G=[],R,J,X,Q){let K={...P},Z=[];for(let Y of G)l(K,Y,t(Y,R,J,Z,X,Q));return{remote:K,unregisterRemote:()=>Z.forEach((Y)=>Y())}}function n(P={},G){return new Promise(async(R)=>{let J=p(P),X=s(),Q=self||window;async function K(Z){let Y=w(Z);if(Y?.action!==M.HANDSHAKE_REPLY)return;let{remote:B,unregisterRemote:O}=a(Y.schema,Y.methodNames,Y.connectionID,Z,Q,X),q=o(J,Y.connectionID,Q,X,B);return await G?.onConnectionSetup?.(B),D(X,{action:M.HANDSHAKE_REPLY,connectionID:Y.connectionID},Z?.origin),R({remote:B,close:()=>{H(Q,N.MESSAGE,K),O(),q()},id:Y.connectionID})}j(Q,N.MESSAGE,K),D(X,{action:M.HANDSHAKE_REQUEST,methodNames:Object.keys(J),schema:P})})}var f={connect:n};var e=(P)=>typeof P===\\\"object\\\"&&P!==null,y=(P)=>{try{let G=JSON.stringify(P);if(typeof G===\\\"string\\\"&&G.length>0)return G}catch{}try{return String(P)}catch{return\\\"Unknown error\\\"}},k=(P)=>{if(P instanceof Error)return{message:P.message,stack:P.stack};if(typeof P===\\\"string\\\")return{message:P};if(e(P)){let G=typeof P.message===\\\"string\\\"?P.message:null,R=typeof P.stack===\\\"string\\\"?P.stack:void 0;if(G)return R?{message:G,stack:R}:{message:G};return{message:y(P)}}if(P===null||P===void 0)return{message:\\\"Unknown error\\\"};return{message:y(P)}};var z=(P)=>({id:P}),W=(P,G)=>({id:P,kind:G.kind,label:G.label,description:G.description,metadata:G.metadata}),zP={sidenav:W(\\\"project.sidenav\\\",{kind:\\\"panel\\\"}),headerPrimary:W(\\\"project.headerPrimary\\\",{kind:\\\"menu\\\"}),headerOverflow:W(\\\"project.headerOverflow\\\",{kind:\\\"menu\\\"}),settingsPanels:W(\\\"project.settingsPanels\\\",{kind:\\\"settings\\\"})},BP={headerPrimary:W(\\\"session.headerPrimary\\\",{kind:\\\"menu\\\"}),headerOverflow:W(\\\"session.headerOverflow\\\",{kind:\\\"menu\\\"}),transcriptActions:W(\\\"session.transcriptActions\\\",{kind:\\\"menu\\\"})},WP={headerPrimary:W(\\\"workspace.headerPrimary\\\",{kind:\\\"menu\\\"}),headerOverflow:W(\\\"workspace.headerOverflow\\\",{kind:\\\"menu\\\"}),sidenav:W(\\\"workspace.sidenav\\\",{kind:\\\"panel\\\"})},qP={opened:z(\\\"project.opened\\\")},FP={started:z(\\\"session.started\\\"),resumed:z(\\\"session.resumed\\\"),awaitingInput:z(\\\"session.awaitingInput\\\"),succeeded:z(\\\"session.succeeded\\\"),failed:z(\\\"session.failed\\\"),completed:z(\\\"session.completed\\\")},MP={created:z(\\\"workspace.created\\\"),provision:z(\\\"workspace.provision\\\"),ready:z(\\\"workspace.ready\\\"),archived:z(\\\"workspace.archived\\\"),deleted:z(\\\"workspace.deleted\\\")},OP={removed:z(\\\"worktree.removed\\\")},UP={committed:z(\\\"git.committed\\\"),rebased:z(\\\"git.rebased\\\"),merged:z(\\\"git.merged\\\"),conflicted:z(\\\"git.conflicted\\\")};var PP=[\\\"commands.execute\\\",\\\"resource.open\\\",\\\"notification.show\\\",\\\"notification.action\\\",\\\"notification.resolve\\\",\\\"notification.dismiss\\\",\\\"preferences.get\\\",\\\"preferences.set\\\",\\\"extension.settings.all\\\",\\\"extension.settings.get\\\",\\\"extension.settings.set\\\",\\\"extension.settings.delete\\\",\\\"terminal.session\\\",\\\"files.upload\\\",\\\"files.list\\\",\\\"files.delete\\\"],GP=[\\\"host.dispatchKeyboardEvent\\\"],AP=[...PP,...GP];var c=(P,G)=>({call:async(R,J)=>await P({method:R,params:J}),onEvent:G}),h=(P)=>{let G=P,R=new Set;return{get:()=>G,subscribe:(J)=>{return R.add(J),()=>R.delete(J)},set:(J)=>{G=J;for(let X of R)X(G)}}};var g=\\\"pstdio-extension-mount\\\",RP=()=>{let P=new Map;return{get length(){return P.size},clear:()=>P.clear(),getItem:(G)=>P.get(G)??null,key:(G)=>Array.from(P.keys())[G]??null,removeItem:(G)=>P.delete(G),setItem:(G,R)=>P.set(G,R)}},JP=()=>{for(let P of[\\\"localStorage\\\",\\\"sessionStorage\\\"])try{window[P]}catch{Object.defineProperty(window,P,{configurable:!0,value:RP()})}},m=(P,G)=>{let R=document.documentElement,J=P===\\\"dark\\\"?\\\"light\\\":\\\"dark\\\";R.classList.remove(J),R.classList.add(P),R.setAttribute(\\\"data-theme\\\",P),R.style.colorScheme=P;for(let[X,Q]of Object.entries(G))if(X.startsWith(\\\"--\\\"))R.style.setProperty(X,Q)},KP=(P)=>{for(let G of P){let R=document.createElement(\\\"link\\\");R.rel=\\\"stylesheet\\\",R.href=G,document.head.appendChild(R)}},QP=()=>{let P=document.getElementById(g);if(!P)P=document.createElement(\\\"div\\\"),P.id=g,P.style.height=\\\"100%\\\",P.style.width=\\\"100%\\\",document.body.appendChild(P);return P},XP=(P)=>P instanceof HTMLInputElement||P instanceof HTMLTextAreaElement||P instanceof HTMLSelectElement||P instanceof HTMLElement&&P.isContentEditable,YP=async()=>{JP();let P=h(void 0),G=new Map,R=(K,Z)=>{let Y=G.get(K)??new Set;return Y.add(Z),G.set(K,Y),()=>{Y.delete(Z)}},J,X=!1,Q=await f.connect({init:async(K)=>{try{m(K.theme,K.themeVariables),KP(K.styles),P.set(K.props);let Z=QP(),Y=await import(K.moduleUrl),B=Y.default??(Y.mount?Y:void 0);if(!B?.mount)throw Error(\\\"Extension module does not export a default view (defineExtensionView).\\\");let O=c(($)=>Q.remote.call($),R),q=await B.mount(Z,O,P);if(J=typeof q===\\\"function\\\"?q:void 0,!X)X=!0,document.addEventListener(\\\"keydown\\\",($)=>{if(!$.ctrlKey&&!$.metaKey&&!$.altKey)return;if(XP($.target)&&!$.shiftKey)return;Q.remote.call({method:\\\"host.dispatchKeyboardEvent\\\",params:{key:$.key,code:$.code,ctrlKey:$.ctrlKey,metaKey:$.metaKey,altKey:$.altKey,shiftKey:$.shiftKey,repeat:$.repeat}}).catch(()=>{})},!0)}catch(Z){let Y=k(Z);throw Q.remote.runtimeError(Y),Z instanceof Error?Z:Error(Y.message)}},themeUpdate:(K)=>{m(K.theme,K.variables)},propsUpdate:(K)=>{P.set(K.props)},hostEvent:(K)=>{for(let Z of G.get(K.scope)??[])Z(K.payload)}});Q.remote.ready({}),window.addEventListener(\\\"beforeunload\\\",()=>{J?.()})};YP();\\n\"","const MOUNT_ID = \"pstdio-extension-mount\";\n\nconst escapeAttribute = (value: string) =>\n value.replaceAll(\"&\", \"&\").replaceAll('\"', \""\").replaceAll(\"<\", \"<\");\n\nconst escapeScriptContent = (value: string) => value.replaceAll(\"</script\", \"<\\\\/script\").replaceAll(\"<!--\", \"<\\\\!--\");\n\nconst renderRuntimeHostDocument = (scriptTag: string) => `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <style>\n html, body {\n height: 100%;\n margin: 0;\n background: transparent;\n }\n body {\n overflow-x: hidden !important;\n overflow-y: auto !important;\n }\n #${MOUNT_ID} {\n height: 100%;\n width: 100%;\n display: block;\n min-height: 0;\n }\n </style>\n </head>\n <body>\n <div id=\"${MOUNT_ID}\"></div>\n ${scriptTag}\n </body>\n</html>\n`;\n\nexport const getExtensionRuntimeScriptUrl = () => new URL(\"./runtime.bundle.js\", import.meta.url).href;\n\nexport const renderExtensionRuntimeHtml = (scriptUrl: string) =>\n renderRuntimeHostDocument(`<script src=\"${escapeAttribute(scriptUrl)}\"></script>`);\n\nexport const renderInlineExtensionRuntimeHtml = (runtimeScript: string) =>\n renderRuntimeHostDocument(`<script>${escapeScriptContent(runtimeScript)}</script>`);\n","import runtimeScript from \"pstdio-extensions/bridge/webview-runtime.bundle.js?raw\";\n\nexport {\n renderExtensionRuntimeHtml,\n renderInlineExtensionRuntimeHtml,\n} from \"pstdio-extensions/bridge/webview-runtime-html\";\n\n// The guest runtime bundle is inlined here so a host app can serve it without\n// depending on the private pstdio-extensions package.\nexport const getExtensionRuntimeScript = () => runtimeScript;\n"],"names":["runtimeScript","MOUNT_ID","escapeAttribute","value","replaceAll","escapeScriptContent","renderRuntimeHostDocument","scriptTag","renderExtensionRuntimeHtml","scriptUrl","renderInlineExtensionRuntimeHtml","getExtensionRuntimeScript"],"mappings":"AAAA,MAAAA,IAAe,q/QCATC,IAAW,0BAEXC,IAAkBA,CAACC,MACvBA,EAAMC,WAAW,KAAK,OAAO,EAAEA,WAAW,KAAK,QAAQ,EAAEA,WAAW,KAAK,MAAM,GAE3EC,IAAsBA,CAACF,MAAkBA,EAAMC,WAAW,aAAY,YAAY,EAAEA,WAAW,QAAQ,QAAQ,GAE/GE,IAA4BA,CAACC,MAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAehDN,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eASFA,CAAQ;AAAA,MACjBM,CAAS;AAAA;AAAA;AAAA,GAOFC,IAA6BA,CAACC,MACzCH,EAA0B,gBAAgBJ,EAAgBO,CAAS,CAAC,cAAa,GAEtEC,IAAmCA,CAACV,MAC/CM,EAA0B,WAAWD,EAAoBL,CAAa,CAAC,YAAW,GClCvEW,IAA4BA,MAAMX;"}
|
|
1
|
+
{"version":3,"file":"webview-runtime.js","sources":["../../pstdio-extensions/src/bridge/webview-runtime/runtime.bundle.js?raw","../../pstdio-extensions/src/bridge/webview-runtime/runtime-html.ts","../src/webview-runtime/index.ts"],"sourcesContent":["export default \"// Generated by packages/pstdio-extensions/scripts/build-runtime.ts\\nfunction d(){let P=globalThis;if(P.window!==void 0&&P.document!==void 0)return\\\"browser\\\";if(P.WorkerGlobalScope!==void 0&&P.self!==void 0&&P.self instanceof P.WorkerGlobalScope||P.window===void 0&&P.self!==void 0&&typeof P.importScripts==\\\"function\\\")return\\\"worker\\\";let G=P.process;if(G&&typeof G==\\\"object\\\"){let R=G.versions??{},J=G.release?.name;if(R.bun||J===\\\"bun\\\"||P.Bun!==void 0)return\\\"bun\\\";if(R.node&&J===\\\"node\\\")return\\\"node\\\"}return P.Bun===void 0?\\\"browser\\\":\\\"bun\\\"}function V(){return d()}function b(){return V()===\\\"worker\\\"}function x(){let P=V();return P===\\\"node\\\"||P===\\\"bun\\\"}function u(){return window.self!==window.top}function p(P){let G={};return function R(J,X=\\\"\\\"){Object.keys(J).forEach((Q)=>{let K=X?`${X}.${Q}`:Q;J[Q]===Object(J[Q])&&R(J[Q],K),typeof J[Q]==\\\"function\\\"&&(G[K]=J[Q],delete J[Q])})}(P),G}function i(P){return!P||P===\\\"null\\\"?\\\"*\\\":P}function l(P,G,R){if(!P||typeof P!=\\\"object\\\")return P;let J=Array.isArray(G)?G:G.split(\\\".\\\").map((Q)=>Q.match(/^\\\\d+$/)?Number(Q):Q),X=P;for(let Q=0;Q<J.length;Q++){let K=J[Q];Q===J.length-1?X[K]=R:((!X[K]||typeof X[K]!=\\\"object\\\")&&(X[K]=typeof J[Q+1]==\\\"number\\\"?[]:{}),X=X[K])}return P}function r(P=10){let G=\\\"\\\";for(let R=0;R<P;R++)G+=\\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\\\".charAt(Math.floor(Math.random()*62));return G}var E=V(),_=null;if(E===\\\"node\\\"||E===\\\"bun\\\")try{let P=globalThis.require;_=P?.(\\\"node:worker_threads\\\")?.parentPort??null}catch{}function s(){if(x())return _;if(b())return self;if(u())return window.parent;throw Error(\\\"No valid target found for postMessage\\\")}function D(P,G,R,J){if(!P)throw Error(\\\"Rimless Error: No target specified for postMessage\\\");if(x()&&P===_){P.postMessage(G,{transfer:J});return}if(b()){P.postMessage(G,{transfer:J});return}if(P.postMessage){P.postMessage(G,{targetOrigin:i(R),transfer:J});return}throw Error(\\\"Rimless Error: Invalid target for postMessage\\\")}function S(P){return _!==null&&P===_}function j(P,G,R){S(P)?P.on(G,R):(\\\"addEventListener\\\"in P)&&P.addEventListener(G,R)}function H(P,G,R){S(P)?P.off(G,R):(\\\"removeEventListener\\\"in P)&&P.removeEventListener(G,R)}function w(P){return P.data||P}var L=function(P){return P.MESSAGE=\\\"message\\\",P}({}),M=function(P){return P.HANDSHAKE_REQUEST=\\\"RIMLESS/HANDSHAKE_REQUEST\\\",P.HANDSHAKE_REPLY=\\\"RIMLESS/HANDSHAKE_REPLY\\\",P.RPC_REQUEST=\\\"RIMLESS/RPC_REQUEST\\\",P.RPC_RESOLVE=\\\"RIMLESS/RPC_RESOLVE\\\",P.RPC_REJECT=\\\"RIMLESS/RPC_REJECT\\\",P}({}),A=Symbol();function o(P={},G,R,J,X){let Q=[];for(let[K,Z]of Object.entries(P)){async function Y(B){let{action:N,callID:q,connectionID:$,callName:O,args:U=[]}=w(B);if(N!==M.RPC_REQUEST||!q||!O||O!==K||$!==G)return;let F={action:M.RPC_RESOLVE,callID:q,callName:O,connectionID:$,error:null,result:null},T;try{F.result=await Z(...U,X),F.result?.[A]&&(T=F.result[A]??[],delete F.result[A])}catch(C){F.action=M.RPC_REJECT,F.error=JSON.parse(JSON.stringify(C,Object.getOwnPropertyNames(C)))}D(J,F,B?.origin,T)}j(R,L.MESSAGE,Y),Q.push(()=>H(R,L.MESSAGE,Y))}return()=>Q.forEach((K)=>K())}function t(P,G,R,J=[],X,Q){return(...K)=>new Promise((Z,Y)=>{let B=r();function N(O){let{callID:U,connectionID:F,callName:T,result:C,error:v,action:I}=w(O);if(!(!U||!T)&&T===P&&U===B&&F===G){if(I===M.RPC_RESOLVE)return Z(C);if(I===M.RPC_REJECT)return Y(v)}}let q={action:M.RPC_REQUEST,args:K,callID:B,callName:P,connectionID:G},$=K.reduce((O,U)=>U[A]?.length?O.concat(U[A]):O,K[A]??[]);j(X,L.MESSAGE,N),J.push(()=>H(X,L.MESSAGE,N)),D(Q,q,R?.origin,$)})}function a(P={},G=[],R,J,X,Q){let K={...P},Z=[];for(let Y of G)l(K,Y,t(Y,R,J,Z,X,Q));return{remote:K,unregisterRemote:()=>Z.forEach((Y)=>Y())}}function n(P={},G){return new Promise(async(R)=>{let J=p(P),X=s(),Q=self||window;async function K(Z){let Y=w(Z);if(Y?.action!==M.HANDSHAKE_REPLY)return;let{remote:B,unregisterRemote:N}=a(Y.schema,Y.methodNames,Y.connectionID,Z,Q,X),q=o(J,Y.connectionID,Q,X,B);return await G?.onConnectionSetup?.(B),D(X,{action:M.HANDSHAKE_REPLY,connectionID:Y.connectionID},Z?.origin),R({remote:B,close:()=>{H(Q,L.MESSAGE,K),N(),q()},id:Y.connectionID})}j(Q,L.MESSAGE,K),D(X,{action:M.HANDSHAKE_REQUEST,methodNames:Object.keys(J),schema:P})})}var f={connect:n};var e=(P)=>typeof P===\\\"object\\\"&&P!==null,y=(P)=>{try{let G=JSON.stringify(P);if(typeof G===\\\"string\\\"&&G.length>0)return G}catch{}try{return String(P)}catch{return\\\"Unknown error\\\"}},k=(P)=>{if(P instanceof Error)return{message:P.message,stack:P.stack};if(typeof P===\\\"string\\\")return{message:P};if(e(P)){let G=typeof P.message===\\\"string\\\"?P.message:null,R=typeof P.stack===\\\"string\\\"?P.stack:void 0;if(G)return R?{message:G,stack:R}:{message:G};return{message:y(P)}}if(P===null||P===void 0)return{message:\\\"Unknown error\\\"};return{message:y(P)}};var z=(P)=>({id:P}),W=(P,G)=>({id:P,kind:G.kind,label:G.label,description:G.description,metadata:G.metadata}),zP={sidenav:W(\\\"project.sidenav\\\",{kind:\\\"panel\\\"}),headerPrimary:W(\\\"project.headerPrimary\\\",{kind:\\\"menu\\\"}),headerOverflow:W(\\\"project.headerOverflow\\\",{kind:\\\"menu\\\"}),settingsPanels:W(\\\"project.settingsPanels\\\",{kind:\\\"settings\\\"})},BP={headerPrimary:W(\\\"session.headerPrimary\\\",{kind:\\\"menu\\\"}),headerOverflow:W(\\\"session.headerOverflow\\\",{kind:\\\"menu\\\"}),transcriptActions:W(\\\"session.transcriptActions\\\",{kind:\\\"menu\\\"})},WP={headerPrimary:W(\\\"workspace.headerPrimary\\\",{kind:\\\"menu\\\"}),headerOverflow:W(\\\"workspace.headerOverflow\\\",{kind:\\\"menu\\\"}),sidenav:W(\\\"workspace.sidenav\\\",{kind:\\\"panel\\\"})},qP={opened:z(\\\"project.opened\\\")},FP={started:z(\\\"session.started\\\"),resumed:z(\\\"session.resumed\\\"),awaitingInput:z(\\\"session.awaitingInput\\\"),succeeded:z(\\\"session.succeeded\\\"),failed:z(\\\"session.failed\\\"),completed:z(\\\"session.completed\\\")},MP={created:z(\\\"workspace.created\\\"),provision:z(\\\"workspace.provision\\\"),ready:z(\\\"workspace.ready\\\"),archived:z(\\\"workspace.archived\\\"),deleted:z(\\\"workspace.deleted\\\")},NP={removed:z(\\\"worktree.removed\\\")},OP={committed:z(\\\"git.committed\\\"),rebased:z(\\\"git.rebased\\\"),merged:z(\\\"git.merged\\\"),conflicted:z(\\\"git.conflicted\\\")};var PP=[\\\"commands.execute\\\",\\\"resource.open\\\",\\\"notification.show\\\",\\\"notification.action\\\",\\\"notification.resolve\\\",\\\"notification.dismiss\\\",\\\"preferences.get\\\",\\\"preferences.set\\\",\\\"extension.settings.all\\\",\\\"extension.settings.get\\\",\\\"extension.settings.set\\\",\\\"extension.settings.delete\\\",\\\"terminal.session\\\",\\\"files.upload\\\",\\\"files.list\\\",\\\"files.delete\\\"],GP=[\\\"host.dispatchKeyboardEvent\\\"],UP=[...PP,...GP];var c=(P,G)=>({call:async(R,J)=>await P({method:R,params:J}),onEvent:G}),g=(P)=>{let G=P,R=new Set;return{get:()=>G,subscribe:(J)=>{return R.add(J),()=>R.delete(J)},set:(J)=>{G=J;for(let X of R)X(G)}}};var h=\\\"pstdio-extension-mount\\\",RP=()=>{let P=new Map;return{get length(){return P.size},clear:()=>P.clear(),getItem:(G)=>P.get(G)??null,key:(G)=>Array.from(P.keys())[G]??null,removeItem:(G)=>P.delete(G),setItem:(G,R)=>P.set(G,R)}},JP=()=>{for(let P of[\\\"localStorage\\\",\\\"sessionStorage\\\"])try{window[P]}catch{Object.defineProperty(window,P,{configurable:!0,value:RP()})}},m=(P,G)=>{let R=document.documentElement,J=P===\\\"dark\\\"?\\\"light\\\":\\\"dark\\\";R.classList.remove(J),R.classList.add(P),R.setAttribute(\\\"data-theme\\\",P),R.style.colorScheme=P;for(let[X,Q]of Object.entries(G))if(X.startsWith(\\\"--\\\"))R.style.setProperty(X,Q)},KP=(P)=>{for(let G of P){let R=document.createElement(\\\"link\\\");R.rel=\\\"stylesheet\\\",R.href=G,document.head.appendChild(R)}},QP=()=>{let P=document.getElementById(h);if(!P)P=document.createElement(\\\"div\\\"),P.id=h,P.style.height=\\\"100%\\\",P.style.width=\\\"100%\\\",document.body.appendChild(P);return P},XP=(P)=>P instanceof HTMLInputElement||P instanceof HTMLTextAreaElement||P instanceof HTMLSelectElement||P instanceof HTMLElement&&P.isContentEditable,YP=async()=>{JP();let P=g(void 0),G=new Map,R=(K,Z)=>{let Y=G.get(K)??new Set;return Y.add(Z),G.set(K,Y),()=>{Y.delete(Z)}},J,X=!1,Q=await f.connect({init:async(K)=>{try{m(K.theme,K.themeVariables),KP(K.styles),P.set(K.props);let Z=QP(),Y=await import(K.moduleUrl),B=Y.default??(Y.mount?Y:void 0);if(!B?.mount)throw Error(\\\"Extension module does not export a default view (defineExtensionView).\\\");let N=c(($)=>Q.remote.call($),R),q=await B.mount(Z,N,P);if(J=typeof q===\\\"function\\\"?q:void 0,!X)X=!0,document.addEventListener(\\\"keydown\\\",($)=>{if(!$.ctrlKey&&!$.metaKey&&!$.altKey)return;if(XP($.target)&&!$.shiftKey)return;Q.remote.call({method:\\\"host.dispatchKeyboardEvent\\\",params:{key:$.key,code:$.code,ctrlKey:$.ctrlKey,metaKey:$.metaKey,altKey:$.altKey,shiftKey:$.shiftKey,repeat:$.repeat}}).catch(()=>{})},!0)}catch(Z){let Y=k(Z);throw Q.remote.runtimeError(Y),Z instanceof Error?Z:Error(Y.message)}},themeUpdate:(K)=>{m(K.theme,K.variables)},propsUpdate:(K)=>{P.set(K.props)},hostEvent:(K)=>{for(let Z of G.get(K.scope)??[])Z(K.payload)}});Q.remote.ready({}),window.addEventListener(\\\"beforeunload\\\",()=>{J?.()})};YP();\\n\"","const MOUNT_ID = \"pstdio-extension-mount\";\n\nconst escapeAttribute = (value: string) =>\n value.replaceAll(\"&\", \"&\").replaceAll('\"', \""\").replaceAll(\"<\", \"<\");\n\nconst escapeScriptContent = (value: string) => value.replaceAll(\"</script\", \"<\\\\/script\").replaceAll(\"<!--\", \"<\\\\!--\");\n\nconst renderRuntimeHostDocument = (scriptTag: string) => `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <style>\n html, body {\n height: 100%;\n margin: 0;\n background: transparent;\n }\n body {\n overflow-x: hidden !important;\n overflow-y: auto !important;\n }\n #${MOUNT_ID} {\n height: 100%;\n width: 100%;\n display: block;\n min-height: 0;\n }\n </style>\n </head>\n <body>\n <div id=\"${MOUNT_ID}\"></div>\n ${scriptTag}\n </body>\n</html>\n`;\n\nexport const getExtensionRuntimeScriptUrl = () => new URL(\"./runtime.bundle.js\", import.meta.url).href;\n\nexport const renderExtensionRuntimeHtml = (scriptUrl: string) =>\n renderRuntimeHostDocument(`<script src=\"${escapeAttribute(scriptUrl)}\"></script>`);\n\nexport const renderInlineExtensionRuntimeHtml = (runtimeScript: string) =>\n renderRuntimeHostDocument(`<script>${escapeScriptContent(runtimeScript)}</script>`);\n","import runtimeScript from \"pstdio-extensions/bridge/webview-runtime.bundle.js?raw\";\n\nexport {\n renderExtensionRuntimeHtml,\n renderInlineExtensionRuntimeHtml,\n} from \"pstdio-extensions/bridge/webview-runtime-html\";\n\n// The guest runtime bundle is inlined here so a host app can serve it without\n// depending on the private pstdio-extensions package.\nexport const getExtensionRuntimeScript = () => runtimeScript;\n"],"names":["runtimeScript","MOUNT_ID","escapeAttribute","value","replaceAll","escapeScriptContent","renderRuntimeHostDocument","scriptTag","renderExtensionRuntimeHtml","scriptUrl","renderInlineExtensionRuntimeHtml","getExtensionRuntimeScript"],"mappings":"AAAA,MAAAA,IAAe,q/QCATC,IAAW,0BAEXC,IAAkBA,CAACC,MACvBA,EAAMC,WAAW,KAAK,OAAO,EAAEA,WAAW,KAAK,QAAQ,EAAEA,WAAW,KAAK,MAAM,GAE3EC,IAAsBA,CAACF,MAAkBA,EAAMC,WAAW,aAAY,YAAY,EAAEA,WAAW,QAAQ,QAAQ,GAE/GE,IAA4BA,CAACC,MAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAehDN,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eASFA,CAAQ;AAAA,MACjBM,CAAS;AAAA;AAAA;AAAA,GAOFC,IAA6BA,CAACC,MACzCH,EAA0B,gBAAgBJ,EAAgBO,CAAS,CAAC,cAAa,GAEtEC,IAAmCA,CAACV,MAC/CM,EAA0B,WAAWD,EAAoBL,CAAa,CAAC,YAAW,GClCvEW,IAA4BA,MAAMX;"}
|