summaryrefslogtreecommitdiffhomepage
path: root/packages/surface-loaded-extensions/src
diff options
context:
space:
mode:
Diffstat (limited to 'packages/surface-loaded-extensions/src')
-rw-r--r--packages/surface-loaded-extensions/src/extension.ts62
-rw-r--r--packages/surface-loaded-extensions/src/spec.test.ts188
-rw-r--r--packages/surface-loaded-extensions/src/spec.ts48
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],
+ };
}