@jsenv/navi 0.10.1 → 0.11.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.
- package/dist/jsenv_navi.js +13858 -23295
- package/dist/jsenv_navi.js.map +1281 -0
- package/package.json +5 -7
- package/index.js +0 -122
- package/src/action_private_properties.js +0 -11
- package/src/action_proxy_test.html +0 -353
- package/src/action_run_states.js +0 -5
- package/src/actions.js +0 -1401
- package/src/browser_integration/browser_integration.js +0 -216
- package/src/browser_integration/document_back_and_forward.js +0 -17
- package/src/browser_integration/document_loading_signal.js +0 -100
- package/src/browser_integration/document_state_signal.js +0 -9
- package/src/browser_integration/document_url_signal.js +0 -9
- package/src/browser_integration/use_is_visited.js +0 -19
- package/src/browser_integration/via_history.js +0 -232
- package/src/browser_integration/via_navigation.js +0 -168
- package/src/components/action_execution/form_context.js +0 -5
- package/src/components/action_execution/render_actionable_component.jsx +0 -29
- package/src/components/action_execution/use_action.js +0 -99
- package/src/components/action_execution/use_execute_action.js +0 -177
- package/src/components/action_execution/use_run_on_mount.js +0 -9
- package/src/components/action_renderer.jsx +0 -125
- package/src/components/callout/callout.js +0 -990
- package/src/components/callout/callout_demo.html +0 -201
- package/src/components/callout/test_dynamic_positioning.html +0 -161
- package/src/components/callout/test_html_document_iframe.html +0 -182
- package/src/components/demos/0_button_demo.html +0 -707
- package/src/components/demos/10_column_reordering_debug.html +0 -277
- package/src/components/demos/11_table_selection_debug.html +0 -432
- package/src/components/demos/1_checkbox_demo.html +0 -754
- package/src/components/demos/2_input_textual_demo.html +0 -286
- package/src/components/demos/3_radio_demo.html +0 -874
- package/src/components/demos/4_select_demo.html +0 -100
- package/src/components/demos/5_list_scrollable_demo.html +0 -153
- package/src/components/demos/6_tablist_demo.html +0 -77
- package/src/components/demos/7_table_selection_demo.html +0 -176
- package/src/components/demos/8_table_fixed_headers_demo.html +0 -584
- package/src/components/demos/9_table_column_drag_demo.html +0 -325
- package/src/components/demos/action/0_button_demo.html +0 -204
- package/src/components/demos/action/10_shortcuts_demo.html +0 -189
- package/src/components/demos/action/11_nested_shortcuts_demo.xhtml +0 -401
- package/src/components/demos/action/1_input_text_demo.html +0 -876
- package/src/components/demos/action/2_form_multiple.html +0 -303
- package/src/components/demos/action/3_details_demo.html +0 -203
- package/src/components/demos/action/4_input_checkbox_demo.html +0 -731
- package/src/components/demos/action/5_input_checkbox_state_demo.html +0 -270
- package/src/components/demos/action/6_checkbox_list_demo.html +0 -341
- package/src/components/demos/action/7_radio_list_demo.html +0 -357
- package/src/components/demos/action/8_editable_demo.html +0 -431
- package/src/components/demos/action/9_link_demo.html +0 -194
- package/src/components/demos/demo.md +0 -0
- package/src/components/demos/route/basic/basic.html +0 -14
- package/src/components/demos/route/basic/basic_route_demo.jsx +0 -224
- package/src/components/demos/route/multi/multi.html +0 -14
- package/src/components/demos/route/multi/multi_route_demo.jsx +0 -277
- package/src/components/demos/ui_transition/0_action_renderer_ui_transition_demo.html +0 -695
- package/src/components/demos/ui_transition/1_nested_ui_transition_demo.html +0 -429
- package/src/components/demos/ui_transition/2_height_transition_test.html +0 -295
- package/src/components/details/details.jsx +0 -245
- package/src/components/details/summary_marker.jsx +0 -141
- package/src/components/edition/editable.jsx +0 -186
- package/src/components/error_boundary_context.js +0 -9
- package/src/components/field/README.md +0 -247
- package/src/components/field/button.jsx +0 -429
- package/src/components/field/checkbox_list.jsx +0 -185
- package/src/components/field/collect_form_element_values.js +0 -82
- package/src/components/field/custom_field.js +0 -106
- package/src/components/field/form.jsx +0 -209
- package/src/components/field/input.jsx +0 -16
- package/src/components/field/input_checkbox.jsx +0 -434
- package/src/components/field/input_radio.jsx +0 -432
- package/src/components/field/input_textual.jsx +0 -389
- package/src/components/field/label.jsx +0 -46
- package/src/components/field/radio_list.jsx +0 -183
- package/src/components/field/select.jsx +0 -256
- package/src/components/field/use_action_events.js +0 -132
- package/src/components/field/use_form_events.js +0 -59
- package/src/components/field/use_ui_state_controller.js +0 -506
- package/src/components/item_tracker/README.md +0 -461
- package/src/components/item_tracker/use_isolated_item_tracker.jsx +0 -209
- package/src/components/item_tracker/use_isolated_item_tracker_demo.html +0 -148
- package/src/components/item_tracker/use_isolated_item_tracker_demo.jsx +0 -460
- package/src/components/item_tracker/use_item_tracker.jsx +0 -143
- package/src/components/item_tracker/use_item_tracker_demo.html +0 -207
- package/src/components/item_tracker/use_item_tracker_demo.jsx +0 -216
- package/src/components/keyboard_shortcuts/active_keyboard_shortcuts.jsx +0 -87
- package/src/components/keyboard_shortcuts/aria_key_shortcuts.js +0 -61
- package/src/components/keyboard_shortcuts/keyboard_key_meta.js +0 -17
- package/src/components/keyboard_shortcuts/keyboard_shortcuts.js +0 -371
- package/src/components/keyboard_shortcuts/os.js +0 -9
- package/src/components/layout/demos/demo_flex.html +0 -638
- package/src/components/layout/demos/demo_layout_style_buttons.html +0 -351
- package/src/components/layout/demos/demo_layout_style_input.html +0 -226
- package/src/components/layout/demos/demo_layout_style_text.html +0 -514
- package/src/components/layout/flex.jsx +0 -109
- package/src/components/layout/layout_context.jsx +0 -3
- package/src/components/layout/spacing.jsx +0 -20
- package/src/components/layout/use_layout_style.js +0 -249
- package/src/components/link/link.jsx +0 -267
- package/src/components/link/link_with_icon.jsx +0 -52
- package/src/components/loader/loader_background.jsx +0 -372
- package/src/components/loader/loading_spinner.jsx +0 -68
- package/src/components/loader/network_speed.js +0 -83
- package/src/components/loader/rectangle_loading.jsx +0 -244
- package/src/components/props_composition/demos/demo_with_props_style.html +0 -81
- package/src/components/props_composition/with_props_class_name.js +0 -37
- package/src/components/props_composition/with_props_style.js +0 -26
- package/src/components/route.jsx +0 -19
- package/src/components/selection/selection.jsx +0 -1583
- package/src/components/svg/font_sized_svg.jsx +0 -59
- package/src/components/svg/icon_and_text.jsx +0 -21
- package/src/components/svg/svg_mask_overlay.jsx +0 -105
- package/src/components/table/drag/table_drag.jsx +0 -506
- package/src/components/table/resize/table_resize.jsx +0 -650
- package/src/components/table/resize/table_size.js +0 -43
- package/src/components/table/selection/table_selection.js +0 -106
- package/src/components/table/selection/table_selection.jsx +0 -203
- package/src/components/table/sticky/sticky_group.js +0 -354
- package/src/components/table/sticky/table_sticky.js +0 -25
- package/src/components/table/sticky/table_sticky.jsx +0 -501
- package/src/components/table/table.jsx +0 -721
- package/src/components/table/table_css.js +0 -211
- package/src/components/table/table_ui.jsx +0 -49
- package/src/components/table/use_cells_and_columns.js +0 -90
- package/src/components/table/use_object_array_to_cells.js +0 -46
- package/src/components/table/z_indexes.js +0 -23
- package/src/components/tablist/tablist.jsx +0 -99
- package/src/components/text/demos/demo_text_and_icon.html +0 -421
- package/src/components/text/overflow.jsx +0 -15
- package/src/components/text/text.jsx +0 -83
- package/src/components/text/text_and_count.jsx +0 -28
- package/src/components/ui_transition.jsx +0 -128
- package/src/components/use_auto_focus.js +0 -94
- package/src/components/use_batch_during_render.js +0 -33
- package/src/components/use_debounce_true.js +0 -31
- package/src/components/use_dependencies_diff.js +0 -35
- package/src/components/use_focus_group.js +0 -20
- package/src/components/use_initial_value.js +0 -78
- package/src/components/use_is_visited.js +0 -19
- package/src/components/use_ref_array.js +0 -38
- package/src/components/use_signal_sync.js +0 -50
- package/src/components/use_stable_callback.js +0 -68
- package/src/components/use_state_array.js +0 -47
- package/src/docs/actions.md +0 -250
- package/src/docs/demos/resource/action_status.jsx +0 -42
- package/src/docs/demos/resource/demo.md +0 -1
- package/src/docs/demos/resource/resource_demo_0.html +0 -84
- package/src/docs/demos/resource/resource_demo_10_post_gc.html +0 -364
- package/src/docs/demos/resource/resource_demo_11_describe_many.html +0 -362
- package/src/docs/demos/resource/resource_demo_2.html +0 -173
- package/src/docs/demos/resource/resource_demo_3_filtered_users.html +0 -415
- package/src/docs/demos/resource/resource_demo_4_details.html +0 -284
- package/src/docs/demos/resource/resource_demo_5_renderer_lazy.html +0 -115
- package/src/docs/demos/resource/resource_demo_6_gc.html +0 -217
- package/src/docs/demos/resource/resource_demo_7_child_gc.html +0 -240
- package/src/docs/demos/resource/resource_demo_8_proxy_gc.html +0 -319
- package/src/docs/demos/resource/resource_demo_9_describe_one.html +0 -472
- package/src/docs/demos/resource/tata.jsx +0 -3
- package/src/docs/demos/resource/toto.jsx +0 -3
- package/src/docs/demos/user_nav/user_nav.html +0 -12
- package/src/docs/demos/user_nav/user_nav.jsx +0 -330
- package/src/docs/resource_dependencies.md +0 -103
- package/src/docs/resource_with_params.md +0 -80
- package/src/navi_css_vars.js +0 -14
- package/src/notes.md +0 -34
- package/src/route/route.js +0 -596
- package/src/route/route.xtest.html +0 -228
- package/src/store/array_signal_store.js +0 -537
- package/src/store/local_storage_signal.js +0 -17
- package/src/store/resource_graph.js +0 -1304
- package/src/store/tests/resource_graph_autoreload_demo.html +0 -12
- package/src/store/tests/resource_graph_autoreload_demo.jsx +0 -964
- package/src/store/tests/resource_graph_dependencies.test_manual.js +0 -95
- package/src/store/value_in_local_storage.js +0 -187
- package/src/symbol_object_signal.js +0 -1
- package/src/use_action_data.js +0 -10
- package/src/use_action_status.js +0 -47
- package/src/utils/add_many_event_listeners.js +0 -15
- package/src/utils/array_add_remove.js +0 -61
- package/src/utils/array_signal.js +0 -15
- package/src/utils/compare_two_js_values.js +0 -172
- package/src/utils/execute_with_cleanup.js +0 -21
- package/src/utils/get_caller_info.js +0 -85
- package/src/utils/is_signal.js +0 -20
- package/src/utils/js_value_weak_map.js +0 -162
- package/src/utils/js_value_weak_map_demo.html +0 -690
- package/src/utils/merge_two_js_values.js +0 -53
- package/src/utils/stringify_for_display.js +0 -131
- package/src/utils/weak_effect.js +0 -48
- package/src/validation/constraints/confirm_constraint.js +0 -14
- package/src/validation/constraints/create_unique_value_constraint.js +0 -27
- package/src/validation/constraints/native_constraints.js +0 -338
- package/src/validation/constraints/readonly_constraint.js +0 -41
- package/src/validation/constraints/same_as_constraint.js +0 -42
- package/src/validation/constraints/single_space_constraint.js +0 -13
- package/src/validation/custom_constraint_validation.js +0 -793
- package/src/validation/custom_message.js +0 -18
- package/src/validation/demos/browser_style.png +0 -0
- package/src/validation/demos/demo_same_as_constraint.html +0 -259
- package/src/validation/demos/form_validation_demo.html +0 -142
- package/src/validation/demos/form_validation_demo_preact.html +0 -87
- package/src/validation/demos/form_validation_native_popover_demo.html +0 -168
- package/src/validation/demos/form_validation_vs_native_demo.html +0 -172
- package/src/validation/hooks/use_constraints.js +0 -23
- package/src/validation/hooks/use_custom_validation_ref.js +0 -73
- package/src/validation/hooks/use_validation_message.js +0 -19
- package/src/validation/input_change_effect.js +0 -106
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
export const getCallerInfo = (targetFunction = null, additionalOffset = 0) => {
|
|
2
|
-
const originalPrepareStackTrace = Error.prepareStackTrace;
|
|
3
|
-
try {
|
|
4
|
-
Error.prepareStackTrace = (_, stack) => stack;
|
|
5
|
-
|
|
6
|
-
const error = new Error();
|
|
7
|
-
const stack = error.stack;
|
|
8
|
-
|
|
9
|
-
if (!stack || stack.length === 0 || !Array.isArray(stack)) {
|
|
10
|
-
return { raw: "unknown" };
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
let targetIndex = -1;
|
|
14
|
-
|
|
15
|
-
if (targetFunction) {
|
|
16
|
-
// ✅ Chercher la fonction cible par référence directe
|
|
17
|
-
for (let i = 0; i < stack.length; i++) {
|
|
18
|
-
const frame = stack[i];
|
|
19
|
-
const frameFunction = frame.getFunction();
|
|
20
|
-
|
|
21
|
-
// ✅ Comparaison directe par référence
|
|
22
|
-
if (frameFunction === targetFunction) {
|
|
23
|
-
targetIndex = i;
|
|
24
|
-
break;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
if (targetIndex === -1) {
|
|
29
|
-
return {
|
|
30
|
-
raw: `target function not found in stack`,
|
|
31
|
-
targetFunction: targetFunction.name,
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// ✅ Prendre la fonction qui appelle targetFunction + offset
|
|
36
|
-
const callerIndex = targetIndex + 1 + additionalOffset;
|
|
37
|
-
|
|
38
|
-
if (callerIndex >= stack.length) {
|
|
39
|
-
return {
|
|
40
|
-
raw: `caller at offset ${additionalOffset} not found`,
|
|
41
|
-
targetFunction: targetFunction.name,
|
|
42
|
-
requestedIndex: callerIndex,
|
|
43
|
-
stackLength: stack.length,
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const callerFrame = stack[callerIndex];
|
|
48
|
-
return {
|
|
49
|
-
file: callerFrame.getFileName(),
|
|
50
|
-
line: callerFrame.getLineNumber(),
|
|
51
|
-
column: callerFrame.getColumnNumber(),
|
|
52
|
-
function: callerFrame.getFunctionName() || "<anonymous>",
|
|
53
|
-
raw: callerFrame.toString(),
|
|
54
|
-
targetFunction: targetFunction.name,
|
|
55
|
-
offset: additionalOffset,
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// ✅ Comportement original si pas de targetFunction
|
|
60
|
-
if (stack.length > 2) {
|
|
61
|
-
const callerFrame = stack[2 + additionalOffset];
|
|
62
|
-
|
|
63
|
-
if (!callerFrame) {
|
|
64
|
-
return {
|
|
65
|
-
raw: `caller at offset ${additionalOffset} not found`,
|
|
66
|
-
requestedIndex: 2 + additionalOffset,
|
|
67
|
-
stackLength: stack.length,
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
return {
|
|
72
|
-
file: callerFrame.getFileName(),
|
|
73
|
-
line: callerFrame.getLineNumber(),
|
|
74
|
-
column: callerFrame.getColumnNumber(),
|
|
75
|
-
function: callerFrame.getFunctionName() || "<anonymous>",
|
|
76
|
-
raw: callerFrame.toString(),
|
|
77
|
-
offset: additionalOffset,
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
return { raw: "unknown" };
|
|
82
|
-
} finally {
|
|
83
|
-
Error.prepareStackTrace = originalPrepareStackTrace;
|
|
84
|
-
}
|
|
85
|
-
};
|
package/src/utils/is_signal.js
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
export const isSignal = (value) => {
|
|
2
|
-
return getSignalType(value) !== null;
|
|
3
|
-
};
|
|
4
|
-
|
|
5
|
-
const BRAND_SYMBOL = Symbol.for("preact-signals");
|
|
6
|
-
export const getSignalType = (value) => {
|
|
7
|
-
if (!value || typeof value !== "object") {
|
|
8
|
-
return null;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
if (value.brand !== BRAND_SYMBOL) {
|
|
12
|
-
return null;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
if (typeof value._fn === "function") {
|
|
16
|
-
return "computed";
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
return "signal";
|
|
20
|
-
};
|
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* jsenv/navi - createJsValueWeakMap
|
|
3
|
-
*
|
|
4
|
-
* Key/value cache with true ephemeron behavior and deep equality support.
|
|
5
|
-
*
|
|
6
|
-
* Features:
|
|
7
|
-
* - Mutual retention: key keeps value alive, value keeps key alive
|
|
8
|
-
* - Deep equality: different objects with same content are treated as identical keys
|
|
9
|
-
* - Automatic GC: entries are eligible for collection when unreferenced
|
|
10
|
-
* - Iteration support: can iterate over live entries for deep equality lookup
|
|
11
|
-
*
|
|
12
|
-
* Implementation:
|
|
13
|
-
* - Dual WeakMap (key->value, value->key) provides ephemeron behavior
|
|
14
|
-
* - WeakRef registry enables iteration without preventing GC
|
|
15
|
-
* - Primitives stored in Map (permanent retention - avoid for keys)
|
|
16
|
-
*
|
|
17
|
-
* Use case: Action caching where params (key) and action (value) should have
|
|
18
|
-
* synchronized lifetimes while allowing natural garbage collection.
|
|
19
|
-
*/
|
|
20
|
-
|
|
21
|
-
import { compareTwoJsValues } from "./compare_two_js_values.js";
|
|
22
|
-
|
|
23
|
-
export const createJsValueWeakMap = () => {
|
|
24
|
-
// Core ephemeron maps for mutual retention
|
|
25
|
-
const keyToValue = new WeakMap(); // key -> value
|
|
26
|
-
const valueToKey = new WeakMap(); // value -> key
|
|
27
|
-
|
|
28
|
-
// Registry for iteration/deep equality (holds WeakRefs)
|
|
29
|
-
const keyRegistry = new Set(); // Set of WeakRef(key)
|
|
30
|
-
|
|
31
|
-
// Primitive cache
|
|
32
|
-
const primitiveCache = new Map();
|
|
33
|
-
|
|
34
|
-
function cleanupKeyRegistry() {
|
|
35
|
-
for (const keyRef of keyRegistry) {
|
|
36
|
-
if (keyRef.deref() === undefined) {
|
|
37
|
-
keyRegistry.delete(keyRef);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
return {
|
|
43
|
-
*[Symbol.iterator]() {
|
|
44
|
-
cleanupKeyRegistry();
|
|
45
|
-
for (const keyRef of keyRegistry) {
|
|
46
|
-
const key = keyRef.deref();
|
|
47
|
-
if (key && keyToValue.has(key)) {
|
|
48
|
-
yield [key, keyToValue.get(key)];
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
for (const [k, v] of primitiveCache) {
|
|
52
|
-
yield [k, v];
|
|
53
|
-
}
|
|
54
|
-
},
|
|
55
|
-
|
|
56
|
-
get(key) {
|
|
57
|
-
const isObject =
|
|
58
|
-
key && (typeof key === "object" || typeof key === "function");
|
|
59
|
-
if (isObject) {
|
|
60
|
-
// Fast path: exact key match
|
|
61
|
-
if (keyToValue.has(key)) {
|
|
62
|
-
return keyToValue.get(key);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// Slow path: deep equality search
|
|
66
|
-
cleanupKeyRegistry();
|
|
67
|
-
for (const keyRef of keyRegistry) {
|
|
68
|
-
const existingKey = keyRef.deref();
|
|
69
|
-
if (existingKey && compareTwoJsValues(existingKey, key)) {
|
|
70
|
-
return keyToValue.get(existingKey);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
return undefined;
|
|
74
|
-
}
|
|
75
|
-
return primitiveCache.get(key);
|
|
76
|
-
},
|
|
77
|
-
|
|
78
|
-
set(key, value) {
|
|
79
|
-
const isObject =
|
|
80
|
-
key && (typeof key === "object" || typeof key === "function");
|
|
81
|
-
if (isObject) {
|
|
82
|
-
cleanupKeyRegistry();
|
|
83
|
-
|
|
84
|
-
// Remove existing deep-equal key
|
|
85
|
-
for (const keyRef of keyRegistry) {
|
|
86
|
-
const existingKey = keyRef.deref();
|
|
87
|
-
if (existingKey && compareTwoJsValues(existingKey, key)) {
|
|
88
|
-
const existingValue = keyToValue.get(existingKey);
|
|
89
|
-
keyToValue.delete(existingKey);
|
|
90
|
-
valueToKey.delete(existingValue);
|
|
91
|
-
keyRegistry.delete(keyRef);
|
|
92
|
-
break;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// Set ephemeron pair
|
|
97
|
-
keyToValue.set(key, value);
|
|
98
|
-
valueToKey.set(value, key);
|
|
99
|
-
keyRegistry.add(new WeakRef(key));
|
|
100
|
-
} else {
|
|
101
|
-
primitiveCache.set(key, value);
|
|
102
|
-
}
|
|
103
|
-
},
|
|
104
|
-
|
|
105
|
-
delete(key) {
|
|
106
|
-
const isObject =
|
|
107
|
-
key && (typeof key === "object" || typeof key === "function");
|
|
108
|
-
if (isObject) {
|
|
109
|
-
cleanupKeyRegistry();
|
|
110
|
-
|
|
111
|
-
// Try exact match first
|
|
112
|
-
if (keyToValue.has(key)) {
|
|
113
|
-
const value = keyToValue.get(key);
|
|
114
|
-
keyToValue.delete(key);
|
|
115
|
-
valueToKey.delete(value);
|
|
116
|
-
|
|
117
|
-
// Remove from registry
|
|
118
|
-
for (const keyRef of keyRegistry) {
|
|
119
|
-
if (keyRef.deref() === key) {
|
|
120
|
-
keyRegistry.delete(keyRef);
|
|
121
|
-
break;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
return true;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// Try deep equality
|
|
128
|
-
for (const keyRef of keyRegistry) {
|
|
129
|
-
const existingKey = keyRef.deref();
|
|
130
|
-
if (existingKey && compareTwoJsValues(existingKey, key)) {
|
|
131
|
-
const value = keyToValue.get(existingKey);
|
|
132
|
-
keyToValue.delete(existingKey);
|
|
133
|
-
valueToKey.delete(value);
|
|
134
|
-
keyRegistry.delete(keyRef);
|
|
135
|
-
return true;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
return false;
|
|
139
|
-
}
|
|
140
|
-
return primitiveCache.delete(key);
|
|
141
|
-
},
|
|
142
|
-
|
|
143
|
-
getStats: () => {
|
|
144
|
-
cleanupKeyRegistry();
|
|
145
|
-
const aliveKeys = Array.from(keyRegistry).filter((ref) =>
|
|
146
|
-
ref.deref(),
|
|
147
|
-
).length;
|
|
148
|
-
|
|
149
|
-
return {
|
|
150
|
-
ephemeronPairs: {
|
|
151
|
-
total: keyRegistry.size,
|
|
152
|
-
alive: aliveKeys,
|
|
153
|
-
note: "True ephemeron: key ↔ value mutual retention via dual WeakMap",
|
|
154
|
-
},
|
|
155
|
-
primitive: {
|
|
156
|
-
total: primitiveCache.size,
|
|
157
|
-
note: "Primitive keys never GC'd",
|
|
158
|
-
},
|
|
159
|
-
};
|
|
160
|
-
},
|
|
161
|
-
};
|
|
162
|
-
};
|