diff options
Diffstat (limited to 'packages/surface-loaded-extensions/src')
| -rw-r--r-- | packages/surface-loaded-extensions/src/extension.ts | 62 | ||||
| -rw-r--r-- | packages/surface-loaded-extensions/src/spec.test.ts | 188 | ||||
| -rw-r--r-- | packages/surface-loaded-extensions/src/spec.ts | 48 |
3 files changed, 149 insertions, 149 deletions
diff --git a/packages/surface-loaded-extensions/src/extension.ts b/packages/surface-loaded-extensions/src/extension.ts index 20abdec..7af55b6 100644 --- a/packages/surface-loaded-extensions/src/extension.ts +++ b/packages/surface-loaded-extensions/src/extension.ts @@ -4,41 +4,41 @@ import { surfaceRegistryHandle } from "@dispatch/surface-registry"; import { buildLoadedExtensionsSpec } from "./spec.js"; export const manifest: Manifest = { - id: "surface-loaded-extensions", - name: "Loaded Extensions Surface", - version: "0.0.0", - apiVersion: "^0.1.0", - trust: "bundled", - activation: "eager", - dependsOn: ["surface-registry"], - contributes: { services: [] }, + id: "surface-loaded-extensions", + name: "Loaded Extensions Surface", + version: "0.0.0", + apiVersion: "^0.1.0", + trust: "bundled", + activation: "eager", + dependsOn: ["surface-registry"], + contributes: { services: [] }, }; export function createLoadedExtensionsExtension(): Extension { - let dispose: (() => void) | undefined; + let dispose: (() => void) | undefined; - return { - manifest, - activate(host: HostAPI) { - const registry = host.getService(surfaceRegistryHandle); + return { + manifest, + activate(host: HostAPI) { + const registry = host.getService(surfaceRegistryHandle); - const provider: SurfaceProvider = { - catalogEntry: { - id: "loaded-extensions", - region: "side", - title: "Loaded Extensions", - scope: "global", - }, - getSpec() { - return buildLoadedExtensionsSpec(host.getExtensions()); - }, - invoke() {}, - }; + const provider: SurfaceProvider = { + catalogEntry: { + id: "loaded-extensions", + region: "side", + title: "Loaded Extensions", + scope: "global", + }, + getSpec() { + return buildLoadedExtensionsSpec(host.getExtensions()); + }, + invoke() {}, + }; - dispose = registry.register(provider); - }, - deactivate() { - dispose?.(); - }, - }; + dispose = registry.register(provider); + }, + deactivate() { + dispose?.(); + }, + }; } diff --git a/packages/surface-loaded-extensions/src/spec.test.ts b/packages/surface-loaded-extensions/src/spec.test.ts index bc31b9e..d20eb8e 100644 --- a/packages/surface-loaded-extensions/src/spec.test.ts +++ b/packages/surface-loaded-extensions/src/spec.test.ts @@ -4,105 +4,105 @@ import { describe, expect, it } from "vitest"; import { buildLoadedExtensionsSpec, TABLE_RENDERER_ID, type TablePayload } from "./spec.js"; function fakeManifest( - id: string, - name: string, - version: string, - extra: Partial<Manifest> = {}, + id: string, + name: string, + version: string, + extra: Partial<Manifest> = {}, ): Manifest { - return { - id, - name, - version, - apiVersion: "^0.1.0", - trust: "bundled", - ...extra, - }; + return { + id, + name, + version, + apiVersion: "^0.1.0", + trust: "bundled", + ...extra, + }; } function tablePayload(field: unknown): TablePayload { - const custom = field as CustomField; - expect(custom.kind).toBe("custom"); - expect(custom.rendererId).toBe(TABLE_RENDERER_ID); - return custom.payload as TablePayload; + const custom = field as CustomField; + expect(custom.kind).toBe("custom"); + expect(custom.rendererId).toBe(TABLE_RENDERER_ID); + return custom.payload as TablePayload; } describe("buildLoadedExtensionsSpec", () => { - it("returns a count stat of '0' and an empty table for empty manifests", () => { - const spec = buildLoadedExtensionsSpec([]); - - expect(spec.id).toBe("loaded-extensions"); - expect(spec.region).toBe("side"); - expect(spec.title).toBe("Loaded Extensions"); - expect(spec.fields).toHaveLength(2); - expect(spec.fields[0]).toEqual({ - kind: "stat", - label: "Loaded", - value: "0", - }); - expect(tablePayload(spec.fields[1]).rows).toEqual([]); - }); - - it("returns a count stat plus ONE table field with a row per manifest (CR-1)", () => { - const manifests = [ - fakeManifest("alpha", "Alpha", "1.0.0"), - fakeManifest("beta", "Beta", "2.3.1", { trust: "external", activation: "lazy" }), - fakeManifest("gamma", "Gamma", "0.5.0", { trust: "local" }), - ]; - - const spec = buildLoadedExtensionsSpec(manifests); - - expect(spec.fields).toHaveLength(2); - expect(spec.fields[0]).toEqual({ - kind: "stat", - label: "Loaded", - value: "3", - }); - - const payload = tablePayload(spec.fields[1]); - expect(payload.columns).toEqual(["Name", "Version", "Trust", "Activation"]); - expect(payload.rows).toEqual([ - ["Alpha", "1.0.0", "bundled", "eager"], - ["Beta", "2.3.1", "external", "lazy"], - ["Gamma", "0.5.0", "local", "eager"], - ]); - }); - - it("every row aligns cell-for-cell to the columns", () => { - const spec = buildLoadedExtensionsSpec([fakeManifest("a", "A", "1.0.0")]); - const payload = tablePayload(spec.fields[1]); - for (const row of payload.rows) { - expect(row).toHaveLength(payload.columns.length); - } - }); - - it("preserves input order of manifests", () => { - const manifests = [ - fakeManifest("z-last", "Z Last", "1.0.0"), - fakeManifest("a-first", "A First", "2.0.0"), - ]; - - const spec = buildLoadedExtensionsSpec(manifests); - - const payload = tablePayload(spec.fields[1]); - expect(payload.rows.map((r) => r[0])).toEqual(["Z Last", "A First"]); - }); - - it("sets the surface id, region, and title correctly", () => { - const spec = buildLoadedExtensionsSpec([]); - - expect(spec.id).toBe("loaded-extensions"); - expect(spec.region).toBe("side"); - expect(spec.title).toBe("Loaded Extensions"); - }); - - it("defaults a missing activation to 'eager' (the declared manifest default)", () => { - const spec = buildLoadedExtensionsSpec([fakeManifest("my-ext", "My Extension", "3.2.1")]); - const payload = tablePayload(spec.fields[1]); - expect(payload.rows[0]).toEqual(["My Extension", "3.2.1", "bundled", "eager"]); - }); - - it("the count stat remains a plain stat (graceful-skip clients still see it)", () => { - const spec = buildLoadedExtensionsSpec([fakeManifest("a", "A", "1.0.0")]); - expect((spec.fields[0] as StatField).kind).toBe("stat"); - }); + it("returns a count stat of '0' and an empty table for empty manifests", () => { + const spec = buildLoadedExtensionsSpec([]); + + expect(spec.id).toBe("loaded-extensions"); + expect(spec.region).toBe("side"); + expect(spec.title).toBe("Loaded Extensions"); + expect(spec.fields).toHaveLength(2); + expect(spec.fields[0]).toEqual({ + kind: "stat", + label: "Loaded", + value: "0", + }); + expect(tablePayload(spec.fields[1]).rows).toEqual([]); + }); + + it("returns a count stat plus ONE table field with a row per manifest (CR-1)", () => { + const manifests = [ + fakeManifest("alpha", "Alpha", "1.0.0"), + fakeManifest("beta", "Beta", "2.3.1", { trust: "external", activation: "lazy" }), + fakeManifest("gamma", "Gamma", "0.5.0", { trust: "local" }), + ]; + + const spec = buildLoadedExtensionsSpec(manifests); + + expect(spec.fields).toHaveLength(2); + expect(spec.fields[0]).toEqual({ + kind: "stat", + label: "Loaded", + value: "3", + }); + + const payload = tablePayload(spec.fields[1]); + expect(payload.columns).toEqual(["Name", "Version", "Trust", "Activation"]); + expect(payload.rows).toEqual([ + ["Alpha", "1.0.0", "bundled", "eager"], + ["Beta", "2.3.1", "external", "lazy"], + ["Gamma", "0.5.0", "local", "eager"], + ]); + }); + + it("every row aligns cell-for-cell to the columns", () => { + const spec = buildLoadedExtensionsSpec([fakeManifest("a", "A", "1.0.0")]); + const payload = tablePayload(spec.fields[1]); + for (const row of payload.rows) { + expect(row).toHaveLength(payload.columns.length); + } + }); + + it("preserves input order of manifests", () => { + const manifests = [ + fakeManifest("z-last", "Z Last", "1.0.0"), + fakeManifest("a-first", "A First", "2.0.0"), + ]; + + const spec = buildLoadedExtensionsSpec(manifests); + + const payload = tablePayload(spec.fields[1]); + expect(payload.rows.map((r) => r[0])).toEqual(["Z Last", "A First"]); + }); + + it("sets the surface id, region, and title correctly", () => { + const spec = buildLoadedExtensionsSpec([]); + + expect(spec.id).toBe("loaded-extensions"); + expect(spec.region).toBe("side"); + expect(spec.title).toBe("Loaded Extensions"); + }); + + it("defaults a missing activation to 'eager' (the declared manifest default)", () => { + const spec = buildLoadedExtensionsSpec([fakeManifest("my-ext", "My Extension", "3.2.1")]); + const payload = tablePayload(spec.fields[1]); + expect(payload.rows[0]).toEqual(["My Extension", "3.2.1", "bundled", "eager"]); + }); + + it("the count stat remains a plain stat (graceful-skip clients still see it)", () => { + const spec = buildLoadedExtensionsSpec([fakeManifest("a", "A", "1.0.0")]); + expect((spec.fields[0] as StatField).kind).toBe("stat"); + }); }); diff --git a/packages/surface-loaded-extensions/src/spec.ts b/packages/surface-loaded-extensions/src/spec.ts index 72e8d41..e488381 100644 --- a/packages/surface-loaded-extensions/src/spec.ts +++ b/packages/surface-loaded-extensions/src/spec.ts @@ -7,8 +7,8 @@ import type { CustomField, StatField, SurfaceSpec } from "@dispatch/ui-contract" * a blind `unknown`. Each row aligns cell-for-cell to `columns`. */ export interface TablePayload { - readonly columns: readonly string[]; - readonly rows: ReadonlyArray<ReadonlyArray<string | number | boolean>>; + readonly columns: readonly string[]; + readonly rows: ReadonlyArray<ReadonlyArray<string | number | boolean>>; } /** The renderer id clients dispatch on for the extensions table. */ @@ -23,29 +23,29 @@ export const TABLE_RENDERER_ID = "table"; * "table" renderer gracefully skips the field and still sees the count. */ export function buildLoadedExtensionsSpec(manifests: readonly Manifest[]): SurfaceSpec { - const count: StatField = { kind: "stat", label: "Loaded", value: String(manifests.length) }; + const count: StatField = { kind: "stat", label: "Loaded", value: String(manifests.length) }; - const payload: TablePayload = { - columns: ["Name", "Version", "Trust", "Activation"], - rows: manifests.map((manifest) => [ - manifest.name, - manifest.version, - manifest.trust, - // Activation is optional in the manifest; "eager" is the declared default. - manifest.activation ?? "eager", - ]), - }; + const payload: TablePayload = { + columns: ["Name", "Version", "Trust", "Activation"], + rows: manifests.map((manifest) => [ + manifest.name, + manifest.version, + manifest.trust, + // Activation is optional in the manifest; "eager" is the declared default. + manifest.activation ?? "eager", + ]), + }; - const table: CustomField = { - kind: "custom", - rendererId: TABLE_RENDERER_ID, - payload, - }; + const table: CustomField = { + kind: "custom", + rendererId: TABLE_RENDERER_ID, + payload, + }; - return { - id: "loaded-extensions", - region: "side", - title: "Loaded Extensions", - fields: [count, table], - }; + return { + id: "loaded-extensions", + region: "side", + title: "Loaded Extensions", + fields: [count, table], + }; } |
