diff --git a/client/vscode-lib/package.json b/client/vscode-lib/package.json index f1b45b3f..6ae20f60 100644 --- a/client/vscode-lib/package.json +++ b/client/vscode-lib/package.json @@ -1,6 +1,6 @@ { "name": "@openctx/vscode-lib", - "version": "0.0.19", + "version": "0.0.20", "description": "OpenCtx library for VS Code extensions", "license": "Apache-2.0", "repository": { diff --git a/client/vscode-lib/src/controller.test.ts b/client/vscode-lib/src/controller.test.ts index 74d496fc..9b24d4d6 100644 --- a/client/vscode-lib/src/controller.test.ts +++ b/client/vscode-lib/src/controller.test.ts @@ -3,13 +3,13 @@ import type { Controller } from './controller.js' export function createMockController(): MockedObject { return { - observeMeta: vi.fn(), + metaChanges: vi.fn(), meta: vi.fn(), - observeMentions: vi.fn(), + mentionsChanges: vi.fn(), mentions: vi.fn(), - observeItems: vi.fn(), + itemsChanges: vi.fn(), items: vi.fn(), - observeAnnotations: vi.fn(), + annotationsChanges: vi.fn(), annotations: vi.fn(), } } diff --git a/client/vscode-lib/src/controller.ts b/client/vscode-lib/src/controller.ts index 44eceb13..da3f25eb 100644 --- a/client/vscode-lib/src/controller.ts +++ b/client/vscode-lib/src/controller.ts @@ -1,4 +1,5 @@ import { + type AnnotationsParams, type AuthInfo, type Client, type ClientConfiguration, @@ -34,24 +35,18 @@ import { observeWorkspaceConfigurationChanges, toEventEmitter } from './util/obs type VSCodeClient = Client -export interface Controller { - observeMeta: VSCodeClient['metaChanges'] - meta: VSCodeClient['meta'] - - observeMentions: VSCodeClient['mentionsChanges'] - mentions: VSCodeClient['mentions'] - - observeItems: VSCodeClient['itemsChanges'] - items: VSCodeClient['items'] - - observeAnnotations( - doc: Pick, - ): ReturnType - annotations( - doc: Pick, - opts?: ProviderMethodOptions, - ): ReturnType -} +export interface Controller + extends Pick< + VSCodeClient, + | 'metaChanges' + | 'meta' + | 'mentionsChanges' + | 'mentions' + | 'itemsChanges' + | 'items' + | 'annotationsChanges' + | 'annotations' + > {} export function createController({ secrets: secretsInput, @@ -165,38 +160,25 @@ export function createController({ */ const controller: Controller = { meta: errorReporter.wrapPromise(UserAction.Explicit, client.meta), - observeMeta: errorReporter.wrapObservable(UserAction.Explicit, client.metaChanges), + metaChanges: errorReporter.wrapObservable(UserAction.Explicit, client.metaChanges), mentions: errorReporter.wrapPromise(UserAction.Explicit, client.mentions), - observeMentions: errorReporter.wrapObservable(UserAction.Explicit, client.mentionsChanges), + mentionsChanges: errorReporter.wrapObservable(UserAction.Explicit, client.mentionsChanges), items: errorReporter.wrapPromise(UserAction.Explicit, client.items), - observeItems: errorReporter.wrapObservable(UserAction.Explicit, client.itemsChanges), + itemsChanges: errorReporter.wrapObservable(UserAction.Explicit, client.itemsChanges), - async annotations(doc: vscode.TextDocument, opts?: ProviderMethodOptions) { - if (ignoreDoc(doc)) { + annotations: async (params: AnnotationsParams, opts?: ProviderMethodOptions) => { + if (ignoreDoc(params)) { return [] } - return await clientAnnotations( - { - uri: doc.uri.toString(), - content: doc.getText(), - }, - opts, - ) + return await clientAnnotations(params, opts) }, - observeAnnotations(doc: vscode.TextDocument, opts?: ProviderMethodOptions) { - if (ignoreDoc(doc)) { + annotationsChanges(params: AnnotationsParams, opts?: ProviderMethodOptions) { + if (ignoreDoc(params)) { return of([]) } - - return clientAnnotationsChanges( - { - uri: doc.uri.toString(), - content: doc.getText(), - }, - opts, - ) + return clientAnnotationsChanges(params, opts) }, } @@ -224,11 +206,11 @@ export function createController({ } } -function ignoreDoc(doc: vscode.TextDocument): boolean { +function ignoreDoc(params: AnnotationsParams): boolean { // Ignore: // - documents that are not in the editor (`output` is the VS Code output channel). - // - very long documents - return doc.uri.scheme === 'output' || doc.lineCount > 5000 + // - very large documents + return params.uri.startsWith('output:') || params.content.length > 1024 * 1024 } function makeRange(range: Range): vscode.Range { diff --git a/client/vscode-lib/src/ui/editor/codeLens.test.ts b/client/vscode-lib/src/ui/editor/codeLens.test.ts index 32a0410b..298550a9 100644 --- a/client/vscode-lib/src/ui/editor/codeLens.test.ts +++ b/client/vscode-lib/src/ui/editor/codeLens.test.ts @@ -1,4 +1,4 @@ -import type { Annotation, EachWithProviderUri, Item } from '@openctx/client' +import type { Annotation, AnnotationsParams, EachWithProviderUri, Item } from '@openctx/client' import { TestScheduler } from 'rxjs/testing' import { type MockedObject, describe, expect, test, vi } from 'vitest' import type * as vscode from 'vscode' @@ -66,14 +66,12 @@ describe('createCodeLensProvider', () => { const { controller, provider } = createTestProvider() const doc = mockTextDocument() testScheduler().run(({ cold, expectObservable }): void => { - controller.observeAnnotations.mockImplementation( - (doc: Pick) => { - expect(doc).toBe(doc) - return cold[]>>('a', { - a: [fixtureAnn('a')], - }) - }, - ) + controller.annotationsChanges.mockImplementation((params: AnnotationsParams) => { + expect(params).toBe(params) + return cold[]>>('a', { + a: [fixtureAnn('a')], + }) + }) expectObservable(provider.observeCodeLenses(doc)).toBe('a', { a: [ { @@ -99,8 +97,8 @@ describe('createCodeLensProvider', () => { const { controller, provider } = createTestProvider() const doc = mockTextDocument() testScheduler().run(({ cold, expectObservable }): void => { - controller.observeAnnotations.mockImplementation(doc => { - expect(doc).toBe(doc) + controller.annotationsChanges.mockImplementation(params => { + expect(params).toBe(params) return cold[]>>('ab', { a: [fixtureAnn('a')], b: [fixtureAnn('b')], @@ -138,7 +136,7 @@ describe('createCodeLensProvider', () => { const { controller, provider } = createTestProvider() const doc = mockTextDocument() testScheduler().run(({ cold, expectObservable }): void => { - controller.observeAnnotations.mockImplementation(doc => + controller.annotationsChanges.mockImplementation(params => cold[]>>('a', { a: [ { @@ -169,7 +167,7 @@ describe('createCodeLensProvider', () => { const { controller, provider } = createTestProvider() const doc = mockTextDocument() testScheduler().run(({ cold, expectObservable }): void => { - controller.observeAnnotations.mockImplementation(doc => + controller.annotationsChanges.mockImplementation(params => cold[]>>('a', { a: [ { diff --git a/client/vscode-lib/src/ui/editor/codeLens.ts b/client/vscode-lib/src/ui/editor/codeLens.ts index ca39a00f..14405f19 100644 --- a/client/vscode-lib/src/ui/editor/codeLens.ts +++ b/client/vscode-lib/src/ui/editor/codeLens.ts @@ -46,14 +46,16 @@ export function createCodeLensProvider(controller: Controller): vscode.CodeLensP return entry.observable } - const observable = controller.observeAnnotations(doc).pipe( - map(anns => - prepareAnnotationsForPresentation(anns ?? []).map(item => - annotationCodeLens(doc, item, showHover), + const observable = controller + .annotationsChanges({ uri: doc.uri.toString(), content: doc.getText() }) + .pipe( + map(anns => + prepareAnnotationsForPresentation(anns ?? []).map(item => + annotationCodeLens(doc, item, showHover), + ), ), - ), - shareReplay({ bufferSize: 1, refCount: true }), - ) + shareReplay({ bufferSize: 1, refCount: true }), + ) const subscription = observable.subscribe({ next: () => changeCodeLenses.fire(), error: () => changeCodeLenses.fire(), diff --git a/client/vscode-lib/src/ui/editor/hover.ts b/client/vscode-lib/src/ui/editor/hover.ts index afd21a7f..53fcb785 100644 --- a/client/vscode-lib/src/ui/editor/hover.ts +++ b/client/vscode-lib/src/ui/editor/hover.ts @@ -7,7 +7,7 @@ export function createHoverProvider(controller: Controller): vscode.HoverProvide return { async provideHover(doc, pos): Promise { return firstValueFrom( - controller.observeAnnotations(doc).pipe( + controller.annotationsChanges({ uri: doc.uri.toString(), content: doc.getText() }).pipe( map(anns => { const containedByAnns = anns?.filter(ann => (ann.range ?? ZERO_RANGE).contains(pos), diff --git a/client/vscode-lib/src/ui/fileItemsList.ts b/client/vscode-lib/src/ui/fileItemsList.ts index 0c1954e6..d8d237a5 100644 --- a/client/vscode-lib/src/ui/fileItemsList.ts +++ b/client/vscode-lib/src/ui/fileItemsList.ts @@ -1,4 +1,4 @@ -import type { Annotation } from '@openctx/client' +import type { Annotation, AnnotationsParams } from '@openctx/client' import * as vscode from 'vscode' import type { Controller } from '../controller.js' @@ -37,7 +37,11 @@ async function showQuickPick(controller: Controller): Promise { quickPick.matchOnDetail = true quickPick.show() - const subscription = controller.observeAnnotations(editor.document).subscribe( + const params: AnnotationsParams = { + uri: editor.document.uri.toString(), + content: editor.document.getText(), + } + const subscription = controller.annotationsChanges(params).subscribe( anns => { quickPick.items = anns && anns.length > 0