Skip to content

Commit 199be21

Browse files
committed
bringing back _CPProvider
1 parent 1c87e0a commit 199be21

File tree

2 files changed

+33
-3
lines changed

2 files changed

+33
-3
lines changed

codepress-swc-plugin/src/lib.rs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3474,16 +3474,29 @@ impl VisitMut for CodePressTransform {
34743474

34753475
// JS-based metadata map mode: store metadata in window.__CODEPRESS_MAP__ instead of DOM
34763476
// Only codepress-data-fp attribute is on DOM (already added above at line 3273-3278)
3477-
// No wrapper elements, no additional DOM attributes - cleanest possible approach
34783477
if self.use_js_metadata_map {
34793478
// Store metadata in the map keyed by fp
34803479
self.metadata_map.insert(fp_value.clone(), MetadataEntry {
3481-
callsite: callsite_value,
3480+
callsite: callsite_value.clone(),
34823481
edit_candidates: cands_enc.clone(),
34833482
source_kinds: kinds_enc.clone(),
34843483
symbol_refs: symrefs_enc.clone(),
34853484
});
3486-
// No DOM attributes or wrappers needed - extension reads from JS map
3485+
3486+
// For custom components, still wrap with __CPProvider for HMR support
3487+
// The provider uses useSyncExternalStore to trigger re-renders on preview updates
3488+
// Without this, HMR preview updates don't trigger proper re-renders
3489+
if is_custom_call && !block_provider && !self.skip_provider_wrap {
3490+
let meta = ProviderMeta {
3491+
cs: callsite_value,
3492+
c: cands_enc,
3493+
k: kinds_enc,
3494+
fp: fp_value,
3495+
};
3496+
self.wrap_with_provider(node, meta);
3497+
}
3498+
3499+
// No DOM attributes needed - extension reads from JS map
34873500
return;
34883501
}
34893502

src/types.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,21 @@ export interface CodePressPluginOptions {
1414
* Used by CodePress HMR to substitute env vars in dynamically built modules.
1515
*/
1616
env_vars?: Record<string, string>;
17+
/**
18+
* Store metadata in window.__CODEPRESS_MAP__ instead of DOM attributes.
19+
* When true, only codepress-data-fp attribute is added to DOM.
20+
* This avoids React reconciliation issues and keeps DOM clean.
21+
* Defaults to true.
22+
*/
23+
useJsMetadataMap?: boolean;
24+
/**
25+
* Skip wrapping custom components with __CPProvider.
26+
* Useful for frameworks that handle HMR differently (e.g., Next.js).
27+
*/
28+
skipProviderWrap?: boolean;
29+
/**
30+
* Skip wrapping custom components with <codepress-marker>.
31+
* Only used when useJsMetadataMap is false.
32+
*/
33+
skipMarkerWrap?: boolean;
1734
}

0 commit comments

Comments
 (0)