1- import type { Annotation , SharePayload , SerializedAnnotation } from "../types" ;
1+ import type {
2+ Annotation ,
3+ PlanMeta ,
4+ SharePayload ,
5+ SerializedAnnotation ,
6+ } from "../types" ;
27
38function toBase64Url ( bytes : Uint8Array ) : string {
49 return btoa ( String . fromCharCode ( ...bytes ) )
@@ -134,7 +139,7 @@ function deserializeAnnotation(s: SerializedAnnotation): Annotation {
134139const SHARE_BASE_URL = "https://ofershap.github.io/cursor-plan-preview/" ;
135140
136141export async function encodeShareUrl (
137- plan : { name : string ; overview : string ; body : string } ,
142+ plan : { name : string ; overview : string ; body : string ; meta ?: PlanMeta } ,
138143 annotations : Annotation [ ] ,
139144) : Promise < string > {
140145 const payload : SharePayload = {
@@ -143,14 +148,21 @@ export async function encodeShareUrl(
143148 o : plan . overview ,
144149 a : annotations . map ( serializeAnnotation ) ,
145150 } ;
151+ if ( plan . meta ) {
152+ const m : SharePayload [ "m" ] = { } ;
153+ if ( plan . meta . repo ) m . r = plan . meta . repo ;
154+ if ( plan . meta . branch ) m . b = plan . meta . branch ;
155+ if ( plan . meta . sharedBy ) m . s = plan . meta . sharedBy ;
156+ if ( Object . keys ( m ) . length > 0 ) payload . m = m ;
157+ }
146158 const json = JSON . stringify ( payload ) ;
147159 const compressed = await compress ( json ) ;
148160 const encoded = toBase64Url ( compressed ) ;
149161 return `${ SHARE_BASE_URL } #${ encoded } ` ;
150162}
151163
152164export async function decodeShareUrl ( hash : string ) : Promise < {
153- plan : { name : string ; overview : string ; body : string } ;
165+ plan : { name : string ; overview : string ; body : string ; meta ?: PlanMeta } ;
154166 annotations : Annotation [ ] ;
155167} | null > {
156168 try {
@@ -159,8 +171,17 @@ export async function decodeShareUrl(hash: string): Promise<{
159171 const bytes = fromBase64Url ( clean ) ;
160172 const json = await decompress ( bytes ) ;
161173 const payload = JSON . parse ( json ) as SharePayload ;
174+ const meta : PlanMeta = { } ;
175+ if ( payload . m ?. r ) meta . repo = payload . m . r ;
176+ if ( payload . m ?. b ) meta . branch = payload . m . b ;
177+ if ( payload . m ?. s ) meta . sharedBy = payload . m . s ;
162178 return {
163- plan : { name : payload . n , overview : payload . o , body : payload . p } ,
179+ plan : {
180+ name : payload . n ,
181+ overview : payload . o ,
182+ body : payload . p ,
183+ ...( Object . keys ( meta ) . length > 0 ? { meta } : { } ) ,
184+ } ,
164185 annotations : payload . a . map ( deserializeAnnotation ) ,
165186 } ;
166187 } catch {
0 commit comments