@forgeax/interface 0.9.2 → 0.9.3

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.
@@ -1,6 +1,4 @@
1
- import type { Cleanup } from '../extension-foundation/types';
2
- import type { PanelActionContribution, PanelActionsApi } from './types';
3
- export interface PanelActionRegistry extends PanelActionsApi {
4
- contribute(owner: string, actions: readonly PanelActionContribution[]): Cleanup;
5
- }
6
- export declare function createPanelActionRegistry(): PanelActionRegistry;
1
+ import { type PanelActionRegistry as Registry } from '@forgeax/app-shell/application';
2
+ import type { PanelActionContribution } from './types';
3
+ export type PanelActionRegistry = Registry<PanelActionContribution>;
4
+ export declare const createPanelActionRegistry: () => Registry<PanelActionContribution>;
@@ -1,62 +1,2 @@
1
- export function createPanelActionRegistry() {
2
- const entries = [];
3
- const listeners = new Set();
4
- let cache = null;
5
- let version = 0;
6
- const emit = () => {
7
- cache = null;
8
- version++;
9
- for (const listener of [...listeners])
10
- listener();
11
- };
12
- // Batch-deferred notification: data mutations (push/splice) happen
13
- // immediately so reads (list/all) always return fresh data, but listener
14
- // notifications are deferred to a microtask. This avoids triggering
15
- // forceStoreRerender (useSyncExternalStore) during React 19's commit
16
- // phase, which otherwise causes "Maximum update depth exceeded".
17
- let emitScheduled = false;
18
- const scheduleEmit = () => {
19
- cache = null;
20
- if (emitScheduled)
21
- return;
22
- emitScheduled = true;
23
- queueMicrotask(() => {
24
- emitScheduled = false;
25
- emit();
26
- });
27
- };
28
- const all = () => {
29
- if (cache)
30
- return cache;
31
- cache = entries.flatMap((entry) => entry.actions).sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
32
- return cache;
33
- };
34
- return {
35
- contribute(owner, actions) {
36
- const entry = { owner, actions };
37
- entries.push(entry);
38
- scheduleEmit();
39
- let removed = false;
40
- return () => {
41
- if (removed)
42
- return;
43
- removed = true;
44
- const index = entries.indexOf(entry);
45
- if (index >= 0)
46
- entries.splice(index, 1);
47
- scheduleEmit();
48
- };
49
- },
50
- list(panelId) {
51
- return all().filter((action) => action.panelId === panelId);
52
- },
53
- all,
54
- onChange(listener) {
55
- listeners.add(listener);
56
- return () => { listeners.delete(listener); };
57
- },
58
- version() {
59
- return version;
60
- },
61
- };
62
- }
1
+ import { createPanelActionRegistry as createRegistry, } from '@forgeax/app-shell/application';
2
+ export const createPanelActionRegistry = (createRegistry);
@@ -1,6 +1,4 @@
1
- import type { Cleanup } from '../extension-foundation/types';
2
- import type { PanelControlContribution, PanelControlsApi } from './types';
3
- export interface PanelControlRegistry extends PanelControlsApi {
4
- contribute(owner: string, controls: readonly PanelControlContribution[]): Cleanup;
5
- }
6
- export declare function createPanelControlRegistry(): PanelControlRegistry;
1
+ import { type PanelControlRegistry as Registry } from '@forgeax/app-shell/application';
2
+ import type { PanelControlContribution } from './types';
3
+ export type PanelControlRegistry = Registry<PanelControlContribution>;
4
+ export declare const createPanelControlRegistry: () => Registry<PanelControlContribution>;
@@ -1,54 +1,2 @@
1
- export function createPanelControlRegistry() {
2
- const entries = [];
3
- const listeners = new Set();
4
- let version = 0;
5
- const emit = () => {
6
- version++;
7
- for (const listener of [...listeners])
8
- listener();
9
- };
10
- // Batch-deferred notification: data mutations (push/splice) happen
11
- // immediately so reads (list/get) always return fresh data, but listener
12
- // notifications are deferred to a microtask. This avoids triggering
13
- // forceStoreRerender (useSyncExternalStore) during React 19's commit
14
- // phase, which otherwise causes "Maximum update depth exceeded".
15
- let emitScheduled = false;
16
- const scheduleEmit = () => {
17
- if (emitScheduled)
18
- return;
19
- emitScheduled = true;
20
- queueMicrotask(() => {
21
- emitScheduled = false;
22
- emit();
23
- });
24
- };
25
- const list = () => entries.flatMap((entry) => entry.controls);
26
- return {
27
- contribute(owner, controls) {
28
- const entry = { owner, controls };
29
- entries.push(entry);
30
- scheduleEmit();
31
- let removed = false;
32
- return () => {
33
- if (removed)
34
- return;
35
- removed = true;
36
- const index = entries.indexOf(entry);
37
- if (index >= 0)
38
- entries.splice(index, 1);
39
- scheduleEmit();
40
- };
41
- },
42
- get(id) {
43
- return list().find((control) => control.id === id);
44
- },
45
- list,
46
- onChange(listener) {
47
- listeners.add(listener);
48
- return () => { listeners.delete(listener); };
49
- },
50
- version() {
51
- return version;
52
- },
53
- };
54
- }
1
+ import { createPanelControlRegistry as createRegistry, } from '@forgeax/app-shell/application';
2
+ export const createPanelControlRegistry = (createRegistry);
@@ -1,62 +1,2 @@
1
- export function createPanelActionRegistry() {
2
- const entries = [];
3
- const listeners = new Set();
4
- let cache = null;
5
- let version = 0;
6
- const emit = () => {
7
- cache = null;
8
- version++;
9
- for (const listener of [...listeners])
10
- listener();
11
- };
12
- // Batch-deferred notification: data mutations (push/splice) happen
13
- // immediately so reads (list/all) always return fresh data, but listener
14
- // notifications are deferred to a microtask. This avoids triggering
15
- // forceStoreRerender (useSyncExternalStore) during React 19's commit
16
- // phase, which otherwise causes "Maximum update depth exceeded".
17
- let emitScheduled = false;
18
- const scheduleEmit = () => {
19
- cache = null;
20
- if (emitScheduled)
21
- return;
22
- emitScheduled = true;
23
- queueMicrotask(() => {
24
- emitScheduled = false;
25
- emit();
26
- });
27
- };
28
- const all = () => {
29
- if (cache)
30
- return cache;
31
- cache = entries.flatMap((entry) => entry.actions).sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
32
- return cache;
33
- };
34
- return {
35
- contribute(owner, actions) {
36
- const entry = { owner, actions };
37
- entries.push(entry);
38
- scheduleEmit();
39
- let removed = false;
40
- return () => {
41
- if (removed)
42
- return;
43
- removed = true;
44
- const index = entries.indexOf(entry);
45
- if (index >= 0)
46
- entries.splice(index, 1);
47
- scheduleEmit();
48
- };
49
- },
50
- list(panelId) {
51
- return all().filter((action) => action.panelId === panelId);
52
- },
53
- all,
54
- onChange(listener) {
55
- listeners.add(listener);
56
- return () => { listeners.delete(listener); };
57
- },
58
- version() {
59
- return version;
60
- },
61
- };
62
- }
1
+ import { createPanelActionRegistry as createRegistry, } from '@forgeax/app-shell/application';
2
+ export const createPanelActionRegistry = (createRegistry);
@@ -1,54 +1,2 @@
1
- export function createPanelControlRegistry() {
2
- const entries = [];
3
- const listeners = new Set();
4
- let version = 0;
5
- const emit = () => {
6
- version++;
7
- for (const listener of [...listeners])
8
- listener();
9
- };
10
- // Batch-deferred notification: data mutations (push/splice) happen
11
- // immediately so reads (list/get) always return fresh data, but listener
12
- // notifications are deferred to a microtask. This avoids triggering
13
- // forceStoreRerender (useSyncExternalStore) during React 19's commit
14
- // phase, which otherwise causes "Maximum update depth exceeded".
15
- let emitScheduled = false;
16
- const scheduleEmit = () => {
17
- if (emitScheduled)
18
- return;
19
- emitScheduled = true;
20
- queueMicrotask(() => {
21
- emitScheduled = false;
22
- emit();
23
- });
24
- };
25
- const list = () => entries.flatMap((entry) => entry.controls);
26
- return {
27
- contribute(owner, controls) {
28
- const entry = { owner, controls };
29
- entries.push(entry);
30
- scheduleEmit();
31
- let removed = false;
32
- return () => {
33
- if (removed)
34
- return;
35
- removed = true;
36
- const index = entries.indexOf(entry);
37
- if (index >= 0)
38
- entries.splice(index, 1);
39
- scheduleEmit();
40
- };
41
- },
42
- get(id) {
43
- return list().find((control) => control.id === id);
44
- },
45
- list,
46
- onChange(listener) {
47
- listeners.add(listener);
48
- return () => { listeners.delete(listener); };
49
- },
50
- version() {
51
- return version;
52
- },
53
- };
54
- }
1
+ import { createPanelControlRegistry as createRegistry, } from '@forgeax/app-shell/application';
2
+ export const createPanelControlRegistry = (createRegistry);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forgeax/interface",
3
- "version": "0.9.2",
3
+ "version": "0.9.3",
4
4
  "type": "module",
5
5
  "description": "ForgeaX product interface shell and application composition boundary.",
6
6
  "license": "Apache-2.0",
@@ -92,7 +92,7 @@
92
92
  "lint:dep": "depcruise -c .dependency-cruiser.cjs src"
93
93
  },
94
94
  "dependencies": {
95
- "@forgeax/app-shell": "0.88.0",
95
+ "@forgeax/app-shell": "0.89.0",
96
96
  "@forgeax/extension-host": "0.3.2",
97
97
  "@forgeax/extension-platform": "0.5.0",
98
98
  "@forgeax/toolkit": "0.1.2",