Skip to content

Commit 9c10efe

Browse files
authored
feat(types): Make explicit widget_manager interface (#670)
* feat(types): Make explicit widget_manager interface * chore(anywidget): Make @anywidget/types a dev dependency * chore: Resync packages
1 parent 6fc3226 commit 9c10efe

7 files changed

Lines changed: 1610 additions & 2591 deletions

File tree

.changeset/big-guests-cover.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
"@anywidget/types": minor
3+
---
4+
5+
Makes explicit WidgetManager interface
6+
7+
Drops `@jupyter-widgets/base` as a dependency and instead makes an explicit
8+
interface for `AnyModel.widget_manager`. Right now we only support
9+
`widget_manager.get_model`, so having the other methods on the interface was
10+
misleading (leading to issues around `.create_view` not being supported).

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,5 @@
2323
"typescript": "^5.5.4",
2424
"vitest": "^2.0.5"
2525
},
26-
"packageManager": "pnpm@9.4.0"
26+
"packageManager": "pnpm@9.9.0"
2727
}

packages/anywidget/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@
2020
"build": "node scripts/build.cjs"
2121
},
2222
"dependencies": {
23-
"@anywidget/types": "workspace:~",
2423
"@jupyter-widgets/base": "^6",
2524
"@lukeed/uuid": "^2.0.1",
2625
"solid-js": "^1.8.20"
2726
},
2827
"devDependencies": {
28+
"@anywidget/types": "workspace:^",
2929
"@jupyter-widgets/base-manager": "^1.0.11"
3030
},
3131
"jupyterlab": {

packages/anywidget/src/widget.js

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import * as uuid from "@lukeed/uuid";
22
import * as solid from "solid-js";
33

4+
/**
5+
* @template T
6+
* @typedef {T | PromiseLike<T>} Awaitable
7+
*/
8+
49
/**
510
* @typedef AnyWidget
611
* @prop initialize {import("@anywidget/types").Initialize}
@@ -14,7 +19,7 @@ import * as solid from "solid-js";
1419
*/
1520

1621
/**
17-
* @param {any} condition
22+
* @param {unknown} condition
1823
* @param {string} message
1924
* @returns {asserts condition}
2025
*/
@@ -192,12 +197,16 @@ function model_proxy(model, context) {
192197
off(name, callback) {
193198
model.off(name, callback, context);
194199
},
200+
// @ts-expect-error - the widget_manager type is wider than what
201+
// we want to expose to developers.
202+
// In a future version, we will expose a more limited API but
203+
// that can wait for a minor version bump.
195204
widget_manager: model.widget_manager,
196205
};
197206
}
198207

199208
/**
200-
* @param {void | (() => import('vitest').Awaitable<void>)} fn
209+
* @param {void | (() => Awaitable<void>)} fn
201210
* @param {string} kind
202211
*/
203212
async function safe_cleanup(fn, kind) {
@@ -320,7 +329,7 @@ class Runtime {
320329
console.debug(`[anywidget] esm hot updated: ${id}`);
321330
setEsm(model.get("_esm"));
322331
});
323-
/** @type {void | (() => import("vitest").Awaitable<void>)} */
332+
/** @type {void | (() => Awaitable<void>)} */
324333
let cleanup;
325334
this.#widget_result = solid.createResource(esm, async (update) => {
326335
await safe_cleanup(cleanup, "initialize");
@@ -355,7 +364,7 @@ class Runtime {
355364
async create_view(view) {
356365
let model = view.model;
357366
let disposer = solid.createRoot((dispose) => {
358-
/** @type {void | (() => import("vitest").Awaitable<void>)} */
367+
/** @type {void | (() => Awaitable<void>)} */
359368
let cleanup;
360369
let resource = solid.createResource(
361370
this.#widget_result,

packages/types/index.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import type { IWidgetManager } from "@jupyter-widgets/base";
2-
31
type Awaitable<T> = T | Promise<T>;
42
type ObjectHash = Record<string, any>;
53
type ChangeEventHandler<Payload> = (_: unknown, value: Payload) => void;
@@ -13,6 +11,13 @@ type EventHandler = (...args: any[]) => void;
1311
*/
1412
type LiteralUnion<T, U = string> = T | (U & {});
1513

14+
interface WidgetManager {
15+
/**
16+
* Get a promise for a model by model id.
17+
*/
18+
get_model<T extends ObjectHash>(model_id: string): Promise<AnyModel<T>>;
19+
}
20+
1621
export interface AnyModel<T extends ObjectHash = ObjectHash> {
1722
get<K extends keyof T>(key: K): T[K];
1823
set<K extends keyof T>(key: K, value: T[K]): void;
@@ -41,7 +46,7 @@ export interface AnyModel<T extends ObjectHash = ObjectHash> {
4146
callbacks?: any,
4247
buffers?: ArrayBuffer[] | ArrayBufferView[],
4348
): void;
44-
widget_manager: IWidgetManager;
49+
widget_manager: WidgetManager;
4550
}
4651

4752
export type Experimental = {

packages/types/package.json

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,6 @@
1414
"import": "./index.ts"
1515
}
1616
},
17-
"dependencies": {
18-
"@jupyter-widgets/base": "^6.0.8"
19-
},
2017
"publishConfig": {
2118
"main": "dist/index.js",
2219
"types": "dist/index.d.ts",

0 commit comments

Comments
 (0)