@baron1996/klinecharts-runtime 0.7.2 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/README.md +16 -2
  2. package/dist/drawing/capabilities.d.ts +10 -2
  3. package/dist/drawing/capabilities.d.ts.map +1 -1
  4. package/dist/drawing/scene-runtime-factory.d.ts +6 -1
  5. package/dist/drawing/scene-runtime-factory.d.ts.map +1 -1
  6. package/dist/drawing/scene-runtime-factory.js +1 -1
  7. package/dist/drawing/session-controller.d.ts +1 -0
  8. package/dist/drawing/session-controller.d.ts.map +1 -1
  9. package/dist/drawing/session-controller.js +40 -2
  10. package/dist/drawing/workspace-events.d.ts +13 -0
  11. package/dist/drawing/workspace-events.d.ts.map +1 -1
  12. package/dist/drawing/workspace-runtime.d.ts +12 -4
  13. package/dist/drawing/workspace-runtime.d.ts.map +1 -1
  14. package/dist/drawing/workspace-runtime.js +87 -1
  15. package/dist/index.d.ts +2 -1
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +2 -1
  18. package/dist/runtime.d.ts +3 -0
  19. package/dist/runtime.d.ts.map +1 -1
  20. package/dist/runtime.js +26 -0
  21. package/dist/toolbar/drawing-floating-toolbar-styles.d.ts +2 -0
  22. package/dist/toolbar/drawing-floating-toolbar-styles.d.ts.map +1 -0
  23. package/dist/toolbar/drawing-floating-toolbar-styles.js +250 -0
  24. package/dist/toolbar/drawing-floating-toolbar.d.ts +8 -0
  25. package/dist/toolbar/drawing-floating-toolbar.d.ts.map +1 -0
  26. package/dist/toolbar/drawing-floating-toolbar.js +373 -0
  27. package/dist/toolbar/standard-toolbar-styles.d.ts.map +1 -1
  28. package/dist/toolbar/standard-toolbar-styles.js +0 -18
  29. package/dist/toolbar/standard-toolbar.d.ts.map +1 -1
  30. package/dist/toolbar/standard-toolbar.js +15 -172
  31. package/dist/toolbar/toolbar-icons.d.ts +22 -0
  32. package/dist/toolbar/toolbar-icons.d.ts.map +1 -1
  33. package/dist/toolbar/toolbar-icons.js +8 -0
  34. package/dist/toolbar/toolbar-tools.d.ts +1 -6
  35. package/dist/toolbar/toolbar-tools.d.ts.map +1 -1
  36. package/dist/toolbar/toolbar-tools.js +0 -6
  37. package/dist/types.d.ts +9 -5
  38. package/dist/types.d.ts.map +1 -1
  39. package/package.json +2 -2
package/README.md CHANGED
@@ -4,16 +4,22 @@ Browser editing runtime and standard annotation toolbar for deterministic KLineC
4
4
  ChartScene files.
5
5
 
6
6
  ```bash
7
- npm install --save-exact @baron1996/kline-scene-schema@0.6.0 @baron1996/klinecharts-runtime@0.7.2
7
+ npm install --save-exact @baron1996/kline-scene-schema@0.6.0 @baron1996/klinecharts-runtime@0.9.2
8
8
  ```
9
9
 
10
10
  ```ts
11
11
  import { parseChartScene } from '@baron1996/kline-scene-schema';
12
- import { createKLineSceneRuntime } from '@baron1996/klinecharts-runtime';
12
+ import {
13
+ createDrawingFloatingToolbar,
14
+ createKLineSceneRuntime,
15
+ createStandardToolbar,
16
+ } from '@baron1996/klinecharts-runtime';
13
17
 
14
18
  // chartSceneInput is a complete embedded ChartScene JSON value from the host.
15
19
  const scene = parseChartScene(chartSceneInput);
16
20
  let runtime = await createKLineSceneRuntime(container, scene);
21
+ const standardToolbar = createStandardToolbar(toolbarContainer, runtime);
22
+ const drawingToolbar = createDrawingFloatingToolbar(container, runtime);
17
23
 
18
24
  await runtime.setPriceScale('linear');
19
25
  runtime.startOverlayDrawing('priceMeasurement');
@@ -32,6 +38,8 @@ const drawingCompleted = new Promise<void>((resolve) => {
32
38
  await drawingCompleted;
33
39
  const exportedScene = runtime.exportScene();
34
40
  const serializedScene = JSON.stringify(exportedScene);
41
+ drawingToolbar.destroy();
42
+ standardToolbar.destroy();
35
43
  runtime.destroy();
36
44
 
37
45
  runtime = await createKLineSceneRuntime(
@@ -40,6 +48,12 @@ runtime = await createKLineSceneRuntime(
40
48
  );
41
49
  ```
42
50
 
51
+ `createStandardToolbar` owns chart-level controls such as price scale and main-series
52
+ presentation. Selecting a Drawing shows `createDrawingFloatingToolbar`, which owns
53
+ line style, width, color, text, lock/unlock, and explicit deletion. The floating
54
+ toolbar can be dragged within the chart's visible bounds. Baron does not replace or
55
+ cancel the browser context menu; right-click never deletes a Drawing.
56
+
43
57
  The runtime does not provide undo or redo and does not fetch market data.
44
58
  Runtime `0.2.0` events are structured-cloneable pure data with
45
59
  `sceneVersion: 1` and `runtimeVersion: '0.2.0'`. Measurement scenes persist only
@@ -1,5 +1,5 @@
1
- import type { ChartScene, Drawing } from '@baron1996/kline-scene-schema';
2
- import type { EngineDrawingSnapshot, EnginePixelCoordinate, MainSeriesPresentation } from '@baron1996/klinecharts-adapter';
1
+ import type { ChartScene, Drawing, MarketData } from '@baron1996/kline-scene-schema';
2
+ import type { EngineHistoricalDataCommitResult, EngineDrawingSnapshot, EnginePixelCoordinate, MainSeriesPresentation } from '@baron1996/klinecharts-adapter';
3
3
  import type { HostActionDescriptor, RuntimeCapabilityDescriptor } from './runtime-capability-descriptor.js';
4
4
  /** 公共 Drawing 能力;工具栏与所有正式交互式图表 Runtime 共用。 */
5
5
  export interface DrawingRuntimeCapability {
@@ -14,11 +14,14 @@ export interface DrawingRuntimeCapability {
14
14
  getDrawing(id: string): EngineDrawingSnapshot | undefined;
15
15
  updateDrawingStyles(id: string, styles: Drawing['styles']): EngineDrawingSnapshot;
16
16
  updateDrawingText(id: string, text: string): EngineDrawingSnapshot;
17
+ updateDrawingLocked(id: string, locked: boolean): EngineDrawingSnapshot;
17
18
  removeDrawing(id: string): boolean;
18
19
  requestDrawingDelete(id: string): void;
19
20
  selectDrawing(id: string | null): void;
20
21
  getSelectedDrawingId(): string | undefined;
21
22
  hitTestDrawing(point: EnginePixelCoordinate): string | null;
23
+ getDrawingMutationState(): 'ready' | 'busy';
24
+ subscribeDrawingChanges(listener: () => void): () => void;
22
25
  }
23
26
  export interface RuntimeAuxiliaryCapability {
24
27
  getRuntimeCapabilityDescriptor(options?: {
@@ -35,4 +38,9 @@ export interface RuntimeAuxiliaryCapability {
35
38
  };
36
39
  requestHostAction(actionId: string, drawingId?: string | null): void;
37
40
  }
41
+ /** 由宿主接管网络请求的更早行情能力。 */
42
+ export interface HistoricalDataRuntimeCapability {
43
+ commitHistoricalData(requestId: string, data: readonly MarketData[], hasMore: boolean): EngineHistoricalDataCommitResult;
44
+ rejectHistoricalData(requestId: string, message: string): boolean;
45
+ }
38
46
  //# sourceMappingURL=capabilities.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../src/drawing/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,UAAU,EACV,OAAO,EACP,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EACX,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EACX,oBAAoB,EACpB,2BAA2B,EAC3B,MAAM,oCAAoC,CAAC;AAG5C,8CAA8C;AAC9C,MAAM,WAAW,wBAAwB;IACxC,YAAY,CACX,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,EACrB,OAAO,CAAC,EAAE;QACT,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;KACrD,GACC,MAAM,CAAC;IACV,YAAY,IAAI,SAAS,qBAAqB,EAAE,CAAC;IACjD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS,CAAC;IAC1D,mBAAmB,CAClB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,GACvB,qBAAqB,CAAC;IACzB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,qBAAqB,CAAC;IACnE,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IACnC,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IACvC,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAAC;IAC3C,cAAc,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM,GAAG,IAAI,CAAC;CAC5D;AAED,MAAM,WAAW,0BAA0B;IAC1C,8BAA8B,CAAC,OAAO,CAAC,EAAE;QACxC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAC;KACvD,GAAG,2BAA2B,CAAC;IAChC,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG;QAClC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;QAC3B,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;QACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,iBAAiB,CAAC,KAAK,EAAE,QAAQ,GAAG,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACxE,yBAAyB,CACxB,YAAY,EAAE,sBAAsB,GAClC;QAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;CACrE"}
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../src/drawing/capabilities.ts"],"names":[],"mappings":"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"}
@@ -3,13 +3,18 @@ import { type DrawingEnginePort, type DrawingProjectionPolicy } from '@baron1996
3
3
  export interface SceneRuntimeRegistration {
4
4
  readonly sceneKind: 'chart' | 'time-series';
5
5
  parseScene(value: unknown): ChartScene | TimeSeriesScene;
6
- createAdapter(container: HTMLElement, workspace: DrawableWorkspaceDocument): Promise<DrawingEnginePort>;
6
+ createAdapter(container: HTMLElement, workspace: DrawableWorkspaceDocument, options?: SceneRuntimeAdapterOptions): Promise<DrawingEnginePort>;
7
7
  createPolicy(): DrawingProjectionPolicy;
8
8
  readonly defaultTarget: {
9
9
  readonly paneRole: string;
10
10
  readonly yAxisRole: 'primary';
11
11
  };
12
12
  }
13
+ export interface SceneRuntimeAdapterOptions {
14
+ readonly historicalDataLoading?: {
15
+ readonly hasMore: boolean;
16
+ };
17
+ }
13
18
  export declare function registerSceneRuntime(registration: SceneRuntimeRegistration): void;
14
19
  export declare function getSceneRuntime(kind: 'chart' | 'time-series'): SceneRuntimeRegistration;
15
20
  //# sourceMappingURL=scene-runtime-factory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scene-runtime-factory.d.ts","sourceRoot":"","sources":["../../src/drawing/scene-runtime-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,UAAU,EACV,yBAAyB,EACzB,eAAe,EACf,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAKN,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,EAC5B,MAAM,gCAAgC,CAAC;AAExC,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,aAAa,CAAC;IAC5C,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,GAAG,eAAe,CAAC;IACzD,aAAa,CACZ,SAAS,EAAE,WAAW,EACtB,SAAS,EAAE,yBAAyB,GAClC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC9B,YAAY,IAAI,uBAAuB,CAAC;IACxC,QAAQ,CAAC,aAAa,EAAE;QACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;KAC9B,CAAC;CACF;AAID,wBAAgB,oBAAoB,CACnC,YAAY,EAAE,wBAAwB,GACpC,IAAI,CAEN;AAED,wBAAgB,eAAe,CAC9B,IAAI,EAAE,OAAO,GAAG,aAAa,GAC3B,wBAAwB,CAM1B"}
1
+ {"version":3,"file":"scene-runtime-factory.d.ts","sourceRoot":"","sources":["../../src/drawing/scene-runtime-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,UAAU,EACV,yBAAyB,EACzB,eAAe,EACf,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAKN,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,EAC5B,MAAM,gCAAgC,CAAC;AAExC,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,aAAa,CAAC;IAC5C,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,GAAG,eAAe,CAAC;IACzD,aAAa,CACZ,SAAS,EAAE,WAAW,EACtB,SAAS,EAAE,yBAAyB,EACpC,OAAO,CAAC,EAAE,0BAA0B,GAClC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC9B,YAAY,IAAI,uBAAuB,CAAC;IACxC,QAAQ,CAAC,aAAa,EAAE;QACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;KAC9B,CAAC;CACF;AAED,MAAM,WAAW,0BAA0B;IAC1C,QAAQ,CAAC,qBAAqB,CAAC,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;CAC/D;AAID,wBAAgB,oBAAoB,CACnC,YAAY,EAAE,wBAAwB,GACpC,IAAI,CAEN;AAED,wBAAgB,eAAe,CAC9B,IAAI,EAAE,OAAO,GAAG,aAAa,GAC3B,wBAAwB,CAM1B"}
@@ -14,7 +14,7 @@ export function getSceneRuntime(kind) {
14
14
  registerSceneRuntime({
15
15
  sceneKind: 'chart',
16
16
  parseScene: (value) => parseChartScene(value),
17
- createAdapter: (container, workspace) => KLineChartsSceneAdapter.createWorkspace(container, workspace),
17
+ createAdapter: (container, workspace, options) => KLineChartsSceneAdapter.createWorkspace(container, workspace, options),
18
18
  createPolicy: () => new KLineDrawingProjectionPolicy(),
19
19
  defaultTarget: { paneRole: 'candle', yAxisRole: 'primary' },
20
20
  });
@@ -47,6 +47,7 @@ export declare class DrawingSessionController {
47
47
  }): string;
48
48
  updateDrawingStyles(id: string, styles: EngineDrawingSnapshot['styles']): EngineDrawingSnapshot;
49
49
  updateDrawingText(id: string, text: string): EngineDrawingSnapshot;
50
+ updateDrawingLocked(id: string, locked: boolean): EngineDrawingSnapshot;
50
51
  removeDrawing(id: string): boolean;
51
52
  selectDrawing(id: string | null): void;
52
53
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"session-controller.d.ts","sourceRoot":"","sources":["../../src/drawing/session-controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-controller.d.ts","sourceRoot":"","sources":["../../src/drawing/session-controller.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,8 @@ export class DrawingSessionController {
23
23
  #confirmed = [];
24
24
  #candidate = null;
25
25
  #selectedId = null;
26
+ /** 尚未完成首次创建提交的 Drawing;用于把引擎侧取消恢复为 ready。 */
27
+ #interactingDrawingId = null;
26
28
  #requestSequence = 0;
27
29
  #suppressEngineEvents = false;
28
30
  #unsubscribeEngine;
@@ -60,9 +62,11 @@ export class DrawingSessionController {
60
62
  startCreate(type, options) {
61
63
  this.#assertReady();
62
64
  this.#state = 'interacting';
65
+ const id = options?.id ?? `drawing-${++this.#requestSequence}`;
66
+ this.#interactingDrawingId = id;
63
67
  try {
64
- return this.#options.engine.startDrawing({
65
- id: options?.id ?? `drawing-${++this.#requestSequence}`,
68
+ const startedId = this.#options.engine.startDrawing({
69
+ id,
66
70
  type: type,
67
71
  ...(options?.groupId === undefined ? {} : { groupId: options.groupId }),
68
72
  target: structuredClone(this.#options.target),
@@ -70,8 +74,13 @@ export class DrawingSessionController {
70
74
  metadata: structuredClone(options?.metadata ?? {}),
71
75
  ...(options?.text === undefined ? {} : { text: options.text }),
72
76
  });
77
+ if (this.#state === 'interacting') {
78
+ this.#interactingDrawingId = startedId;
79
+ }
80
+ return startedId;
73
81
  }
74
82
  catch (error) {
83
+ this.#interactingDrawingId = null;
75
84
  this.#state = 'ready';
76
85
  throw error;
77
86
  }
@@ -84,6 +93,10 @@ export class DrawingSessionController {
84
93
  this.#assertReady();
85
94
  return this.#options.engine.updateDrawingText(id, text);
86
95
  }
96
+ updateDrawingLocked(id, locked) {
97
+ this.#assertReady();
98
+ return this.#options.engine.updateDrawingLocked(id, locked);
99
+ }
87
100
  removeDrawing(id) {
88
101
  this.#assertReady();
89
102
  return this.#options.engine.removeDrawing(id);
@@ -216,6 +229,7 @@ export class DrawingSessionController {
216
229
  }
217
230
  this.#state = 'destroyed';
218
231
  this.#candidate = null;
232
+ this.#interactingDrawingId = null;
219
233
  this.#confirmed = [];
220
234
  this.#unsubscribeEngine();
221
235
  }
@@ -230,6 +244,9 @@ export class DrawingSessionController {
230
244
  if (event.drawing === undefined) {
231
245
  return;
232
246
  }
247
+ if (event.type === 'created' && event.id === this.#interactingDrawingId) {
248
+ this.#interactingDrawingId = null;
249
+ }
233
250
  void this.#onMutation({
234
251
  operation: event.type === 'created' ? 'create' : 'update',
235
252
  ...(this.#confirmed.find((drawing) => drawing.id === event.id) === undefined
@@ -239,6 +256,9 @@ export class DrawingSessionController {
239
256
  }),
240
257
  after: event.drawing,
241
258
  }).catch((error) => {
259
+ if (this.#state === 'interacting') {
260
+ this.#state = 'ready';
261
+ }
242
262
  this.#options.emit({
243
263
  type: 'workspace-error',
244
264
  code: error instanceof DrawingSessionError
@@ -252,6 +272,16 @@ export class DrawingSessionController {
252
272
  return;
253
273
  }
254
274
  if (event.type === 'removed') {
275
+ if (event.id === this.#interactingDrawingId) {
276
+ this.#interactingDrawingId = null;
277
+ this.#candidate = null;
278
+ this.#state = 'ready';
279
+ if (this.#selectedId === event.id) {
280
+ this.#selectedId = null;
281
+ this.#options.emit({ type: 'selection-changed', id: null });
282
+ }
283
+ return;
284
+ }
255
285
  const before = this.#confirmed.find((drawing) => drawing.id === event.id);
256
286
  if (before === undefined) {
257
287
  return;
@@ -280,6 +310,10 @@ export class DrawingSessionController {
280
310
  }
281
311
  catch (error) {
282
312
  if (error instanceof DrawingSessionError) {
313
+ if (this.#state === 'interacting') {
314
+ this.#state = 'ready';
315
+ this.#interactingDrawingId = null;
316
+ }
283
317
  this.#options.emit({
284
318
  type: 'workspace-error',
285
319
  code: error.code,
@@ -311,6 +345,9 @@ export class DrawingSessionController {
311
345
  catch (error) {
312
346
  if (error instanceof DrawingSessionError) {
313
347
  this.#restoreBefore(input.before, input.after);
348
+ if (input.operation === 'create' && this.#state === 'interacting') {
349
+ this.#state = 'ready';
350
+ }
314
351
  this.#options.emit({
315
352
  type: 'workspace-error',
316
353
  code: error.code,
@@ -382,6 +419,7 @@ export class DrawingSessionController {
382
419
  #enterTerminalError(code, message) {
383
420
  this.#state = 'terminal-error';
384
421
  this.#candidate = null;
422
+ this.#interactingDrawingId = null;
385
423
  this.#options.emit({ type: 'workspace-error', code, message });
386
424
  }
387
425
  #assertUsable() {
@@ -1,5 +1,6 @@
1
1
  import type { ChartScene, DrawingDocument, TimeSeriesScene } from '@baron1996/kline-scene-schema';
2
2
  import type { EngineDrawingSnapshot } from '@baron1996/klinecharts-adapter';
3
+ import type { EngineHistoricalDataRequest } from '@baron1996/klinecharts-adapter';
3
4
  import type { ActiveMainSeriesType } from '@baron1996/klinecharts-adapter';
4
5
  export declare const WORKSPACE_EVENT_PROTOCOL: "@baron1996/drawable-workspace-events";
5
6
  export declare const WORKSPACE_EVENT_PROTOCOL_VERSION: "1.0.0";
@@ -42,6 +43,18 @@ export type WorkspaceRuntimeEvent = ({
42
43
  } | {
43
44
  readonly type: 'scene-replaced';
44
45
  readonly scene: WorkspaceSceneSnapshot;
46
+ } | ({
47
+ readonly type: 'historical-data-requested';
48
+ } & EngineHistoricalDataRequest) | {
49
+ readonly type: 'historical-data-appended';
50
+ readonly requestId: string;
51
+ readonly addedCount: number;
52
+ readonly totalCount: number;
53
+ readonly hasMore: boolean;
54
+ } | {
55
+ readonly type: 'historical-data-rejected';
56
+ readonly requestId: string;
57
+ readonly message: string;
45
58
  } | {
46
59
  readonly type: 'value-axis-scale-changed';
47
60
  readonly scale: 'linear' | 'logarithmic';
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-events.d.ts","sourceRoot":"","sources":["../../src/drawing/workspace-events.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workspace-events.d.ts","sourceRoot":"","sources":["../../src/drawing/workspace-events.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import type { ChartScene, DrawableWorkspaceDocument, Drawing, DrawingDocument, TimeSeriesScene } from '@baron1996/kline-scene-schema';
2
- import type { EngineDrawingSnapshot, MainSeriesPresentation } from '@baron1996/klinecharts-adapter';
3
- import type { DrawingRuntimeCapability, RuntimeAuxiliaryCapability } from './capabilities.js';
1
+ import type { ChartScene, DrawableWorkspaceDocument, Drawing, DrawingDocument, MarketData, TimeSeriesScene } from '@baron1996/kline-scene-schema';
2
+ import type { EngineDrawingSnapshot, EngineHistoricalDataCommitResult, MainSeriesPresentation } from '@baron1996/klinecharts-adapter';
3
+ import type { DrawingRuntimeCapability, HistoricalDataRuntimeCapability, RuntimeAuxiliaryCapability } from './capabilities.js';
4
4
  import type { HostActionDescriptor, RuntimeCapabilityDescriptor } from './runtime-capability-descriptor.js';
5
5
  import { DrawingSessionController } from './session-controller.js';
6
6
  import { type WorkspaceRuntimeListener } from './workspace-events.js';
@@ -8,8 +8,11 @@ export interface DrawableWorkspaceRuntimeOptions {
8
8
  readonly commitMode: 'immediate' | 'host-confirmed';
9
9
  readonly onEvent?: WorkspaceRuntimeListener;
10
10
  readonly hostActions?: readonly HostActionDescriptor[];
11
+ readonly historicalDataLoading?: {
12
+ readonly hasMore: boolean;
13
+ };
11
14
  }
12
- export interface DrawableWorkspaceRuntimeHandle extends DrawingRuntimeCapability, RuntimeAuxiliaryCapability {
15
+ export interface DrawableWorkspaceRuntimeHandle extends DrawingRuntimeCapability, HistoricalDataRuntimeCapability, RuntimeAuxiliaryCapability {
13
16
  }
14
17
  /**
15
18
  * 组合 Scene Adapter、Drawing 会话与公共能力的工作区 Runtime。
@@ -34,6 +37,7 @@ export declare class DrawableWorkspaceRuntime implements DrawableWorkspaceRuntim
34
37
  getDrawing(id: string): EngineDrawingSnapshot | undefined;
35
38
  updateDrawingStyles(id: string, styles: Drawing['styles']): EngineDrawingSnapshot;
36
39
  updateDrawingText(id: string, text: string): EngineDrawingSnapshot;
40
+ updateDrawingLocked(id: string, locked: boolean): EngineDrawingSnapshot;
37
41
  removeDrawing(id: string): boolean;
38
42
  requestDrawingDelete(id: string): void;
39
43
  selectDrawing(id: string | null): void;
@@ -42,6 +46,8 @@ export declare class DrawableWorkspaceRuntime implements DrawableWorkspaceRuntim
42
46
  readonly x: number;
43
47
  readonly y: number;
44
48
  }): string | null;
49
+ getDrawingMutationState(): 'ready' | 'busy';
50
+ subscribeDrawingChanges(listener: () => void): () => void;
45
51
  subscribe(listener: WorkspaceRuntimeListener): () => void;
46
52
  getRuntimeCapabilityDescriptor(options?: {
47
53
  readonly hostActions?: readonly HostActionDescriptor[];
@@ -58,6 +64,8 @@ export declare class DrawableWorkspaceRuntime implements DrawableWorkspaceRuntim
58
64
  readonly activeType: string;
59
65
  };
60
66
  replaceScene(scene: ChartScene | TimeSeriesScene): ChartScene | TimeSeriesScene;
67
+ commitHistoricalData(requestId: string, data: readonly MarketData[], hasMore: boolean): EngineHistoricalDataCommitResult;
68
+ rejectHistoricalData(requestId: string, message: string): boolean;
61
69
  commitDrawingChange(requestId: string, canonicalHash: string): boolean;
62
70
  rejectDrawingChange(requestId: string): boolean;
63
71
  requestHostAction(actionId: string, drawingId?: string | null): void;
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-runtime.d.ts","sourceRoot":"","sources":["../../src/drawing/workspace-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,UAAU,EACV,yBAAyB,EACzB,OAAO,EACP,eAAe,EACf,eAAe,EACf,MAAM,+BAA+B,CAAC;AAOvC,OAAO,KAAK,EAGX,qBAAqB,EACrB,sBAAsB,EACtB,MAAM,gCAAgC,CAAC;AAMxC,OAAO,KAAK,EACX,wBAAwB,EACxB,0BAA0B,EAC1B,MAAM,mBAAmB,CAAC;AAK3B,OAAO,KAAK,EACX,oBAAoB,EACpB,2BAA2B,EAC3B,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACN,wBAAwB,EAExB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAKN,KAAK,wBAAwB,EAC7B,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,+BAA+B;IAC/C,QAAQ,CAAC,UAAU,EAAE,WAAW,GAAG,gBAAgB,CAAC;IACpD,QAAQ,CAAC,OAAO,CAAC,EAAE,wBAAwB,CAAC;IAC5C,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACvD;AAED,MAAM,WAAW,8BAChB,SAAQ,wBAAwB,EAAE,0BAA0B;CAAG;AAsChE;;;GAGG;AACH,qBAAa,wBAAyB,YAAW,8BAA8B;;IAe9E,OAAO;WAoCa,MAAM,CACzB,SAAS,EAAE,WAAW,EACtB,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,+BAA+B,GACtC,OAAO,CAAC,wBAAwB,CAAC;IAOpC,6CAA6C;IAC7C,IAAW,UAAU,IAAI,+BAA+B,CAAC,YAAY,CAAC,CAErE;IAED,qCAAqC;IAC9B,sBAAsB,IAAI,wBAAwB,CAAC,OAAO,CAAC;IAI3D,YAAY,CAClB,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,EACrB,OAAO,CAAC,EAAE;QACT,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;KACrD,GACC,MAAM;IAIF,YAAY,IAAI,SAAS,qBAAqB,EAAE;IAIhD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS;IAIzD,mBAAmB,CACzB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,GACvB,qBAAqB;IAIjB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,qBAAqB;IAIlE,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIlC,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAItC,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAItC,oBAAoB,IAAI,MAAM,GAAG,SAAS;IAI1C,cAAc,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,GAAG,IAAI;IAIhF,SAAS,CAAC,QAAQ,EAAE,wBAAwB,GAAG,MAAM,IAAI;IAOzD,8BAA8B,CACpC,OAAO,GAAE;QAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAA;KAAO,GACtE,2BAA2B;IA8CvB,qBAAqB,IAAI,eAAe;IAOxC,eAAe,IAAI,yBAAyB;IAmB5C,cAAc,CACpB,QAAQ,SAA4B,GAClC;QACF,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;QAC3B,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;QACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;KAC1B;IASY,iBAAiB,CAC7B,KAAK,EAAE,QAAQ,GAAG,aAAa,GAC7B,OAAO,CAAC,UAAU,CAAC;IAyCf,yBAAyB,CAC/B,YAAY,EAAE,sBAAsB,GAClC;QAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;KAAE;IAyB3B,YAAY,CAClB,KAAK,EAAE,UAAU,GAAG,eAAe,GACjC,UAAU,GAAG,eAAe;IAwBxB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO;IAItE,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI/C,iBAAiB,CACvB,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GACvB,IAAI;IAQA,OAAO,IAAI,IAAI;CAiFtB;AAED,wBAAsB,8BAA8B,CACnD,SAAS,EAAE,WAAW,EACtB,SAAS,EAAE,OAAO,EAClB,OAAO,EAAE,+BAA+B,GACtC,OAAO,CAAC,wBAAwB,CAAC,CAEnC"}
1
+ {"version":3,"file":"workspace-runtime.d.ts","sourceRoot":"","sources":["../../src/drawing/workspace-runtime.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { parseChartScene, parseDrawableWorkspaceDocument, parseDrawingDocument, serializeCanonicalDrawableWorkspace, } from '@baron1996/kline-scene-schema';
2
2
  import { MainSeriesPresentationError, STANDARD_CLOSE_LINE_PRESENTATION, } from '@baron1996/klinecharts-adapter';
3
+ import { runRuntimeTeardowns } from '../lifecycle.js';
3
4
  import { DrawingProjectionService, } from './projection-service.js';
4
5
  import { getSceneRuntime } from './scene-runtime-factory.js';
5
6
  import { DrawingSessionController, DrawingSessionError, } from './session-controller.js';
@@ -53,6 +54,9 @@ export class DrawableWorkspaceRuntime {
53
54
  /** 宿主确认策略在 Runtime 生命周期内不可切换。 */
54
55
  #commitMode;
55
56
  #listeners = new Set();
57
+ #drawingChangeListeners = new Set();
58
+ /** 释放历史行情请求订阅,避免 Runtime 销毁后宿主收到旧请求。 */
59
+ #unsubscribeHistoricalData;
56
60
  #sequence = 0;
57
61
  #destroyed = false;
58
62
  #scene;
@@ -81,11 +85,25 @@ export class DrawableWorkspaceRuntime {
81
85
  if (options.onEvent !== undefined) {
82
86
  this.#listeners.add(options.onEvent);
83
87
  }
88
+ const historicalDataPort = this.#historicalDataPort();
89
+ this.#unsubscribeHistoricalData = options.historicalDataLoading === undefined
90
+ ? undefined
91
+ : historicalDataPort?.subscribeHistoricalDataRequests((request) => {
92
+ this.#emit({ type: 'historical-data-requested', ...request });
93
+ });
84
94
  }
85
95
  static async create(container, value, options) {
86
96
  const workspace = parseDrawableWorkspaceDocument(value);
97
+ if (options.historicalDataLoading !== undefined &&
98
+ workspace.scene.kind !== 'chart') {
99
+ throw new Error('HISTORICAL_DATA_UNSUPPORTED: only chart Workspaces support historical data loading.');
100
+ }
87
101
  const registration = getSceneRuntime(workspace.scene.kind);
88
- const engine = await registration.createAdapter(container, workspace);
102
+ const engine = await registration.createAdapter(container, workspace, {
103
+ ...(options.historicalDataLoading === undefined
104
+ ? {}
105
+ : { historicalDataLoading: options.historicalDataLoading }),
106
+ });
89
107
  return new DrawableWorkspaceRuntime(container, workspace, engine, options);
90
108
  }
91
109
  /** 跨周期等宿主编排只能连接显式 host-confirmed Runtime。 */
@@ -111,6 +129,9 @@ export class DrawableWorkspaceRuntime {
111
129
  updateDrawingText(id, text) {
112
130
  return this.#session.updateDrawingText(id, text);
113
131
  }
132
+ updateDrawingLocked(id, locked) {
133
+ return this.#session.updateDrawingLocked(id, locked);
134
+ }
114
135
  removeDrawing(id) {
115
136
  return this.#session.removeDrawing(id);
116
137
  }
@@ -126,6 +147,15 @@ export class DrawableWorkspaceRuntime {
126
147
  hitTestDrawing(point) {
127
148
  return this.#engine.hitTestDrawing(point);
128
149
  }
150
+ getDrawingMutationState() {
151
+ return this.#session.state === 'ready' ? 'ready' : 'busy';
152
+ }
153
+ subscribeDrawingChanges(listener) {
154
+ this.#drawingChangeListeners.add(listener);
155
+ return () => {
156
+ this.#drawingChangeListeners.delete(listener);
157
+ };
158
+ }
129
159
  subscribe(listener) {
130
160
  this.#listeners.add(listener);
131
161
  return () => {
@@ -266,6 +296,36 @@ export class DrawableWorkspaceRuntime {
266
296
  this.#emit({ type: 'scene-replaced', scene: { kind: this.#sceneKind(), document: applied } });
267
297
  return structuredClone(applied);
268
298
  }
299
+ commitHistoricalData(requestId, data, hasMore) {
300
+ this.#assertUsable();
301
+ const port = this.#requireHistoricalDataPort();
302
+ const current = parseChartScene(this.#scene);
303
+ const candidate = parseChartScene({
304
+ ...structuredClone(current),
305
+ data: [...structuredClone(data), ...structuredClone(current.data)],
306
+ });
307
+ const result = this.#session.replaceProjectionScene({ kind: 'chart', document: candidate }, () => port.commitHistoricalData(requestId, data, hasMore));
308
+ this.#scene = result.scene;
309
+ this.#emit({
310
+ type: 'historical-data-appended',
311
+ requestId,
312
+ addedCount: result.addedCount,
313
+ totalCount: result.scene.data.length,
314
+ hasMore: result.hasMore,
315
+ });
316
+ return {
317
+ ...result,
318
+ scene: structuredClone(result.scene),
319
+ };
320
+ }
321
+ rejectHistoricalData(requestId, message) {
322
+ this.#assertUsable();
323
+ const rejected = this.#requireHistoricalDataPort().rejectHistoricalData(requestId);
324
+ if (rejected) {
325
+ this.#emit({ type: 'historical-data-rejected', requestId, message });
326
+ }
327
+ return rejected;
328
+ }
269
329
  commitDrawingChange(requestId, canonicalHash) {
270
330
  return this.#session.commitDrawingChange(requestId, canonicalHash);
271
331
  }
@@ -284,9 +344,12 @@ export class DrawableWorkspaceRuntime {
284
344
  return;
285
345
  }
286
346
  this.#destroyed = true;
347
+ runRuntimeTeardowns(this);
348
+ this.#unsubscribeHistoricalData?.();
287
349
  this.#session.destroy();
288
350
  this.#engine.dispose();
289
351
  this.#listeners.clear();
352
+ this.#drawingChangeListeners.clear();
290
353
  this.#emit({ type: 'destroyed' });
291
354
  }
292
355
  #buildDocument(drawings) {
@@ -324,6 +387,21 @@ export class DrawableWorkspaceRuntime {
324
387
  #sceneKind() {
325
388
  return 'panes' in this.#scene ? 'chart' : 'time-series';
326
389
  }
390
+ #historicalDataPort() {
391
+ const candidate = this.#engine;
392
+ return (typeof candidate.subscribeHistoricalDataRequests === 'function' &&
393
+ typeof candidate.commitHistoricalData === 'function' &&
394
+ typeof candidate.rejectHistoricalData === 'function')
395
+ ? candidate
396
+ : undefined;
397
+ }
398
+ #requireHistoricalDataPort() {
399
+ const port = this.#historicalDataPort();
400
+ if (port === undefined) {
401
+ throw new Error('HISTORICAL_DATA_UNSUPPORTED: the current Scene Adapter has no historical data port.');
402
+ }
403
+ return port;
404
+ }
327
405
  #emit(event) {
328
406
  const envelope = deepFreeze({
329
407
  protocol: WORKSPACE_EVENT_PROTOCOL,
@@ -340,6 +418,14 @@ export class DrawableWorkspaceRuntime {
340
418
  // 单个监听器抛错不改变状态、不阻断其他监听器。
341
419
  }
342
420
  }
421
+ for (const listener of this.#drawingChangeListeners) {
422
+ try {
423
+ listener();
424
+ }
425
+ catch {
426
+ // 编辑器监听失败不影响 Runtime 状态。
427
+ }
428
+ }
343
429
  }
344
430
  #assertUsable() {
345
431
  if (this.#destroyed || this.#session.state === 'terminal-error') {
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /** Web Runtime npm 包版本;ChartScene runtimeVersion 是独立的数据契约版本。 */
2
- export declare const WEB_RUNTIME_PACKAGE_VERSION: "0.7.2";
2
+ export declare const WEB_RUNTIME_PACKAGE_VERSION: "0.9.2";
3
3
  export { SUPPORTED_OVERLAYS } from '@baron1996/klinecharts-adapter';
4
4
  export * from './cross-period/coordinator.js';
5
5
  export * from './drawing/capabilities.js';
@@ -13,5 +13,6 @@ export * from './runtime.js';
13
13
  export * from './time-series-runtime.js';
14
14
  export * from './time-series-types.js';
15
15
  export * from './toolbar/standard-toolbar.js';
16
+ export * from './toolbar/drawing-floating-toolbar.js';
16
17
  export * from './types.js';
17
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,eAAO,MAAM,2BAA2B,EAAG,OAAgB,CAAC;AAE5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,oCAAoC,CAAC;AACnD,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,cAAc,CAAC;AAC7B,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,eAAO,MAAM,2BAA2B,EAAG,OAAgB,CAAC;AAE5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,oCAAoC,CAAC;AACnD,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,cAAc,CAAC;AAC7B,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uCAAuC,CAAC;AACtD,cAAc,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /** Web Runtime npm 包版本;ChartScene runtimeVersion 是独立的数据契约版本。 */
2
- export const WEB_RUNTIME_PACKAGE_VERSION = '0.7.2';
2
+ export const WEB_RUNTIME_PACKAGE_VERSION = '0.9.2';
3
3
  export { SUPPORTED_OVERLAYS } from '@baron1996/klinecharts-adapter';
4
4
  export * from './cross-period/coordinator.js';
5
5
  export * from './drawing/capabilities.js';
@@ -13,4 +13,5 @@ export * from './runtime.js';
13
13
  export * from './time-series-runtime.js';
14
14
  export * from './time-series-types.js';
15
15
  export * from './toolbar/standard-toolbar.js';
16
+ export * from './toolbar/drawing-floating-toolbar.js';
16
17
  export * from './types.js';
package/dist/runtime.d.ts CHANGED
@@ -35,11 +35,14 @@ export declare class KLineSceneRuntime implements DrawingRuntimeCapability, Runt
35
35
  getDrawing(id: string): EngineDrawingSnapshot | undefined;
36
36
  updateDrawingStyles(id: string, styles: SceneOverlay['styles']): EngineDrawingSnapshot;
37
37
  updateDrawingText(id: string, text: string): EngineDrawingSnapshot;
38
+ updateDrawingLocked(id: string, locked: boolean): EngineDrawingSnapshot;
38
39
  removeDrawing(id: string): boolean;
39
40
  requestDrawingDelete(id: string): void;
40
41
  getSelectedDrawingId(): string | undefined;
41
42
  selectDrawing(id: string | null): void;
42
43
  hitTestDrawing(point: EnginePixelCoordinate): string | null;
44
+ getDrawingMutationState(): 'ready';
45
+ subscribeDrawingChanges(listener: () => void): () => void;
43
46
  exportArtifact(fileName?: string): {
44
47
  bytes: Uint8Array;
45
48
  mediaType: 'application/json';
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}