From eb9478ca2be5b9544d8f77120831cd70b22c9e1b Mon Sep 17 00:00:00 2001 From: Shrey Jain <“shreyjain5132@email.com> Date: Wed, 10 Jun 2026 11:42:25 +0530 Subject: [PATCH] feat(stepper): add stepper plugin metadata resolution --- src/plugins.ts | 4 +++- src/plugins/stepper.ts | 18 ++++++++++++++++++ src/util.ts | 2 +- 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 src/plugins/stepper.ts diff --git a/src/plugins.ts b/src/plugins.ts index 5e6fe4b..dc13155 100644 --- a/src/plugins.ts +++ b/src/plugins.ts @@ -1,7 +1,9 @@ -import { IPluginDefinition } from "./types"; +import { stepperPlugin } from "./plugins/stepper"; +import type { IPluginDefinition } from "./types"; import { generatePluginMap } from "./util"; export const plugins: IPluginDefinition[] = [ + stepperPlugin, ]; export const pluginMap: Map = /*#__PURE__*/ generatePluginMap(plugins); diff --git a/src/plugins/stepper.ts b/src/plugins/stepper.ts new file mode 100644 index 0000000..0e42a4c --- /dev/null +++ b/src/plugins/stepper.ts @@ -0,0 +1,18 @@ +import { type IPluginDefinition, PluginType } from "../types"; + +/** + * The Stepper (substitution visualizer) host plugin. + * + * Only a WEB resolution is provided: the runner half is bundled into each language's evaluator (it + * extends `@sourceacademy/runner-stepper`), and the evaluator pulls in this web half by calling + * `hostLoadPlugin("stepper")`. The id must match `STEPPER_DIRECTORY_ID` from + * `@sourceacademy/common-stepper`. + */ +export const stepperPlugin: IPluginDefinition = { + id: "stepper", + name: "Stepper", + description: "Visualises the step-by-step substitution evaluation of a program.", + resolutions: { + [PluginType.WEB]: "https://source-academy.github.io/plugins/web/stepper/dist/index.mjs", + }, +}; diff --git a/src/util.ts b/src/util.ts index 2165c6b..4b8e17c 100644 --- a/src/util.ts +++ b/src/util.ts @@ -1,4 +1,4 @@ -import { IPluginDefinition } from "./types"; +import type { IPluginDefinition } from "./types"; export function generatePluginMap(plugins: IPluginDefinition[]): Map { return new Map(plugins.map(plugin => [plugin.id, plugin]));