@pie-players/pie-default-tool-loaders 0.3.74 → 1.0.0-beta.0

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 (37) hide show
  1. package/README.md +116 -107
  2. package/dist/calculator-providers/CortexToolProvider.d.ts +0 -3
  3. package/dist/calculator-providers/CortexToolProvider.js +0 -14
  4. package/dist/calculator-providers/DesmosToolProvider.d.ts +0 -3
  5. package/dist/calculator-providers/DesmosToolProvider.js +0 -14
  6. package/dist/calculator-providers/GeoGebraToolProvider.d.ts +0 -3
  7. package/dist/calculator-providers/GeoGebraToolProvider.js +0 -14
  8. package/dist/calculator-providers/LazyCalculatorToolProvider.d.ts +3 -5
  9. package/dist/calculator-providers/LazyCalculatorToolProvider.js +1 -1
  10. package/dist/content-alternates.d.ts +1 -1
  11. package/dist/index.d.ts +3 -3
  12. package/dist/index.js +2 -2
  13. package/dist/packaged-capability-composition.d.ts +22 -50
  14. package/dist/packaged-capability-composition.js +61 -266
  15. package/dist/registrations/accessibility-tools.d.ts +1 -5
  16. package/dist/registrations/accessibility-tools.js +11 -49
  17. package/dist/registrations/audio-transcript.d.ts +8 -7
  18. package/dist/registrations/audio-transcript.js +12 -8
  19. package/dist/registrations/calculator.d.ts +2 -6
  20. package/dist/registrations/calculator.js +17 -39
  21. package/dist/registrations/dictionary-tools.d.ts +6 -5
  22. package/dist/registrations/dictionary-tools.js +21 -26
  23. package/dist/registrations/interaction-tools.d.ts +1 -7
  24. package/dist/registrations/interaction-tools.js +22 -30
  25. package/dist/registrations/measurement-tools.d.ts +1 -5
  26. package/dist/registrations/measurement-tools.js +1 -17
  27. package/dist/registrations/overlay-element-cache.d.ts +3 -1
  28. package/dist/registrations/overlay-element-cache.js +2 -1
  29. package/dist/registrations/overlay-toolbar-render.d.ts +9 -19
  30. package/dist/registrations/overlay-toolbar-render.js +9 -16
  31. package/dist/registrations/selection-actions.d.ts +1 -1
  32. package/dist/registrations/selection-actions.js +1 -1
  33. package/dist/registrations/subject-specific-tools.d.ts +1 -5
  34. package/dist/registrations/subject-specific-tools.js +1 -15
  35. package/dist/registrations/tts.d.ts +2 -8
  36. package/dist/registrations/tts.js +28 -99
  37. package/package.json +22 -23
@@ -2,21 +2,17 @@
2
2
  * The `renderToolbar` shape shared by every packaged capability that puts one
3
3
  * overlay behind one toolbar button.
4
4
  *
5
- * Seven registrations had this inline. What actually varies between them is the
6
- * three options below and nothing else: whether the overlay paints its own chrome
7
- * or takes a draggable window, that window's size, and whether the overlay needs
8
- * the coordinator re-handed on each sync. Everything else — the visibility
9
- * binding, the button, the component-override lookup, the `tool-id` attribute, the
10
- * sync — was identical, which is why one rule landing in three spellings was
11
- * possible: the shell title was `resolveToolRegistrationName` in two files,
12
- * `displayName` in a third and a raw `t(key)` in a fourth.
5
+ * What varies between capabilities is the two options below: whether the overlay
6
+ * paints its own chrome or takes a draggable window, and that window's size. The
7
+ * visibility binding, the button, the component-override lookup, the `tool-id`
8
+ * attribute and the sync are shared, so the shell title has one spelling.
13
9
  *
14
- * Catalog keys are derived from `toolId`, which held at all seven sites:
15
- * `tools.<toolId>.buttonA11y` and `tools.<toolId>.tooltip`. A capability needing a
16
- * different prefix — the dictionary variants, which compose several capabilities
17
- * off one element — keeps its own renderer.
10
+ * Catalog keys are derived from `toolId`: `tools.<toolId>.buttonA11y` and
11
+ * `tools.<toolId>.tooltip`. A capability needing a different prefix — the
12
+ * dictionary variants, which compose several capabilities off one element —
13
+ * keeps its own renderer.
18
14
  */
19
- import { applyOverlaySurface, createScopedVisibilityBinding, createToolElement, resolveToolRegistrationName, syncButtonAndOverlayVisibility, } from "@pie-players/pie-assessment-toolkit/tools/internal";
15
+ import { applyOverlaySurface, createScopedVisibilityBinding, createToolElement, resolveToolRegistrationName, syncButtonAndOverlayVisibility, } from "@pie-players/pie-assessment-toolkit/tools/registration";
20
16
  import { resolveOverlayElement } from "./overlay-element-cache.js";
21
17
  export function renderOverlayToolbar(registration, context, toolbarContext, options = {}) {
22
18
  const { toolId } = registration;
@@ -74,9 +70,6 @@ export function renderOverlayToolbar(registration, context, toolbarContext, opti
74
70
  overlay,
75
71
  isActive: visibility.isActive,
76
72
  });
77
- if (options.handsOverCoordinator && toolbarContext.toolkitCoordinator) {
78
- overlay.toolkitCoordinator = toolbarContext.toolkitCoordinator;
79
- }
80
73
  },
81
74
  subscribeActive: visibility.subscribeActive,
82
75
  };
@@ -12,7 +12,7 @@
12
12
  * cannot originate one at all. Every tool named here also opens from the toolbar and
13
13
  * carries its own term field.
14
14
  */
15
- import type { ToolSelectionAction, ToolSurfaceServices } from "@pie-players/pie-assessment-toolkit/tools/internal";
15
+ import type { ToolSelectionAction, ToolSurfaceServices } from "@pie-players/pie-assessment-toolkit/tools/registration";
16
16
  /**
17
17
  * Actions for the gateway to render, given the services it was handed.
18
18
  *
@@ -12,7 +12,7 @@
12
12
  * cannot originate one at all. Every tool named here also opens from the toolbar and
13
13
  * carries its own term field.
14
14
  */
15
- import { resolveFallbackToolIcon } from "@pie-players/pie-assessment-toolkit/tools/internal";
15
+ import { resolveFallbackToolIcon } from "@pie-players/pie-assessment-toolkit/tools/registration";
16
16
  function asRequestCapable(coordinator) {
17
17
  const candidate = coordinator;
18
18
  if (typeof candidate?.canRequestTool !== "function")
@@ -4,12 +4,8 @@
4
4
  * Registers tools for specific subject areas:
5
5
  * - Graph (coordinate plane)
6
6
  * - Periodic Table (chemistry reference)
7
- *
8
- * Maps to QTI 3.0 standard access features:
9
- * - graph (assessment tool)
10
- * - periodicTable (assessment tool)
11
7
  */
12
- import type { ToolRegistration } from "@pie-players/pie-assessment-toolkit/tools/internal";
8
+ import type { ToolRegistration } from "@pie-players/pie-assessment-toolkit/tools/registration";
13
9
  /**
14
10
  * Graph tool registration
15
11
  *
@@ -4,12 +4,8 @@
4
4
  * Registers tools for specific subject areas:
5
5
  * - Graph (coordinate plane)
6
6
  * - Periodic Table (chemistry reference)
7
- *
8
- * Maps to QTI 3.0 standard access features:
9
- * - graph (assessment tool)
10
- * - periodicTable (assessment tool)
11
7
  */
12
- import { hasMathContent, hasScienceContent, } from "@pie-players/pie-assessment-toolkit/tools/internal";
8
+ import { hasMathContent, hasScienceContent, } from "@pie-players/pie-assessment-toolkit/tools/registration";
13
9
  import { renderOverlayToolbar } from "./overlay-toolbar-render.js";
14
10
  /**
15
11
  * Graph tool registration
@@ -27,11 +23,6 @@ export const graphToolRegistration = {
27
23
  // A floating tool, placed on a section toolbar or on an item toolbar where
28
24
  // the toolkit runs without a section.
29
25
  supportedLevels: ["section", "item"],
30
- // `graphingCalculator` grants the calculator, whose graphing type a host
31
- // selects through render params; the coordinate plane is not that tool.
32
- pnpSupportIds: [
33
- "graph", // QTI 3.0 standard (assessment.graph)
34
- ],
35
26
  /**
36
27
  * Pass 2: Graph is relevant when math content is present
37
28
  */
@@ -66,11 +57,6 @@ export const periodicTableToolRegistration = {
66
57
  // A floating tool, placed on a section toolbar or on an item toolbar where
67
58
  // the toolkit runs without a section.
68
59
  supportedLevels: ["section", "item"],
69
- // PNP support IDs
70
- // Maps to QTI 3.0 standard feature: periodicTable
71
- pnpSupportIds: [
72
- "periodicTable", // QTI 3.0 standard (assessment.periodicTable)
73
- ],
74
60
  /**
75
61
  * Pass 2: Periodic table is relevant when science content is present
76
62
  */
@@ -2,20 +2,14 @@
2
2
  * Text-to-Speech (TTS) Tool Registration
3
3
  *
4
4
  * Registers the TTS tool for reading content aloud.
5
- *
6
- * Maps to QTI 3.0 standard access features:
7
- * - textToSpeech (auditory support)
8
- * - readAloud (auditory support)
9
5
  */
10
- import type { ToolRegistration } from "@pie-players/pie-assessment-toolkit/tools/internal";
11
- export declare const TOOL_ELEMENT_UNMOUNT_CALLBACK_PROP = "__pieToolElementUnmount";
12
- export declare const TOOL_ACTIVE_CHANGE_EVENT = "pie-tool-active-change";
6
+ import type { ToolRegistration } from "@pie-players/pie-assessment-toolkit/tools/registration";
13
7
  /**
14
8
  * Text-to-Speech tool registration
15
9
  *
16
10
  * Supports:
17
11
  * - Reading content aloud using browser TTS or external providers
18
12
  * - Context-aware visibility (shows when readable text is available)
19
- * - All levels except assessment and element
13
+ * - Item and passage levels
20
14
  */
21
15
  export declare const ttsToolRegistration: ToolRegistration;
@@ -2,28 +2,22 @@
2
2
  * Text-to-Speech (TTS) Tool Registration
3
3
  *
4
4
  * Registers the TTS tool for reading content aloud.
5
- *
6
- * Maps to QTI 3.0 standard access features:
7
- * - textToSpeech (auditory support)
8
- * - readAloud (auditory support)
9
5
  */
10
- import { hasReadableText } from "@pie-players/pie-assessment-toolkit/tools/internal";
11
- import { createScopedToolId } from "@pie-players/pie-assessment-toolkit/tools/internal";
12
- import { buildRuntimeTTSConfig, normalizeTTSLayoutMode, normalizeTTSSpeedControlOptions, resolveTTSHostToolbarLayout, resolveTTSLayoutMode, resolveTTSBackend, resolveTTSRuntimeSettings, resolveRuntimeProvider, resolveTransportMode, } from "@pie-players/pie-assessment-toolkit/tools/internal";
13
- import { TTSToolProvider } from "@pie-players/pie-assessment-toolkit/tools/internal";
6
+ import { hasSpokenContent } from "@pie-players/pie-assessment-toolkit/tools/registration";
7
+ import { createScopedToolId, createToolElement, TOOL_ACTIVE_CHANGE_EVENT, } from "@pie-players/pie-assessment-toolkit/tools/registration";
8
+ import { buildRuntimeTTSConfig, normalizeTTSSpeedControlOptions, resolveTTSHostToolbarLayout, resolveTTSRuntimeSettings, } from "@pie-players/pie-assessment-toolkit/tools/registration";
9
+ import { TTSToolProvider } from "@pie-players/pie-assessment-toolkit/tools/registration";
10
+ import { resolveOverlayElement } from "./overlay-element-cache.js";
14
11
  // This package owns the server adapter's import, so the toolkit never names it
15
12
  // and a bundler building the toolkit alone has nothing to resolve.
16
13
  const loadServerTTSProvider = async () => (await import("@pie-players/tts-client-server")).ServerTTSProvider;
17
- const inlineTTSControls = new Map();
18
- export const TOOL_ELEMENT_UNMOUNT_CALLBACK_PROP = "__pieToolElementUnmount";
19
- export const TOOL_ACTIVE_CHANGE_EVENT = "pie-tool-active-change";
20
14
  /**
21
15
  * Text-to-Speech tool registration
22
16
  *
23
17
  * Supports:
24
18
  * - Reading content aloud using browser TTS or external providers
25
19
  * - Context-aware visibility (shows when readable text is available)
26
- * - All levels except assessment and element
20
+ * - Item and passage levels
27
21
  */
28
22
  export const ttsToolRegistration = {
29
23
  toolId: "textToSpeech",
@@ -33,123 +27,69 @@ export const ttsToolRegistration = {
33
27
  descriptionKey: "tools.textToSpeech.description",
34
28
  icon: "volume-up",
35
29
  provider: {
36
- getProviderId: () => "tts",
37
30
  createProvider: (config) => {
38
- const settings = resolveTTSRuntimeSettings(config);
39
- return new TTSToolProvider(resolveTTSBackend(settings), {
31
+ return new TTSToolProvider(resolveTTSRuntimeSettings(config).backend, {
40
32
  loadServerProvider: loadServerTTSProvider,
41
33
  });
42
34
  },
43
- getInitConfig: (config) => {
44
- const settings = resolveTTSRuntimeSettings(config);
45
- const backend = resolveTTSBackend(settings);
46
- const serverProvider = resolveRuntimeProvider(settings, backend);
47
- const transportMode = resolveTransportMode(settings, serverProvider);
48
- return {
49
- backend,
50
- serverProvider,
51
- transportMode,
52
- ...buildRuntimeTTSConfig(settings),
53
- };
54
- },
35
+ getInitConfig: (config) => buildRuntimeTTSConfig(resolveTTSRuntimeSettings(config)),
55
36
  getAuthFetcher: (config) => {
56
37
  const runtimeAuthFetcher = config?.provider?.runtime?.authFetcher;
57
38
  return typeof runtimeAuthFetcher === "function"
58
39
  ? runtimeAuthFetcher
59
40
  : undefined;
60
41
  },
61
- sanitizeConfig: (config) => {
62
- const settings = config.settings && typeof config.settings === "object"
63
- ? { ...config.settings }
64
- : undefined;
65
- if (settings && "layoutMode" in settings) {
66
- settings.layoutMode = normalizeTTSLayoutMode(settings.layoutMode);
67
- }
68
- if (settings && "speedOptions" in settings) {
69
- settings.speedOptions = normalizeTTSSpeedControlOptions(settings.speedOptions);
70
- }
71
- const normalizedConfig = {
72
- ...config,
73
- };
74
- if ("layoutMode" in normalizedConfig) {
75
- normalizedConfig.layoutMode = normalizeTTSLayoutMode(normalizedConfig.layoutMode);
76
- }
77
- if ("speedOptions" in normalizedConfig) {
78
- normalizedConfig.speedOptions = normalizeTTSSpeedControlOptions(normalizedConfig.speedOptions);
79
- }
80
- if (settings) {
81
- normalizedConfig.settings = settings;
82
- }
83
- return normalizedConfig;
84
- },
85
42
  lazy: true,
86
43
  },
44
+ sanitizeConfig: (config) => {
45
+ const normalizedConfig = {
46
+ ...config,
47
+ };
48
+ if ("speedOptions" in normalizedConfig) {
49
+ normalizedConfig.speedOptions = normalizeTTSSpeedControlOptions(normalizedConfig.speedOptions);
50
+ }
51
+ return normalizedConfig;
52
+ },
87
53
  // TTS is inline-only and scoped to item/passage contexts.
88
54
  supportedLevels: ["item", "passage"],
89
- // PNP support IDs that enable this tool
90
- // Maps to QTI 3.0 standard features: textToSpeech, readAloud
91
- pnpSupportIds: [
92
- "textToSpeech", // QTI 3.0 standard (auditory.textToSpeech)
93
- "readAloud", // QTI 3.0 standard (auditory.readAloud)
94
- ],
95
55
  /**
96
56
  * Pass 2: Determine if TTS is relevant in this context
97
57
  *
98
- * TTS is relevant when:
99
- * - Context contains readable text (at least 10 characters)
58
+ * TTS is relevant when the context holds readable text or a catalog idref.
100
59
  */
101
60
  isVisibleInContext(context) {
102
- return hasReadableText(context);
61
+ return hasSpokenContent(context);
103
62
  },
104
- renderToolbar(_context, toolbarContext) {
63
+ renderToolbar(context, toolbarContext) {
105
64
  const resolveRuntimeSettings = () => resolveTTSRuntimeSettings(toolbarContext.toolkitCoordinator?.getToolConfig(this.toolId) ||
106
65
  undefined);
107
66
  const resolveElementSpeedOptions = () => {
108
67
  const runtimeSettings = resolveRuntimeSettings();
109
68
  return normalizeTTSSpeedControlOptions(runtimeSettings.speedOptions);
110
69
  };
111
- const resolveLayoutMode = () => resolveTTSLayoutMode(resolveRuntimeSettings());
112
- const resolveHostLayout = () => resolveTTSHostToolbarLayout(resolveRuntimeSettings());
113
70
  const fullToolId = createScopedToolId(this.toolId, toolbarContext.scope.level, toolbarContext.scope.scopeId);
114
71
  const resolveControlSize = () => {
115
72
  const raw = toolbarContext.ui?.size;
116
73
  return raw === "sm" || raw === "lg" ? raw : "md";
117
74
  };
118
- const ensureElement = () => {
119
- let element = inlineTTSControls.get(fullToolId);
120
- if (element &&
121
- typeof element.isConnected ===
122
- "boolean" &&
123
- !element.isConnected) {
124
- inlineTTSControls.delete(fullToolId);
125
- element = undefined;
126
- }
127
- if (!element) {
128
- element = document.createElement("pie-tool-tts-inline");
129
- element[TOOL_ELEMENT_UNMOUNT_CALLBACK_PROP] = () => {
130
- if (inlineTTSControls.get(fullToolId) === element) {
131
- inlineTTSControls.delete(fullToolId);
132
- }
133
- };
134
- inlineTTSControls.set(fullToolId, element);
135
- }
75
+ const element = resolveOverlayElement(toolbarContext, fullToolId, () => createToolElement(this.toolId, context, toolbarContext, toolbarContext.componentOverrides));
76
+ const applyAttributes = () => {
136
77
  element.setAttribute("catalog-id", toolbarContext.catalogId || toolbarContext.itemId);
137
- element.setAttribute("language", toolbarContext.language || "en-US");
138
78
  element.setAttribute("size", resolveControlSize());
139
- element.setAttribute("layout-mode", resolveLayoutMode());
79
+ element.setAttribute("layout-mode", resolveRuntimeSettings().layoutMode);
140
80
  element.speedOptions = resolveElementSpeedOptions();
141
81
  element.showSingleSpeedOption =
142
82
  resolveRuntimeSettings().showSingleSpeedOption === true;
143
- return element;
144
83
  };
145
- const hostLayout = resolveHostLayout();
84
+ applyAttributes();
85
+ const hostLayout = resolveTTSHostToolbarLayout(resolveRuntimeSettings());
146
86
  return {
147
87
  toolId: this.toolId,
148
88
  button: null,
149
89
  elements: [
150
90
  {
151
- element: ensureElement(),
152
- mount: hostLayout.mount,
91
+ element,
92
+ mount: "before-buttons",
153
93
  layoutHints: {
154
94
  controlsRow: {
155
95
  reserveSpace: hostLayout.controlsRow.reserveSpace,
@@ -162,7 +102,6 @@ export const ttsToolRegistration = {
162
102
  },
163
103
  ],
164
104
  subscribeActive: (callback) => {
165
- const element = ensureElement();
166
105
  const handler = (event) => {
167
106
  const detail = event.detail;
168
107
  callback(detail?.active === true);
@@ -172,17 +111,7 @@ export const ttsToolRegistration = {
172
111
  element.removeEventListener(TOOL_ACTIVE_CHANGE_EVENT, handler);
173
112
  };
174
113
  },
175
- sync: () => {
176
- const element = ensureElement();
177
- element.setAttribute("tool-id", fullToolId);
178
- element.setAttribute("catalog-id", toolbarContext.catalogId || toolbarContext.itemId);
179
- element.setAttribute("language", toolbarContext.language || "en-US");
180
- element.setAttribute("size", resolveControlSize());
181
- element.setAttribute("layout-mode", resolveLayoutMode());
182
- element.speedOptions = resolveElementSpeedOptions();
183
- element.showSingleSpeedOption =
184
- resolveRuntimeSettings().showSingleSpeedOption === true;
185
- },
114
+ sync: applyAttributes,
186
115
  };
187
116
  },
188
117
  };
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@pie-players/pie-default-tool-loaders",
3
- "version": "0.3.74",
3
+ "version": "1.0.0-beta.0",
4
4
  "type": "module",
5
- "description": "Composition layer for the packaged PIE assessment tools: registrations, tag map, placement presets, universal supports and lazy module loaders",
5
+ "description": "Composition layer for the packaged PIE assessment tools: registrations, tag map, placement preset, universal and empty profiles, and lazy module loaders",
6
6
  "repository": {
7
7
  "type": "git",
8
8
  "url": "git+https://github.com/pie-framework/pie-players.git",
@@ -33,30 +33,29 @@
33
33
  "test": "bun test"
34
34
  },
35
35
  "dependencies": {
36
- "@pie-players/pie-assessment-toolkit": "0.3.74",
37
- "@pie-players/pie-calculator": "0.3.74",
38
- "@pie-players/pie-calculator-cortex": "0.3.74",
39
- "@pie-players/pie-calculator-desmos": "0.3.74",
40
- "@pie-players/pie-calculator-geogebra": "0.3.74",
41
- "@pie-players/pie-players-shared": "0.3.74",
42
- "@pie-players/pie-tool-annotation-toolbar": "0.3.74",
43
- "@pie-players/pie-tool-answer-eliminator": "0.3.74",
44
- "@pie-players/pie-tool-calculator-cortex": "0.3.74",
45
- "@pie-players/pie-tool-calculator-geogebra": "0.3.74",
46
- "@pie-players/pie-tool-calculator-shared": "0.3.74",
47
- "@pie-players/pie-tool-dictionary": "0.3.74",
48
- "@pie-players/pie-tool-graph": "0.3.74",
49
- "@pie-players/pie-tool-line-reader": "0.3.74",
50
- "@pie-players/pie-tool-periodic-table": "0.3.74",
51
- "@pie-players/pie-tool-picture-dictionary": "0.3.74",
52
- "@pie-players/pie-tool-protractor": "0.3.74",
53
- "@pie-players/pie-tool-ruler": "0.3.74",
54
- "@pie-players/pie-tool-theme": "0.3.74",
55
- "@pie-players/pie-tool-tts-inline": "0.3.74",
56
- "@pie-players/tts-client-server": "0.3.74"
36
+ "@pie-players/pie-assessment-toolkit": "1.0.0-beta.0",
37
+ "@pie-players/pie-calculator": "1.0.0-beta.0",
38
+ "@pie-players/pie-calculator-cortex": "1.0.0-beta.0",
39
+ "@pie-players/pie-calculator-desmos": "1.0.0-beta.0",
40
+ "@pie-players/pie-calculator-geogebra": "1.0.0-beta.0",
41
+ "@pie-players/pie-players-shared": "1.0.0-beta.0",
42
+ "@pie-players/pie-tool-annotation-toolbar": "1.0.0-beta.0",
43
+ "@pie-players/pie-tool-answer-eliminator": "1.0.0-beta.0",
44
+ "@pie-players/pie-tool-calculator-shared": "1.0.0-beta.0",
45
+ "@pie-players/pie-tool-dictionary": "1.0.0-beta.0",
46
+ "@pie-players/pie-tool-graph": "1.0.0-beta.0",
47
+ "@pie-players/pie-tool-line-reader": "1.0.0-beta.0",
48
+ "@pie-players/pie-tool-periodic-table": "1.0.0-beta.0",
49
+ "@pie-players/pie-tool-picture-dictionary": "1.0.0-beta.0",
50
+ "@pie-players/pie-tool-protractor": "1.0.0-beta.0",
51
+ "@pie-players/pie-tool-ruler": "1.0.0-beta.0",
52
+ "@pie-players/pie-tool-theme": "1.0.0-beta.0",
53
+ "@pie-players/pie-tool-tts-inline": "1.0.0-beta.0",
54
+ "@pie-players/tts-client-server": "1.0.0-beta.0"
57
55
  },
58
56
  "devDependencies": {
59
57
  "@biomejs/biome": "^2.5.15",
58
+ "@happy-dom/global-registrator": "^20.14.5",
60
59
  "typescript": "^5.9.3"
61
60
  },
62
61
  "homepage": "https://github.com/pie-framework/pie-players/tree/master/packages/default-tool-loaders#readme",