@blac/react 2.0.0-rc.0 → 2.0.0-rc.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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/index.cjs +397 -12
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +373 -0
- package/dist/index.d.ts +372 -3
- package/dist/index.js +372 -0
- package/dist/index.js.map +1 -1
- package/package.json +20 -14
- package/dist/index.d.ts.map +0 -1
- package/dist/useBloc.d.ts +0 -20
- package/dist/useBloc.d.ts.map +0 -1
- package/dist/useBloc.js +0 -175
- package/dist/useBloc.js.map +0 -1
- package/dist/useExternalBlocStore.d.ts +0 -31
- package/dist/useExternalBlocStore.d.ts.map +0 -1
- package/dist/useExternalBlocStore.js +0 -93
- package/dist/useExternalBlocStore.js.map +0 -1
package/dist/useBloc.js
DELETED
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const core_1 = require("@blac/core");
|
|
4
|
-
const react_1 = require("react");
|
|
5
|
-
/**
|
|
6
|
-
* React hook for integrating with Blac state management
|
|
7
|
-
*/
|
|
8
|
-
function useBloc(blocConstructor, options) {
|
|
9
|
-
// Create a unique identifier for this hook instance
|
|
10
|
-
const renderCount = (0, react_1.useRef)(0);
|
|
11
|
-
renderCount.current++;
|
|
12
|
-
const componentRef = (0, react_1.useRef)({});
|
|
13
|
-
// Get component name for debugging
|
|
14
|
-
const componentName = (0, react_1.useRef)('');
|
|
15
|
-
if (!componentName.current) {
|
|
16
|
-
// Try to get component name from stack trace
|
|
17
|
-
try {
|
|
18
|
-
const error = new Error();
|
|
19
|
-
const stack = error.stack || '';
|
|
20
|
-
const lines = stack.split('\n');
|
|
21
|
-
// Look for React component in stack - try multiple patterns
|
|
22
|
-
for (let i = 2; i < lines.length && i < 15; i++) {
|
|
23
|
-
const line = lines[i];
|
|
24
|
-
// Pattern 1: "at ComponentName" or "at Object.ComponentName"
|
|
25
|
-
let match = line.match(/at\s+(?:Object\.)?([A-Z][a-zA-Z0-9_$]*)/);
|
|
26
|
-
// Pattern 2: Look for component files like "ComponentName.tsx"
|
|
27
|
-
if (!match) {
|
|
28
|
-
match = line.match(/([A-Z][a-zA-Z0-9_$]*)\.tsx/);
|
|
29
|
-
}
|
|
30
|
-
// Pattern 3: Look for render functions
|
|
31
|
-
if (!match) {
|
|
32
|
-
match = line.match(/render([A-Z][a-zA-Z0-9_$]*)/);
|
|
33
|
-
if (match && match[1]) {
|
|
34
|
-
match[1] = match[1]; // Use the part after "render"
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
if (match &&
|
|
38
|
-
match[1] !== 'Object' &&
|
|
39
|
-
!match[1].startsWith('use') &&
|
|
40
|
-
!match[1].startsWith('Use')) {
|
|
41
|
-
componentName.current = match[1];
|
|
42
|
-
break;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
// If still no name, try to get it from the bloc constructor name
|
|
46
|
-
if (!componentName.current) {
|
|
47
|
-
const blocName = blocConstructor.name;
|
|
48
|
-
if (blocName && blocName !== 'Object') {
|
|
49
|
-
// Remove 'Cubit' or 'Bloc' suffix to guess component name
|
|
50
|
-
componentName.current =
|
|
51
|
-
blocName.replace(/(Cubit|Bloc)$/, '') || 'Component';
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
componentName.current = 'Component';
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
catch (e) {
|
|
59
|
-
componentName.current = 'Component';
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
// Pass through options
|
|
63
|
-
const normalizedOptions = options;
|
|
64
|
-
// Generate instance id from static props if needed
|
|
65
|
-
const instanceKey = (0, react_1.useMemo)(() => {
|
|
66
|
-
if (normalizedOptions?.instanceId) {
|
|
67
|
-
return normalizedOptions.instanceId;
|
|
68
|
-
}
|
|
69
|
-
if (normalizedOptions?.staticProps) {
|
|
70
|
-
return (0, core_1.generateInstanceIdFromProps)(normalizedOptions.staticProps) || null;
|
|
71
|
-
}
|
|
72
|
-
return null;
|
|
73
|
-
}, [normalizedOptions?.instanceId, normalizedOptions?.staticProps]);
|
|
74
|
-
// Track adapter creation - recreate when instanceId/staticProps change
|
|
75
|
-
const adapter = (0, react_1.useMemo)(() => {
|
|
76
|
-
const newAdapter = new core_1.BlacAdapter({
|
|
77
|
-
componentRef: componentRef,
|
|
78
|
-
blocConstructor,
|
|
79
|
-
}, {
|
|
80
|
-
instanceId: normalizedOptions?.instanceId,
|
|
81
|
-
dependencies: normalizedOptions?.dependencies,
|
|
82
|
-
staticProps: normalizedOptions?.staticProps,
|
|
83
|
-
onMount: normalizedOptions?.onMount,
|
|
84
|
-
onUnmount: normalizedOptions?.onUnmount,
|
|
85
|
-
});
|
|
86
|
-
// Set component name for rerender logging
|
|
87
|
-
if (componentName.current) {
|
|
88
|
-
newAdapter.setComponentName(componentName.current);
|
|
89
|
-
}
|
|
90
|
-
return newAdapter;
|
|
91
|
-
}, [blocConstructor, instanceKey]); // Recreate adapter when instance key changes
|
|
92
|
-
// Reset tracking at the start of each render to ensure we only track
|
|
93
|
-
// properties accessed during the current render
|
|
94
|
-
adapter.resetTracking();
|
|
95
|
-
// Notify plugins about render
|
|
96
|
-
adapter.notifyRender();
|
|
97
|
-
// Update adapter options when they change (except instanceId/staticProps which recreate the adapter)
|
|
98
|
-
const optionsChangeCount = (0, react_1.useRef)(0);
|
|
99
|
-
(0, react_1.useEffect)(() => {
|
|
100
|
-
optionsChangeCount.current++;
|
|
101
|
-
adapter.options = {
|
|
102
|
-
instanceId: normalizedOptions?.instanceId,
|
|
103
|
-
dependencies: normalizedOptions?.dependencies,
|
|
104
|
-
staticProps: normalizedOptions?.staticProps,
|
|
105
|
-
onMount: normalizedOptions?.onMount,
|
|
106
|
-
onUnmount: normalizedOptions?.onUnmount,
|
|
107
|
-
};
|
|
108
|
-
}, [
|
|
109
|
-
adapter,
|
|
110
|
-
normalizedOptions?.dependencies,
|
|
111
|
-
normalizedOptions?.onMount,
|
|
112
|
-
normalizedOptions?.onUnmount,
|
|
113
|
-
]);
|
|
114
|
-
// Register as consumer and handle lifecycle
|
|
115
|
-
const mountEffectCount = (0, react_1.useRef)(0);
|
|
116
|
-
(0, react_1.useEffect)(() => {
|
|
117
|
-
mountEffectCount.current++;
|
|
118
|
-
adapter.mount();
|
|
119
|
-
return () => {
|
|
120
|
-
adapter.unmount();
|
|
121
|
-
};
|
|
122
|
-
}, [adapter]);
|
|
123
|
-
// Subscribe to state changes using useSyncExternalStore
|
|
124
|
-
const subscribeMemoCount = (0, react_1.useRef)(0);
|
|
125
|
-
const subscribe = (0, react_1.useMemo)(() => {
|
|
126
|
-
subscribeMemoCount.current++;
|
|
127
|
-
let subscriptionCount = 0;
|
|
128
|
-
return (onStoreChange) => {
|
|
129
|
-
subscriptionCount++;
|
|
130
|
-
const unsubscribe = adapter.createSubscription({
|
|
131
|
-
onChange: () => {
|
|
132
|
-
onStoreChange();
|
|
133
|
-
},
|
|
134
|
-
});
|
|
135
|
-
return () => {
|
|
136
|
-
unsubscribe();
|
|
137
|
-
};
|
|
138
|
-
};
|
|
139
|
-
}, [adapter]);
|
|
140
|
-
const snapshotCount = (0, react_1.useRef)(0);
|
|
141
|
-
const serverSnapshotCount = (0, react_1.useRef)(0);
|
|
142
|
-
const rawState = (0, react_1.useSyncExternalStore)(subscribe,
|
|
143
|
-
// Get snapshot
|
|
144
|
-
() => {
|
|
145
|
-
snapshotCount.current++;
|
|
146
|
-
const bloc = adapter.blocInstance;
|
|
147
|
-
const state = bloc.state;
|
|
148
|
-
return state;
|
|
149
|
-
},
|
|
150
|
-
// Get server snapshot (same as client for now)
|
|
151
|
-
() => {
|
|
152
|
-
const bloc = adapter.blocInstance;
|
|
153
|
-
serverSnapshotCount.current++;
|
|
154
|
-
const state = bloc.state;
|
|
155
|
-
return state;
|
|
156
|
-
});
|
|
157
|
-
// Create proxies for fine-grained tracking (if enabled)
|
|
158
|
-
const stateMemoCount = (0, react_1.useRef)(0);
|
|
159
|
-
const finalState = (0, react_1.useMemo)(() => {
|
|
160
|
-
stateMemoCount.current++;
|
|
161
|
-
// Always return the proxy - it will handle whether to actually proxy or not
|
|
162
|
-
const proxyState = adapter.getStateProxy();
|
|
163
|
-
return proxyState;
|
|
164
|
-
}, [rawState, adapter]);
|
|
165
|
-
const blocMemoCount = (0, react_1.useRef)(0);
|
|
166
|
-
const finalBloc = (0, react_1.useMemo)(() => {
|
|
167
|
-
blocMemoCount.current++;
|
|
168
|
-
const proxyBloc = adapter.getBlocProxy();
|
|
169
|
-
return proxyBloc;
|
|
170
|
-
}, [adapter]);
|
|
171
|
-
// Log final hook return
|
|
172
|
-
return [finalState, finalBloc];
|
|
173
|
-
}
|
|
174
|
-
exports.default = useBloc;
|
|
175
|
-
//# sourceMappingURL=useBloc.js.map
|
package/dist/useBloc.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useBloc.js","sourceRoot":"","sources":["../src/useBloc.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { BlocBase, BlocConstructor, BlocState } from '@blac/core';
|
|
2
|
-
interface ExternalStoreOptions<B extends BlocBase<any>> {
|
|
3
|
-
id?: string;
|
|
4
|
-
staticProps?: ConstructorParameters<BlocConstructor<B>>[0];
|
|
5
|
-
selector?: (currentState: BlocState<B>, previousState: BlocState<B>, instance: B) => any[];
|
|
6
|
-
}
|
|
7
|
-
interface ExternalStore<T> {
|
|
8
|
-
getSnapshot: () => T | undefined;
|
|
9
|
-
subscribe: (listener: () => void) => () => void;
|
|
10
|
-
getServerSnapshot?: () => T | undefined;
|
|
11
|
-
}
|
|
12
|
-
interface ExternalBlocStoreResult<B extends BlocBase<any>> {
|
|
13
|
-
externalStore: ExternalStore<BlocState<B>>;
|
|
14
|
-
instance: {
|
|
15
|
-
current: B | null;
|
|
16
|
-
};
|
|
17
|
-
usedKeys: {
|
|
18
|
-
current: Set<string>;
|
|
19
|
-
};
|
|
20
|
-
usedClassPropKeys: {
|
|
21
|
-
current: Set<string>;
|
|
22
|
-
};
|
|
23
|
-
rid: string;
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Hook for using an external bloc store
|
|
27
|
-
* Provides low-level access to bloc instances for use with React's useSyncExternalStore
|
|
28
|
-
*/
|
|
29
|
-
export default function useExternalBlocStore<B extends BlocConstructor<BlocBase<any>>>(blocConstructor: B, options?: ExternalStoreOptions<InstanceType<B>>): ExternalBlocStoreResult<InstanceType<B>>;
|
|
30
|
-
export {};
|
|
31
|
-
//# sourceMappingURL=useExternalBlocStore.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useExternalBlocStore.d.ts","sourceRoot":"","sources":["../src/useExternalBlocStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,QAAQ,EACR,eAAe,EACf,SAAS,EAEV,MAAM,YAAY,CAAC;AAGpB,UAAU,oBAAoB,CAAC,CAAC,SAAS,QAAQ,CAAC,GAAG,CAAC;IACpD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,qBAAqB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,EAAE,CACT,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,EAC1B,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC,EAC3B,QAAQ,EAAE,CAAC,KACR,GAAG,EAAE,CAAC;CACZ;AAED,UAAU,aAAa,CAAC,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACjC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IAChD,iBAAiB,CAAC,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;CACzC;AAED,UAAU,uBAAuB,CAAC,CAAC,SAAS,QAAQ,CAAC,GAAG,CAAC;IACvD,aAAa,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,QAAQ,EAAE;QAAE,OAAO,EAAE,CAAC,GAAG,IAAI,CAAA;KAAE,CAAC;IAChC,QAAQ,EAAE;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;KAAE,CAAC;IACnC,iBAAiB,EAAE;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;KAAE,CAAC;IAC5C,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAC1C,CAAC,SAAS,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAExC,eAAe,EAAE,CAAC,EAClB,OAAO,GAAE,oBAAoB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAM,GAClD,uBAAuB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAsG1C"}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.default = useExternalBlocStore;
|
|
4
|
-
const core_1 = require("@blac/core");
|
|
5
|
-
const react_1 = require("react");
|
|
6
|
-
/**
|
|
7
|
-
* Hook for using an external bloc store
|
|
8
|
-
* Provides low-level access to bloc instances for use with React's useSyncExternalStore
|
|
9
|
-
*/
|
|
10
|
-
function useExternalBlocStore(blocConstructor, options = {}) {
|
|
11
|
-
const ridRef = (0, react_1.useRef)(`external-${(0, core_1.generateUUID)()}`);
|
|
12
|
-
const usedKeysRef = (0, react_1.useRef)(new Set());
|
|
13
|
-
const usedClassPropKeysRef = (0, react_1.useRef)(new Set());
|
|
14
|
-
const instanceRef = (0, react_1.useRef)(null);
|
|
15
|
-
// Get or create bloc instance
|
|
16
|
-
const bloc = (0, react_1.useMemo)(() => {
|
|
17
|
-
const blac = core_1.Blac.getInstance();
|
|
18
|
-
const base = blocConstructor;
|
|
19
|
-
// For isolated blocs, always create a new instance
|
|
20
|
-
if (base.constructor.isolated ||
|
|
21
|
-
blocConstructor.isolated) {
|
|
22
|
-
const newBloc = new blocConstructor(options?.staticProps);
|
|
23
|
-
const uniqueId = options?.id || `${blocConstructor.name}_${(0, core_1.generateUUID)()}`;
|
|
24
|
-
newBloc._id = uniqueId;
|
|
25
|
-
blac.activateBloc(newBloc);
|
|
26
|
-
return newBloc;
|
|
27
|
-
}
|
|
28
|
-
// For shared blocs, use the existing getBloc logic
|
|
29
|
-
return blac.getBloc(blocConstructor, {
|
|
30
|
-
id: options?.id,
|
|
31
|
-
constructorParams: options?.staticProps,
|
|
32
|
-
});
|
|
33
|
-
}, [blocConstructor, options?.id]);
|
|
34
|
-
// Create external store interface
|
|
35
|
-
const externalStore = (0, react_1.useMemo)(() => ({
|
|
36
|
-
getSnapshot: () => {
|
|
37
|
-
const currentInstance = instanceRef.current;
|
|
38
|
-
return currentInstance ? currentInstance.state : undefined;
|
|
39
|
-
},
|
|
40
|
-
subscribe: (listener) => {
|
|
41
|
-
const currentInstance = instanceRef.current;
|
|
42
|
-
if (!currentInstance) {
|
|
43
|
-
// Return no-op unsubscribe if no instance
|
|
44
|
-
return () => { };
|
|
45
|
-
}
|
|
46
|
-
// Wrap listener to handle errors gracefully
|
|
47
|
-
const safeListener = (newState, oldState) => {
|
|
48
|
-
try {
|
|
49
|
-
// Reset tracking keys on each listener call
|
|
50
|
-
usedKeysRef.current.clear();
|
|
51
|
-
usedClassPropKeysRef.current.clear();
|
|
52
|
-
// Call selector if provided
|
|
53
|
-
if (options.selector && currentInstance) {
|
|
54
|
-
options.selector(newState, oldState, currentInstance);
|
|
55
|
-
}
|
|
56
|
-
// Call listener with state if it expects it
|
|
57
|
-
if (listener.length > 0) {
|
|
58
|
-
listener(newState);
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
listener();
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
catch (error) {
|
|
65
|
-
console.error('Listener error in useExternalBlocStore:', error);
|
|
66
|
-
// Don't rethrow to prevent breaking other listeners
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
// Store the previous state for the listener
|
|
70
|
-
let previousState = currentInstance.state;
|
|
71
|
-
const unsubscribe = currentInstance.subscribe((state) => {
|
|
72
|
-
const oldState = previousState;
|
|
73
|
-
previousState = state;
|
|
74
|
-
safeListener(state, oldState);
|
|
75
|
-
});
|
|
76
|
-
return unsubscribe;
|
|
77
|
-
},
|
|
78
|
-
getServerSnapshot: () => {
|
|
79
|
-
const currentInstance = instanceRef.current;
|
|
80
|
-
return currentInstance ? currentInstance.state : undefined;
|
|
81
|
-
},
|
|
82
|
-
}), []);
|
|
83
|
-
// Update instance ref
|
|
84
|
-
instanceRef.current = bloc;
|
|
85
|
-
return {
|
|
86
|
-
externalStore,
|
|
87
|
-
instance: instanceRef,
|
|
88
|
-
usedKeys: usedKeysRef,
|
|
89
|
-
usedClassPropKeys: usedClassPropKeysRef,
|
|
90
|
-
rid: ridRef.current,
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
//# sourceMappingURL=useExternalBlocStore.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useExternalBlocStore.js","sourceRoot":"","sources":["../src/useExternalBlocStore.ts"],"names":[],"mappings":"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"}
|