@@ -110,6 +110,32 @@ def _write_manifest(work_dir: Path, dependency: dict) -> None:
110110 (work_dir / "package.json" ).write_text (json .dumps (manifest , indent = 2 ) + "\n " )
111111
112112
113+ def _write_source_manifest (work_dir : Path , source_dir : Path ) -> None :
114+ dependencies : dict [str , str ] = {}
115+ for package in ("synapse-sdk" , "synapse-core" ):
116+ package_json = json .loads (
117+ (source_dir / "packages" / package / "package.json" ).read_text ()
118+ )
119+ for name , version in package_json .get ("peerDependencies" , {}).items ():
120+ existing = dependencies .get (name )
121+ if existing is not None and existing != version :
122+ raise RuntimeError (
123+ f"Synapse source packages disagree on { name } : { existing } != { version } "
124+ )
125+ dependencies [name ] = version
126+ manifest = {
127+ "name" : "foc-devnet-synapse-source-e2e" ,
128+ "private" : True ,
129+ "type" : "module" ,
130+ "dependencies" : dependencies ,
131+ }
132+ (work_dir / "package.json" ).write_text (json .dumps (manifest , indent = 2 ) + "\n " )
133+ policy = source_dir / "pnpm-workspace.yaml"
134+ if not policy .is_file ():
135+ raise RuntimeError (f"Synapse source has no pnpm workspace policy: { policy } " )
136+ shutil .copyfile (policy , work_dir / policy .name )
137+
138+
113139def _copy_scenarios (work_dir : Path ) -> None :
114140 source = _scenario_dir ()
115141 if not source .is_dir ():
@@ -126,6 +152,11 @@ def _source_pnpm_version(source_dir: Path) -> str:
126152 return package_manager .removeprefix ("pnpm@" )
127153
128154
155+ def _has_source_package_closure (source_dir : Path ) -> bool :
156+ node_modules = source_dir / "packages" / "synapse-sdk" / "node_modules"
157+ return (node_modules / "@filoz" / "synapse-core" ).is_dir ()
158+
159+
129160def _source_commit (source_dir : Path ) -> str :
130161 result = subprocess .run (
131162 ["git" , "-C" , str (source_dir ), "rev-parse" , "HEAD" ],
@@ -197,34 +228,41 @@ def prepare_synapse_runtime(work_dir: Path) -> SynapseRuntime:
197228
198229 pnpm_version = _source_pnpm_version (source_dir )
199230 source_node_modules = source_dir / "packages" / "synapse-sdk" / "node_modules"
200- has_runtime_closure = (source_node_modules / "viem" ).is_dir () and (
201- source_node_modules / "@filoz" / "synapse-core"
202- ).is_dir ()
203- if not local_source or not has_runtime_closure :
231+ has_package_closure = _has_source_package_closure (source_dir )
232+ if not local_source or not has_package_closure :
204233 if not run_cmd (
205234 [
206235 "pnpm" ,
207236 "install" ,
208- "--frozen-lockfile" ,
237+ "--no- frozen-lockfile" ,
209238 "--prod" ,
210239 "--ignore-scripts" ,
211240 "--filter" ,
212241 "@filoz/synapse-sdk..." ,
213242 ],
214243 cwd = str (source_dir ),
215- label = f"install Synapse production runtime (pnpm@{ pnpm_version } )" ,
244+ label = f"install Synapse production dependencies (pnpm@{ pnpm_version } )" ,
216245 ):
217- raise RuntimeError ("failed to install Synapse production runtime" )
218- if not source_node_modules .is_dir ():
219- raise RuntimeError (
220- f"Synapse production install has no SDK node_modules: { source_node_modules } "
221- )
222- runtime_node_modules = work_dir / "node_modules"
223- if runtime_node_modules .exists () or runtime_node_modules .is_symlink ():
246+ raise RuntimeError ("failed to install Synapse production dependencies" )
247+ if not _has_source_package_closure (source_dir ):
224248 raise RuntimeError (
225- f"Synapse runtime node_modules already exists : { runtime_node_modules } "
249+ f"Synapse source install has no package closure : { source_node_modules } "
226250 )
227- runtime_node_modules .symlink_to (source_node_modules , target_is_directory = True )
251+ _write_source_manifest (work_dir , source_dir )
252+ if not run_cmd (
253+ [
254+ "pnpm" ,
255+ "install" ,
256+ "--no-frozen-lockfile" ,
257+ "--prod" ,
258+ "--ignore-scripts" ,
259+ ],
260+ cwd = str (work_dir ),
261+ label = "install Synapse peer runtime" ,
262+ ):
263+ raise RuntimeError ("failed to install Synapse peer runtime" )
264+ if not (work_dir / "node_modules" / "viem" ).is_dir ():
265+ raise RuntimeError ("Synapse peer runtime has no viem installation" )
228266 provenance = f"{ provenance } (pnpm@{ pnpm_version } )"
229267 runtime = SynapseRuntime (work_dir , "source" , provenance , source_dir )
230268 else :
0 commit comments