@notionhq/custom-blocks-host 0.3.2 → 0.3.4

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/README.md CHANGED
@@ -161,6 +161,18 @@ protocols 3 and 4, the host adds synthetic metadata to outgoing `collectionSchem
161
161
  Protocol 5 SDKs add those read schemas themselves. Host query validation always uses the actual
162
162
  database schema.
163
163
 
164
+ ### External navigation
165
+
166
+ The `openExternalUrl` handler receives an `AbortSignal` and a normalized, absolute HTTP or HTTPS URL
167
+ without credentials, limited to 2,048 JavaScript code units before and after normalization. Adapters
168
+ display the exact URL, obtain approval, and navigate only after approval. They may apply additional
169
+ URL restrictions and should dismiss confirmation UI when the signal aborts on stop or iframe reload.
170
+
171
+ Each iframe permits one pending external-navigation request. A different request receives
172
+ `pending_navigation`; a duplicate of the active request is ignored. Every completed request is
173
+ forgotten, so a subsequent request requires fresh approval. Results are suppressed after stop. The
174
+ runtime redacts `openExternalUrl.url` from `onLog` payloads.
175
+
164
176
  ### Initialization and malformed messages
165
177
 
166
178
  The host validates inbound messages, correlates handshake IDs, and rejects malformed requests.
@@ -236,3 +248,12 @@ The host package bundles the shared [protocol](../protocol/README.md) and expose
236
248
  Use the host APIs instead of posting bridge messages directly or importing protocol implementation
237
249
  files. Runtime source imports schemas from the workspace protocol package; the publish build bundles
238
250
  that dependency into the host package.
251
+
252
+ ## Other exports
253
+
254
+ - `LATEST_BRIDGE_PROTOCOL_VERSION`: the latest bridge protocol version bundled with this host
255
+ package.
256
+ - `isLocalCustomBlockUrl()`: checks whether a URL can serve a local custom block over HTTP or HTTPS.
257
+
258
+ The package also exports types for host configuration, request handlers, messages, and page
259
+ properties.
package/dist/browser.js CHANGED
@@ -1 +1 @@
1
- var zr=6;function Hr(e){let{manifestProperties:n,propertySchemasById:o}=e,s=[];for(let[c,l]of Object.entries(n)){let f=Lr({propertyKey:c,manifestProperty:l,propertySchemasById:o});f!==void 0&&s.push([c,f])}return Object.fromEntries(s)}function Lr(e){let{propertyKey:n,manifestProperty:o,propertySchemasById:s}=e,c=at(o.name),l=Object.entries(s).filter(([f,y])=>y.type===o.type&&(f===n||at(y.name)===c));return l.length===1?l[0][0]:void 0}function at(e){return e.trim().toLowerCase()}var Re,Vr={lang:void 0,message:void 0,abortEarly:void 0,abortPipeEarly:void 0};function Fe(e){return!e&&!Re?Vr:{lang:e?.lang??Re?.lang,message:e?.message,abortEarly:e?.abortEarly??Re?.abortEarly,abortPipeEarly:e?.abortPipeEarly??Re?.abortPipeEarly}}var Gr;function $r(e){return Gr?.get(e)}var Qr;function Xr(e){return Qr?.get(e)}var Wr;function Jr(e,n){return Wr?.get(e)?.get(n)}function ge(e){let n=typeof e;return n==="string"?`"${e}"`:n==="number"||n==="bigint"||n==="boolean"?`${e}`:n==="object"||n==="function"?(e&&Object.getPrototypeOf(e)?.constructor?.name)??"null":n}function B(e,n,o,s,c){let l=c&&"input"in c?c.input:o.value,f=c?.expected??e.expects??null,y=c?.received??ge(l),m={kind:e.kind,type:e.type,input:l,expected:f,received:y,message:`Invalid ${n}: ${f?`Expected ${f} but r`:"R"}eceived ${y}`,requirement:e.requirement,path:c?.path,issues:c?.issues,lang:s.lang,abortEarly:s.abortEarly,abortPipeEarly:s.abortPipeEarly},x=e.kind==="schema",_=c?.message??e.message??Jr(e.reference,m.lang)??(x?Xr(m.lang):null)??s.message??$r(m.lang);_!==void 0&&(m.message=typeof _=="function"?_(m):_),x&&(o.typed=!1),o.issues?o.issues.push(m):o.issues=[m]}var ut=new WeakMap;function z(e){let n=ut.get(e);return n||(n={version:1,vendor:"valibot",validate(o){return e["~run"]({value:o},Fe())}},ut.set(e,n)),n}function Kr(e,n){return Object.prototype.hasOwnProperty.call(e,n)&&n!=="__proto__"&&n!=="prototype"&&n!=="constructor"}function Ue(e,n){let o=[...new Set(e)];return o.length>1?`(${o.join(` ${n} `)})`:o[0]??"never"}var Yr=class extends Error{constructor(e){super(e[0].message),this.name="ValiError",this.issues=e}};function re(e){return{kind:"transformation",type:"brand",reference:re,async:!1,name:e,"~run"(n){return n}}}function be(e){return{kind:"validation",type:"finite",reference:be,async:!1,expects:null,requirement:Number.isFinite,message:e,"~run"(n,o){return n.typed&&!this.requirement(n.value)&&B(this,"finite",n,o),n}}}function Me(e,n){return{kind:"validation",type:"max_length",reference:Me,async:!1,expects:`<=${e}`,requirement:e,message:n,"~run"(o,s){return o.typed&&o.value.length>this.requirement&&B(this,"length",o,s,{received:`${o.value.length}`}),o}}}function ke(e,n){return{kind:"validation",type:"min_length",reference:ke,async:!1,expects:`>=${e}`,requirement:e,message:n,"~run"(o,s){return o.typed&&o.value.length<this.requirement&&B(this,"length",o,s,{received:`${o.value.length}`}),o}}}function Se(e,n){return{kind:"validation",type:"min_value",reference:Se,async:!1,expects:`>=${e instanceof Date?e.toJSON():ge(e)}`,requirement:e,message:n,"~run"(o,s){return o.typed&&!(o.value>=this.requirement)&&B(this,"value",o,s,{received:o.value instanceof Date?o.value.toJSON():ge(o.value)}),o}}}function ze(e,n){return{kind:"validation",type:"regex",reference:ze,async:!1,expects:`${e}`,requirement:e,message:n,"~run"(o,s){return o.typed&&!this.requirement.test(o.value)&&B(this,"format",o,s),o}}}function He(e){return{kind:"transformation",type:"transform",reference:He,async:!1,operation:e,"~run"(n){return n.value=this.operation(n.value),n}}}var lt={abortEarly:!0};function pt(e,n,o){return typeof e.fallback=="function"?e.fallback(n,o):e.fallback}function De(e,n,o){return typeof e.default=="function"?e.default(n,o):e.default}function ft(e,n){return!e["~run"]({value:n},lt).issues}function E(e,n){return{kind:"schema",type:"array",reference:E,expects:"Array",async:!1,item:e,message:n,get"~standard"(){return z(this)},"~run"(o,s){let c=o.value;if(Array.isArray(c)){o.typed=!0,o.value=[];for(let l=0;l<c.length;l++){let f=c[l],y=this.item["~run"]({value:f},s);if(y.issues){let m={type:"array",origin:"value",input:c,key:l,value:f};for(let x of y.issues)x.path?x.path.unshift(m):x.path=[m],o.issues?.push(x);if(o.issues||(o.issues=y.issues),s.abortEarly){o.typed=!1;break}}y.typed||(o.typed=!1),o.value.push(y.value)}}else B(this,"type",o,s);return o}}}function h(e){return{kind:"schema",type:"boolean",reference:h,expects:"boolean",async:!1,message:e,get"~standard"(){return z(this)},"~run"(n,o){return typeof n.value=="boolean"?n.typed=!0:B(this,"type",n,o),n}}}function i(e,n){return{kind:"schema",type:"literal",reference:i,expects:ge(e),async:!1,literal:e,message:n,get"~standard"(){return z(this)},"~run"(o,s){return o.value===this.literal?o.typed=!0:B(this,"type",o,s),o}}}function Le(e){return{kind:"schema",type:"nan",reference:Le,expects:"NaN",async:!1,message:e,get"~standard"(){return z(this)},"~run"(n,o){return Number.isNaN(n.value)?n.typed=!0:B(this,"type",n,o),n}}}function J(e,n){return{kind:"schema",type:"nullable",reference:J,expects:`(${e.expects} | null)`,async:!1,wrapped:e,default:n,get"~standard"(){return z(this)},"~run"(o,s){return o.value===null&&(this.default!==void 0&&(o.value=De(this,o,s)),o.value===null)?(o.typed=!0,o):this.wrapped["~run"](o,s)}}}function P(e){return{kind:"schema",type:"number",reference:P,expects:"number",async:!1,message:e,get"~standard"(){return z(this)},"~run"(n,o){return typeof n.value=="number"&&!isNaN(n.value)?n.typed=!0:B(this,"type",n,o),n}}}function r(e,n){return{kind:"schema",type:"object",reference:r,expects:"Object",async:!1,entries:e,message:n,get"~standard"(){return z(this)},"~run"(o,s){let c=o.value;if(c&&typeof c=="object"){o.typed=!0,o.value={};for(let l in this.entries){let f=this.entries[l];if(l in c||(f.type==="exact_optional"||f.type==="optional"||f.type==="nullish")&&f.default!==void 0){let y=l in c?c[l]:De(f),m=f["~run"]({value:y},s);if(m.issues){let x={type:"object",origin:"value",input:c,key:l,value:y};for(let _ of m.issues)_.path?_.path.unshift(x):_.path=[x],o.issues?.push(_);if(o.issues||(o.issues=m.issues),s.abortEarly){o.typed=!1;break}}m.typed||(o.typed=!1),o.value[l]=m.value}else if(f.fallback!==void 0)o.value[l]=pt(f);else if(f.type!=="exact_optional"&&f.type!=="optional"&&f.type!=="nullish"&&(B(this,"key",o,s,{input:void 0,expected:`"${l}"`,path:[{type:"object",origin:"key",input:c,key:l,value:c[l]}]}),s.abortEarly))break}}else B(this,"type",o,s);return o}}}function u(e,n){return{kind:"schema",type:"optional",reference:u,expects:`(${e.expects} | undefined)`,async:!1,wrapped:e,default:n,get"~standard"(){return z(this)},"~run"(o,s){return o.value===void 0&&(this.default!==void 0&&(o.value=De(this,o,s)),o.value===void 0)?(o.typed=!0,o):this.wrapped["~run"](o,s)}}}function R(e,n){return{kind:"schema",type:"picklist",reference:R,expects:Ue(e.map(ge),"|"),async:!1,options:e,message:n,get"~standard"(){return z(this)},"~run"(o,s){return this.options.includes(o.value)?o.typed=!0:B(this,"type",o,s),o}}}function F(e,n,o){return{kind:"schema",type:"record",reference:F,expects:"Object",async:!1,key:e,value:n,message:o,get"~standard"(){return z(this)},"~run"(s,c){let l=s.value;if(l&&typeof l=="object"){s.typed=!0,s.value={};for(let f in l)if(Kr(l,f)){let y=l[f],m=this.key["~run"]({value:f},c);if(m.issues){let _={type:"object",origin:"key",input:l,key:f,value:y};for(let M of m.issues)M.path=[_],s.issues?.push(M);if(s.issues||(s.issues=m.issues),c.abortEarly){s.typed=!1;break}}let x=this.value["~run"]({value:y},c);if(x.issues){let _={type:"object",origin:"value",input:l,key:f,value:y};for(let M of x.issues)M.path?M.path.unshift(_):M.path=[_],s.issues?.push(M);if(s.issues||(s.issues=x.issues),c.abortEarly){s.typed=!1;break}}(!m.typed||!x.typed)&&(s.typed=!1),m.typed&&(s.value[m.value]=x.value)}}else B(this,"type",s,c);return s}}}function p(e,n){return{kind:"schema",type:"strict_object",reference:p,expects:"Object",async:!1,entries:e,message:n,get"~standard"(){return z(this)},"~run"(o,s){let c=o.value;if(c&&typeof c=="object"){o.typed=!0,o.value={};for(let l in this.entries){let f=this.entries[l];if(l in c||(f.type==="exact_optional"||f.type==="optional"||f.type==="nullish")&&f.default!==void 0){let y=l in c?c[l]:De(f),m=f["~run"]({value:y},s);if(m.issues){let x={type:"object",origin:"value",input:c,key:l,value:y};for(let _ of m.issues)_.path?_.path.unshift(x):_.path=[x],o.issues?.push(_);if(o.issues||(o.issues=m.issues),s.abortEarly){o.typed=!1;break}}m.typed||(o.typed=!1),o.value[l]=m.value}else if(f.fallback!==void 0)o.value[l]=pt(f);else if(f.type!=="exact_optional"&&f.type!=="optional"&&f.type!=="nullish"&&(B(this,"key",o,s,{input:void 0,expected:`"${l}"`,path:[{type:"object",origin:"key",input:c,key:l,value:c[l]}]}),s.abortEarly))break}if(!o.issues||!s.abortEarly){for(let l in c)if(!(l in this.entries)){B(this,"key",o,s,{input:l,expected:"never",path:[{type:"object",origin:"key",input:c,key:l,value:c[l]}]});break}}}else B(this,"type",o,s);return o}}}function t(e){return{kind:"schema",type:"string",reference:t,expects:"string",async:!1,message:e,get"~standard"(){return z(this)},"~run"(n,o){return typeof n.value=="string"?n.typed=!0:B(this,"type",n,o),n}}}function ct(e){let n;if(e)for(let o of e)if(n)for(let s of o.issues)n.push(s);else n=o.issues;return n}function I(e,n){return{kind:"schema",type:"union",reference:I,expects:Ue(e.map(o=>o.expects),"|"),async:!1,options:e,message:n,get"~standard"(){return z(this)},"~run"(o,s){let c,l,f;for(let y of this.options){let m=y["~run"]({value:o.value},s);if(m.typed)if(m.issues)l?l.push(m):l=[m];else{c=m;break}else f?f.push(m):f=[m]}if(c)return c;if(l){if(l.length===1)return l[0];B(this,"type",o,s,{issues:ct(l)}),o.typed=!0}else{if(f?.length===1)return f[0];B(this,"type",o,s,{issues:ct(f)})}return o}}}function Ie(){return{kind:"schema",type:"unknown",reference:Ie,expects:"unknown",async:!1,get"~standard"(){return z(this)},"~run"(e){return e.typed=!0,e}}}function g(e,n,o){return{kind:"schema",type:"variant",reference:g,expects:"Object",async:!1,key:e,options:n,message:o,get"~standard"(){return z(this)},"~run"(s,c){let l=s.value;if(l&&typeof l=="object"){let f,y=0,m=this.key,x=[],_=(M,S)=>{for(let H of M.options){if(H.type==="variant")_(H,new Set(S).add(H.key));else{let L=!0,Q=0;for(let j of S){let V=H.entries[j];if(j in l?V["~run"]({typed:!1,value:l[j]},lt).issues:V.type!=="exact_optional"&&V.type!=="optional"&&V.type!=="nullish"){L=!1,m!==j&&(y<Q||y===Q&&j in l&&!(m in l))&&(y=Q,m=j,x=[]),m===j&&x.push(H.entries[j].expects);break}Q++}if(L){let j=H["~run"]({value:l},c);(!f||!f.typed&&j.typed)&&(f=j)}}if(f&&!f.issues)break}};if(_(this,new Set([this.key])),f)return f;B(this,"type",s,c,{input:l[m],expected:Ue(x,"|"),path:[{type:"object",origin:"value",input:l,key:m,value:l[m]}]})}else B(this,"type",s,c);return s}}}function te(e,n,o){let s=e["~run"]({value:n},Fe(o));if(s.issues)throw new Yr(s.issues);return s.value}function U(...e){return{...e[0],pipe:e,get"~standard"(){return z(this)},"~run"(n,o){for(let s of e)if(s.kind!=="metadata"){if(n.issues&&(s.kind==="schema"||s.kind==="transformation")){n.typed=!1;break}(!n.issues||!o.abortEarly&&!o.abortPipeEarly)&&(n=s["~run"](n,o))}return n}}}function _e(e,n,o){let s=e["~run"]({value:n},Fe(o));return{typed:s.typed,success:!s.issues,output:s.value,issues:s.issues}}var ne=U(t(),re("NotionBlockId")),Y=U(t(),re("NotionDataSourceId")),D=U(t(),re("NotionPageId")),mt=U(t(),re("NotionAgentId")),yt=U(t(),re("NotionSpaceId"));var vt=R(["default","gray","brown","orange","yellow","green","blue","purple","pink","red","gray_background","brown_background","orange_background","yellow_background","green_background","blue_background","purple_background","pink_background","red_background","default_background"]),Ve=r({id:t(),name:t(),color:u(vt),description:u(t())}),Zr=r({id:t(),name:t(),color:u(vt),option_ids:E(t())}),en=r({synced_property_id:t(),synced_property_name:t()}),O=r({name:t(),description:u(t())}),tn=["title","rich_text","number","checkbox","url","email","phone_number","select","multi_select","status","date","people","files","unique_id","relation","place","formula","rollup","button","verification","last_visited_time","location","created_time","last_edited_time","created_by","last_edited_by"],dt=R(tn),ht=["title","rich_text","number","checkbox","url","email","phone_number","date","created_time","last_edited_time","people","created_by"],Ge=g("type",[r({...O.entries,type:i("title")}),r({...O.entries,type:i("rich_text")}),r({...O.entries,type:i("number")}),r({...O.entries,type:i("checkbox")}),r({...O.entries,type:i("url")}),r({...O.entries,type:i("email")}),r({...O.entries,type:i("phone_number")}),r({...O.entries,type:i("select"),options:E(Ve)}),r({...O.entries,type:i("multi_select"),options:E(Ve)}),r({...O.entries,type:i("status"),options:E(Ve),groups:E(Zr)}),r({...O.entries,type:i("date")}),r({...O.entries,type:i("people")}),r({...O.entries,type:i("files")}),r({...O.entries,type:i("unique_id")}),r({...O.entries,type:i("relation"),data_source_id:u(t()),dual_property:u(en)}),r({...O.entries,type:i("place")}),r({...O.entries,type:i("formula")}),r({...O.entries,type:i("rollup")}),r({...O.entries,type:i("button")}),r({...O.entries,type:i("verification")}),r({...O.entries,type:i("last_visited_time")}),r({...O.entries,type:i("location")}),r({...O.entries,type:i("created_time")}),r({...O.entries,type:i("last_edited_time")}),r({...O.entries,type:i("created_by")}),r({...O.entries,type:i("last_edited_by")})]);var gt={created_time:{type:"created_time",name:"Created time"},last_edited_time:{type:"last_edited_time",name:"Last edited time"},created_by:{type:"created_by",name:"Created by"},last_edited_by:{type:"last_edited_by",name:"Last edited by"}};var bt=r({id:Y,table:t(),spaceId:u(yt)}),kt=r({id:u(Y),propertiesById:F(t(),Ge)}),So=r({key:t(),collectionPointer:u(bt),collectionSchema:u(kt),propertyIdsByKey:F(t(),u(t())),propertySchemasById:F(t(),Ge)}),rn=r({collectionPointer:u(bt),collectionSchema:u(kt),propertyIdsByKey:u(F(t(),u(t())))}),le=F(t(),rn);var fe=R(["standard","high"]),St="standard";var It=r({type:i("contrastModeChanged"),contrastMode:fe});var we=r({id:t(),table:t()});var oe=g("type",[r({type:i("page_id"),page_id:D}),r({type:i("data_source_id"),data_source_id:Y}),r({type:i("workspace"),workspace:i(!0)}),r({type:i("block_id"),block_id:ne}),r({type:i("agent_id"),agent_id:mt}),r({type:i("unavailable")})]);var me=g("type",[r({type:i("unavailable")}),r({type:i("page"),id:D,parent:oe})]),nn=r({type:i("emoji"),emoji:t()}),on=r({type:i("custom_emoji"),custom_emoji:r({id:t(),name:u(t()),url:u(t())})}),Ct=r({type:i("external"),external:r({url:t()})}),Pt=r({type:i("file"),file:r({url:t(),expiry_time:u(t())})}),Qe=g("type",[nn,on,Ct,Pt]),Xe=g("type",[Ct,Pt]),$=J(t()),_t=F(t(),Ie()),$e=I([r({id:t(),name:u(t()),color:u(t()),description:u($)}),r({name:t(),id:u(t()),color:u(t()),description:u($)})]),sn=r({start:t(),end:u($),time_zone:u($)}),an=I([r({object:u(i("user")),id:t()}),r({object:i("group"),id:t(),name:u($)})]),un=r({id:t()}),cn=I([r({type:i("external"),name:t(),external:r({url:t()})}),r({type:i("file"),name:t(),file:r({url:t(),expiry_time:u(t())})})]),ln=r({lat:P(),lon:P(),name:u($),address:u($),aws_place_id:u($),google_place_id:u($)}),A={id:t()},xt=J(r({...we.entries,table:R(["notion_user","bot","organization_bot"]),spaceId:u(t())})),We=g("type",[r({...A,type:i("title"),title:E(_t)}),r({...A,type:i("rich_text"),rich_text:E(_t)}),r({...A,type:i("number"),number:J(P())}),r({...A,type:i("url"),url:$}),r({...A,type:i("email"),email:$}),r({...A,type:i("phone_number"),phone_number:$}),r({...A,type:i("checkbox"),checkbox:h()}),r({...A,type:i("select"),select:J($e)}),r({...A,type:i("status"),status:J($e)}),r({...A,type:i("multi_select"),multi_select:E($e)}),r({...A,type:i("date"),date:J(sn)}),r({...A,type:i("people"),people:E(an)}),r({...A,type:i("relation"),has_more:u(h()),relation:E(un)}),r({...A,type:i("files"),files:E(cn)}),r({...A,type:i("place"),place:J(ln)}),r({...A,type:i("created_time"),created_time:$}),r({...A,type:i("last_edited_time"),last_edited_time:$}),r({...A,type:i("created_by"),created_by:xt}),r({...A,type:i("last_edited_by"),last_edited_by:xt}),r({...A,type:i("last_visited_time"),last_visited_time:$})]),xe=F(t(),We),ye=r({object:i("page"),id:D,parent:oe,properties:xe,created_time:u(t()),last_edited_time:u(t()),icon:u(Qe),cover:u(Xe),url:u(t()),public_url:u(t()),is_archived:h(),in_trash:h()});var pn=t(),fn=r({code:pn,message:t(),isRetryable:h()}),Et=g("status",[r({type:i("createPageResult"),requestId:t(),status:i("success"),page:ye}),r({type:i("createPageResult"),requestId:t(),status:i("error"),error:fn})]);var Je=U(t(),re("NotionUserId")),ie=r({object:i("user"),id:Je,name:u(t()),avatar_url:J(t()),type:i("person"),person:r({email:t()})}),Ot=r({object:i("list"),results:E(ie),next_cursor:J(t()),has_more:h(),type:i("user"),user:F(t(),Ie())});var jt=r({type:i("currentUserChanged"),currentUser:ie});var Bt=r({type:i("dataSourcesChanged"),dataSources:r({bindings:le})});var mn=t(),yn=r({code:mn,message:t(),isRetryable:h()}),Rt=r({type:i("getPage"),requestId:t(),pageId:D}),Mt=g("status",[r({type:i("getPageResult"),requestId:t(),status:i("success"),page:ye}),r({type:i("getPageResult"),requestId:t(),status:i("error"),error:yn})]);var vn=t(),dn=r({code:vn,message:t(),isRetryable:h()}),Dt=r({type:i("getUser"),requestId:t(),userId:Je}),wt=g("status",[r({type:i("getUserResult"),requestId:t(),status:i("success"),user:ie}),r({type:i("getUserResult"),requestId:t(),status:i("error"),error:dn})]);var hn=g("type",[r({type:i("emoji"),emoji:t()}),r({type:i("external"),url:t()})]),gn=r({name:t(),description:u(t()),type:dt}),bn=r({name:t(),description:u(t()),icon:u(hn),properties:u(F(t(),gn),{})}),pe=r({version:i(1),name:u(t()),description:u(t()),slashCommand:u(t()),icon:u(r({type:i("emoji"),emoji:t()})),dataSources:u(F(t(),bn),{})});var ve=R(["light","dark"]);var kn=t(),Sn=r({code:kn,message:t(),isRetryable:h()});var Ae=g("status",[r({type:i("init"),initializationId:t(),status:i("success"),theme:ve,contrastMode:fe,blockId:ne,parent:oe,page:me,manifest:pe,dataSources:r({bindings:le}),currentUser:ie}),r({type:i("init"),initializationId:t(),status:i("error"),error:Sn})]);var At=r({type:i("invalidSandboxMessage"),reason:t()});var In=t(),_n=r({code:In,message:t(),isRetryable:h()}),qt=r({type:i("listUsers"),requestId:t(),startCursor:u(t()),pageSize:u(P())}),Tt=g("status",[r({type:i("listUsersResult"),requestId:t(),status:i("success"),list:Ot}),r({type:i("listUsersResult"),requestId:t(),status:i("error"),error:_n})]);var xn=R(["side_peek","center_peek"]),Cn=t(),Pn=r({code:Cn,message:t(),isRetryable:h()}),Nt=r({type:i("openPage"),requestId:t(),pageId:D,mode:xn}),Ft=g("status",[r({type:i("openPageResult"),requestId:t(),status:i("success"),pageId:D}),r({type:i("openPageResult"),requestId:t(),status:i("error"),error:Pn})]);var Ut=r({type:i("pageChanged"),page:me});var zt=r({type:i("parentChanged"),parent:oe});var Ht=r({unit:R(["year","month","week","day"]),value:P(),time:t(),defaultTimeZone:u(t())}),En=r({unit:R(["hour","minute"]),value:P()}),Lt=r({unit:i("none")}),On=I([Ht,En]),Vt=u(I([Ht,Lt])),Gt=u(I([On,Lt])),jn=r({type:i("date"),start_date:t(),reminder:Vt}),Bn=r({type:i("daterange"),start_date:t(),end_date:t(),reminder:Vt}),Rn=r({type:i("datetime"),start_date:t(),start_time:t(),time_zone:u(t()),reminder:Gt}),Mn=r({type:i("datetimerange"),start_date:t(),start_time:t(),end_date:t(),end_time:t(),time_zone:u(t()),reminder:Gt}),$t=g("type",[jn,Bn,Rn,Mn]);var Qt=I([t(),P(),h(),$t,E(t()),E(we)]);var Xt=r({id:D,is_archived:h(),in_trash:h(),propertiesById:F(t(),u(Qt))}),Wt=r({id:D,is_archived:h(),in_trash:h(),properties:F(t(),u(We))});var Dn=t(),wn=r({code:Dn,message:t(),isRetryable:h()}),Jt=g("status",[r({type:i("queryDataSourceResult"),subscriptionId:t(),status:i("success"),items:E(I([Wt,Xt])),hasMore:h()}),r({type:i("queryDataSourceResult"),subscriptionId:t(),status:i("error"),error:wn})]);var Kt=r({type:i("themeChanged"),theme:ve});var An=t(),qn=r({code:An,message:t(),isRetryable:h()}),Yt=g("status",[r({type:i("updatePageResult"),requestId:t(),status:i("success"),page:ye}),r({type:i("updatePageResult"),requestId:t(),status:i("error"),error:qn})]);var Zt=g("type",[Ae,Kt,It,zt,Ut,jt,Bt,Jt,Et,Mt,wt,Tt,Ft,Yt,At]);function er(){return{code:"no_connect",message:"Sandbox did not send a connect message.",isRetryable:!0}}function tr(){return{code:"invalid_connect_payload",message:"Sandbox sent an invalid connect message.",isRetryable:!1}}function Ke(e){let{currentBridgeProtocolVersion:n}=e;return{code:"invalid_protocol_version",message:`Sandbox reported an invalid bridge protocol version: ${n}`,isRetryable:!1}}function Ye(e){let{currentBridgeProtocolVersion:n,minBridgeProtocolVersion:o}=e;return{code:"unsupported_protocol_version",message:`Sandbox bridge protocol version ${n} is not supported. Minimum supported version is ${o}.`,isRetryable:!1}}function Ze(){return{code:"context_unavailable",message:"Host page context is unavailable.",isRetryable:!0}}function rr(){return{code:"initial_state_timeout",message:"Host did not prepare initial state before the timeout.",isRetryable:!0}}function nr(){return{code:"missing_data_source_binding",message:"A required data source is not mapped.",isRetryable:!1}}function or(){return{code:"missing_property_binding",message:"A required data source property is not mapped.",isRetryable:!1}}function ir(){return{code:"invalid_property_binding",message:"A mapped data source property is missing or incompatible.",isRetryable:!1}}function sr(){return{code:"no_init_result",message:"Sandbox did not acknowledge initialization.",isRetryable:!0}}function ar(){return{code:"invalid_init_result_payload",message:"Sandbox sent an invalid initialization result.",isRetryable:!1}}function Ce(){return{code:"unknown_error",message:"Unexpected error while initializing custom block.",isRetryable:!1}}function se(e){throw new Error(`[custom-blocks-host] Unexpected value encountered: ${JSON.stringify(e)}`)}function et(e){return Number.isFinite(e)&&Number.isInteger(e)&&e>=1}var Tn=5e3,Nn=5e3,Fn=5e3;function ur(e){let{prepareInit:n,sendInitMessage:o,warn:s,flushPendingHostStateChanges:c,minBridgeProtocolVersion:l,noConnectTimeoutMs:f=Tn,initialStateTimeoutMs:y=Nn,noInitResultTimeoutMs:m=Fn,stopHostWithFailure:x,onInitResult:_,onConnectionFailure:M}=e,S="waitingForConnect",H,L,Q,j,V=!1,ae=!1;function W(){H!==void 0&&(window.clearTimeout(H),H=void 0)}function w(){L!==void 0&&(window.clearTimeout(L),L=void 0)}function q(){Q!==void 0&&(window.clearTimeout(Q),Q=void 0)}function T(b){let{initializationId:v,error:G,phase:ee,source:Te}=b;switch(S){case"waitingForConnect":case"preparingInit":break;case"waitingForInitResult":case"initialized":case"error":case"stopped":return;default:return se(S)}S="error",j=v,W(),w(),o({type:"init",initializationId:v,status:"error",error:G}),M?.({...G,phase:ee,source:Te})}async function K(b){if(S==="waitingForConnect"){S="preparingInit",j=b.initializationId,W(),L=window.setTimeout(()=>{if(S!=="preparingInit")return;let v=rr();s({...v,initializationId:b.initializationId}),T({initializationId:b.initializationId,error:v,phase:"init",source:"host"})},y);try{let v=await n(b);if(S!=="preparingInit")return;if(w(),v.status==="error"){T({initializationId:b.initializationId,error:v.error,phase:"init",source:"host"});return}S="waitingForInitResult";let G={type:"init",initializationId:b.initializationId,status:"success",theme:v.initialState.theme,contrastMode:v.initialState.contrastMode??St,blockId:v.initialState.blockId,parent:v.initialState.parent,page:v.initialState.page,currentUser:v.initialState.currentUser,manifest:v.initialState.manifest,dataSources:v.initialState.dataSources};o(G),Q=window.setTimeout(()=>{if(S!=="waitingForInitResult")return;S="error";let ee=sr();M?.({...ee,phase:"initResult",source:"host"}),s({...ee,initializationId:b.initializationId})},m)}catch(v){if(S!=="preparingInit")return;s({message:"Failed to prepare custom block initialization",error:v}),T({initializationId:b.initializationId,error:Ce(),phase:"init",source:"host"})}}}function Z(b){if(S!=="stopped"&&S==="waitingForConnect"){if(!et(b.bridgeProtocolVersion)){let v=Ke({currentBridgeProtocolVersion:b.bridgeProtocolVersion});T({initializationId:b.initializationId,error:v,phase:"connect",source:"host"});return}if(b.bridgeProtocolVersion<l){let v=Ye({currentBridgeProtocolVersion:b.bridgeProtocolVersion,minBridgeProtocolVersion:l});T({initializationId:b.initializationId,error:v,phase:"connect",source:"host"});return}if(b.status==="error"){T({initializationId:b.initializationId,error:b.error,phase:"connect",source:"sandbox"});return}ae=!0,K(b)}}function C(b){if(S==="stopped"||S!=="waitingForConnect")return"handled";let{initializationId:v,bridgeProtocolVersion:G}=b;if(v===void 0)return"nack";let ee=b.error;return G!==void 0&&(et(G)?G<l&&(ee=Ye({currentBridgeProtocolVersion:G,minBridgeProtocolVersion:l})):ee=Ke({currentBridgeProtocolVersion:G})),T({initializationId:v,error:ee,phase:"connect",source:"host"}),"handled"}function ue(b){let{initializationId:v,error:G}=b;S!=="waitingForInitResult"||v===void 0||v!==j||(W(),q(),S="error",s(G),M?.({...G,phase:"initResult",source:"host"}))}function Be(){if(S!=="stopped"){if(V){x({phase:"runtime",source:"host",code:"iframe_reloaded",message:"The iframe reloaded. Create a new host and iframe to reconnect.",isRetryable:!0});return}V=!0,W(),S==="waitingForConnect"&&(H=window.setTimeout(()=>{if(S!=="waitingForConnect")return;S="error";let b=er();s(b),M?.({...b,phase:"connect",source:"host"})},f))}}function de(b){if(S!=="waitingForInitResult"||b.initializationId!==j){s({message:"Ignored stale or unexpected initResult",payload:b});return}q(),S=b.status==="success"?"initialized":"error",b.status==="success"?c():M?.({...b.error,phase:"initResult",source:"sandbox"}),_?.(b)}function ce(){S="stopped",W(),w(),q()}return{get status(){return S},get hasConnectedSandbox(){return ae},handleConnect:Z,handleInitResult:de,handleInvalidConnect:C,handleInvalidInitResult:ue,onIframeLoad:Be,stop:ce}}function tt({url:e,hostOrigin:n}){return typeof n=="string"&&n!==""&&e.origin!==n&&(e.protocol==="http:"||e.protocol==="https:")&&(e.hostname==="localhost"||e.hostname==="127.0.0.1"||e.hostname.endsWith(".localhost"))&&e.username===""&&e.password===""}async function cr(e){let n=new AbortController,o=()=>n.abort();e.signal.addEventListener("abort",o,{once:!0});let s=new Promise((l,f)=>{n.signal.addEventListener("abort",()=>f(n.signal.reason),{once:!0})});e.signal.aborted&&n.abort();let c=e.manifestSource==="local"?window.setTimeout(()=>{n.abort(new Error("Manifest loading timed out after 5000 ms."))},5e3):void 0;try{let l=await Promise.race([e.manifestSource==="local"?Un(e.sandboxOrigin,n.signal):e.getPersistedManifest({signal:n.signal}),s]);if(n.signal.aborted)throw new Error("Manifest loading was cancelled.");return{status:"success",manifest:te(pe,l)}}catch(l){return e.signal.aborted||e.onError(l),{status:"error",error:{code:"manifest_unavailable",message:"The custom block manifest is unavailable.",isRetryable:!0}}}finally{window.clearTimeout(c),e.signal.removeEventListener("abort",o)}}async function Un(e,n){let o=new URL(e);if(!tt({url:o,hostOrigin:window.location.origin}))throw new Error("Preview requires a separate loopback origin.");let s=await fetch(new URL("/manifest",o),{credentials:"omit",redirect:"error",cache:"no-store",signal:n});if(!s.ok)throw new Error(`Manifest request failed: HTTP ${s.status}.`);return s.json()}function lr(e,n){return n>=5||!(e.type==="init"&&e.status==="success"||e.type==="dataSourcesChanged")?e:{...e,dataSources:{bindings:Object.fromEntries(Object.entries(e.dataSources.bindings).map(([s,c])=>[s,{...c,collectionSchema:{...c.collectionSchema,propertiesById:{...c.collectionSchema?.propertiesById,...gt}}}]))}}}var pr=r({theme:ve,contrastMode:u(fe),blockId:ne,parent:oe,page:me,manifest:pe,dataSources:r({bindings:le}),currentUser:ie});function fr(e){switch(e.type){case"connect":case"init":case"initResult":return!0;default:return!1}}var mr=r({code:t(),message:t(),isRetryable:h()});var yr={type:i("connect"),initializationId:t(),bridgeProtocolVersion:P(),sdkVersion:t()},vr=g("status",[r({status:i("success"),manifest:u(pe),...yr}),r({status:i("error"),error:mr,...yr})]);var zn=g("type",[r({type:i("start")}),r({type:i("end")}),r({type:i("before"),blockId:ne}),r({type:i("after"),blockId:ne})]),Hn=g("type",[r({type:i("page_id"),page_id:D}),r({type:i("data_source_id"),data_source_id:Y})]),dr=r({type:i("createPage"),requestId:t(),parent:Hn,properties:xe,position:u(zn)});var Ln=t(),Vn=r({code:Ln,message:t(),isRetryable:h()}),hr=g("status",[r({type:i("initResult"),initializationId:t(),status:i("success"),initialHeight:u(U(P(),be(),Se(0)))}),r({type:i("initResult"),initializationId:t(),status:i("error"),error:Vn})]);var gr=r({type:i("invalidHostMessage"),reason:t()});var br=R(["ascending","descending"]);var kr=U(D,ze(/^(?:[0-9a-f]{32}|[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12})$/i),He(e=>e.replaceAll("-","").toLowerCase().replace(/^(.{8})(.{4})(.{4})(.{4})(.{12})$/,"$1-$2-$3-$4-$5"))),rt=I([p({contains:kr}),p({does_not_contain:kr})]),je=I([p({is_empty:i(!0)}),p({is_not_empty:i(!0)})]),Oe=I([t(),E(t())]),Sr=p({object:R(["user","group"]),id:U(t(),ke(1))}),Gn=I([p({contains:Sr}),p({does_not_contain:Sr}),je]),Ir=p({object:i("user"),id:U(t(),ke(1),Me(2e3))}),$n=I([p({contains:Ir}),p({does_not_contain:Ir}),p({is_empty:i(!0)}),p({is_not_empty:i(!0)})]),Pe=I([p({equals:t()}),p({does_not_equal:t()}),p({contains:t()}),p({does_not_contain:t()}),p({starts_with:t()}),p({ends_with:t()}),je]),Qn=I([p({equals:P()}),p({does_not_equal:P()}),p({greater_than:P()}),p({less_than:P()}),p({greater_than_or_equal_to:P()}),p({less_than_or_equal_to:P()}),je]),Xn=I([p({equals:h()}),p({does_not_equal:h()})]),Pr=I([p({equals:Oe}),p({does_not_equal:Oe}),je]),_r=R(["To-do","In progress","Complete","Current","Future"]),xr=I([_r,U(E(_r),ke(1),Me(5))]),Wn=I([p({group_equals:xr}),p({group_does_not_equal:xr})]),Jn=I([Pr,Wn]),Kn=I([p({contains:Oe}),p({contains_all:Oe}),p({does_not_contain:Oe}),je]),X=R(["start_date","end_date"]),Yn=R(["today","tomorrow","yesterday","one_week_ago","one_week_from_now","one_month_ago","one_month_from_now"]),Ee=I([Yn,t()]),Zn=I([p({target:u(X),equals:Ee}),p({target:u(X),before:Ee}),p({target:u(X),after:Ee}),p({target:u(X),on_or_before:Ee}),p({target:u(X),on_or_after:Ee}),p({target:u(X),this_week:p({})}),p({target:u(X),past_week:p({})}),p({target:u(X),past_month:p({})}),p({target:u(X),past_year:p({})}),p({target:u(X),next_week:p({})}),p({target:u(X),next_month:p({})}),p({target:u(X),next_year:p({})}),p({target:u(X),is_empty:i(!0)}),p({target:u(X),is_not_empty:i(!0)})]),Cr=I([p({propertyId:t(),relation:rt}),p({propertyId:t(),created_by:$n}),p({propertyId:t(),title:Pe}),p({propertyId:t(),rich_text:Pe}),p({propertyId:t(),url:Pe}),p({propertyId:t(),email:Pe}),p({propertyId:t(),phone_number:Pe}),p({propertyId:t(),number:Qn}),p({propertyId:t(),checkbox:Xn}),p({propertyId:t(),select:Pr}),p({propertyId:t(),multi_select:Kn}),p({propertyId:t(),status:Jn}),p({propertyId:t(),date:Zn}),p({propertyId:t(),people:Gn})]),eo=I([Cr,p({and:E(Cr)})]),nt=10,to=p({propertyId:t(),direction:br}),Er=r({type:i("queryDataSource"),subscriptionId:t(),dataSourceId:Y,limit:P(),filter:u(eo),sorts:u(E(to))});var Or=r({type:i("resize"),height:U(P(),be(),Se(0))});var jr=r({type:i("unsubscribeDataSourceQuery"),subscriptionId:t()});var Br=r({type:i("updatePage"),requestId:t(),pageId:D,properties:u(xe),icon:u(Qe),cover:u(Xe),archived:u(h())});var Rr=g("type",[vr,hr,Er,jr,dr,Rt,Dt,qt,Nt,Br,Or,gr]);function Mr(e){if(typeof e=="object"&&e!==null&&"type"in e&&typeof e.type=="string")return e.type}function Dr(e){let n=Mr(e);return n==="invalidHostMessage"||n==="invalidSandboxMessage"?{incomingType:n}:{incomingType:n,nack:{type:"invalidSandboxMessage",reason:ro(n)}}}function ro(e){return e!==void 0?`Unsupported sandbox message of type "${e}"`:"Unsupported sandbox message (no `type` field or non-object payload)"}var wr=r({initializationId:t()}),no=r({bridgeProtocolVersion:I([P(),Le()])});function Ar(e){let{iframe:n,sandboxOrigin:o,getInitStatus:s,emit:c,sendNack:l,onInvalidConnect:f,onInvalidInitResult:y,onConnect:m,onInitResult:x,onQueryDataSource:_,onUnsubscribeDataSourceQuery:M,onCreatePage:S,onGetPage:H,onOpenPage:L,onGetUser:Q,onListUsers:j,onUpdatePage:V,onResize:ae}=e;function W(w,q){c("warn",{message:"Ignored unsupported sandbox message",payload:w,issues:q});let T=Dr(w);if(T.incomingType==="connect"){let K=_e(wr,w),Z=_e(no,w);if(f({initializationId:K.success?K.output.initializationId:void 0,error:tr(),bridgeProtocolVersion:Z.success?Z.output.bridgeProtocolVersion:void 0})==="handled")return}if(T.incomingType==="initResult"){let K=_e(wr,w);y({initializationId:K.success?K.output.initializationId:void 0,error:ar()})}T.nack!==void 0&&s()!=="stopped"&&l(T.nack)}return function(q){let T=q.source===n.contentWindow,K=q.origin===o;if(!T||!K)return;let Z=_e(Rr,q.data);if(!Z.success){W(q.data,Z.issues);return}let C=Z.output;if(!fr(C)&&s()!=="initialized"){c("warn",{message:`Ignored ${C.type} before initialization completed`,payload:C});return}switch(c("in",C),C.type){case"connect":m(C);return;case"initResult":x(C);return;case"queryDataSource":_(C);return;case"unsubscribeDataSourceQuery":M(C);return;case"createPage":S(C);return;case"openPage":L(C);return;case"getPage":H(C);return;case"getUser":Q(C);return;case"listUsers":j(C);return;case"updatePage":V(C);return;case"resize":ae(C);return;case"invalidHostMessage":return;default:se(C)}}}var qe=class{constructor(n){this.onUnsubscribe=n}onUnsubscribe;bySubscriptionId=new Map;subscribe(n){this.unsubscribe(n.subscriptionId);let o={_tag:"QuerySubscriptionToken"};return this.bySubscriptionId.set(n.subscriptionId,{message:n,token:o,isRefreshing:!0,shouldRefreshAgain:!1}),o}isCurrent(n,o){return this.bySubscriptionId.get(n)?.token===o}unsubscribe(n){this.bySubscriptionId.delete(n)&&this.onUnsubscribe(n)}refresh(n){let o=[],s=!1;for(let c of this.bySubscriptionId.values())if(c.message.dataSourceId===n){if(s=!0,c.isRefreshing){c.shouldRefreshAgain=!0;continue}c.isRefreshing=!0,o.push({message:c.message,token:c.token})}return s?o:void 0}finish(n,o){let s=this.bySubscriptionId.get(n);if(s?.token===o&&(s.isRefreshing=!1,!!s.shouldRefreshAgain))return s.shouldRefreshAgain=!1,s.isRefreshing=!0,{message:s.message,token:s.token}}unsubscribeAll(){for(let n of this.bySubscriptionId.keys())this.unsubscribe(n)}};function qr(e,n){if(e===void 0)return;let o="and"in e?e.and:[e];for(let s of o){let c=oo(s,n);if(c!==void 0)return c}}function oo(e,n){if(!Object.hasOwn(n.propertiesById,e.propertyId))return{code:"invalid_data_source_query_filter",message:`Data source query filter property ID "${e.propertyId}" is not defined in the bound data source schema.`,isRetryable:!1};let o=n.propertiesById[e.propertyId],s=Object.keys(e).find(y=>y!=="propertyId");if(s!==o.type)return{code:"invalid_data_source_query_filter",message:`Data source query filter branch "${s}" does not match property type "${o.type}".`,isRetryable:!1};if("status"in e&&o.type==="status"){let y=e.status;if("group_equals"in y||"group_does_not_equal"in y){let m="group_equals"in y?y.group_equals:y.group_does_not_equal,_=(Array.isArray(m)?m:[m]).find(M=>!o.groups.some(S=>S.name===M));return _===void 0?void 0:{code:"invalid_data_source_query_filter",message:`Unknown status group "${_}".`,isRetryable:!1}}}if("relation"in e&&!ft(rt,e.relation))return{code:"invalid_data_source_query_filter",message:"Relation filters require a page ID.",isRetryable:!1};let c=io(e);if(c===void 0||o.type!==c.propertyType)return;let l=new Set(o.options.map(y=>y.name)),f=so(c.operator).find(y=>!l.has(y));if(f!==void 0)return{code:"invalid_data_source_query_filter",message:`Data source query filter option "${f}" is not defined for property "${e.propertyId}".`,isRetryable:!1}}function io(e){if("select"in e)return{propertyType:"select",operator:e.select};if("multi_select"in e)return{propertyType:"multi_select",operator:e.multi_select};if("status"in e){let n=e.status;return"group_equals"in n||"group_does_not_equal"in n?void 0:{propertyType:"status",operator:n}}}function so(e){let n;if("equals"in e)n=e.equals;else if("does_not_equal"in e)n=e.does_not_equal;else if("contains"in e)n=e.contains;else if("contains_all"in e)n=e.contains_all;else if("does_not_contain"in e)n=e.does_not_contain;else return"is_empty"in e||"is_not_empty"in e?[]:se(e);return Array.isArray(n)?n:[n]}var ao=new Set(ht);function Tr(e,n){if(e===void 0)return;if(e.length>nt)return{code:"invalid_data_source_query_sort",message:`Data source query sorts may contain at most ${nt} entries.`,isRetryable:!1};let o=new Set;for(let s of e){if(o.has(s.propertyId))return{code:"invalid_data_source_query_sort",message:`Data source query sorts cannot contain duplicate property ID "${s.propertyId}".`,isRetryable:!1};if(o.add(s.propertyId),!Object.hasOwn(n.propertiesById,s.propertyId))return{code:"invalid_data_source_query_sort",message:`Data source query sort property ID "${s.propertyId}" is not defined in the bound data source schema.`,isRetryable:!1};let c=n.propertiesById[s.propertyId];if(!ao.has(c.type))return{code:"invalid_data_source_query_sort",message:`Data source query sorts do not yet support property type "${c.type}".`,isRetryable:!1}}}var Fr=5;function co(e){let{iframe:n,prepareInitialState:o,handlers:s,onInitialized:c,onConnectionFailure:l,onLog:f,onQueryUnsubscribed:y,sandboxOrigin:m,minBridgeProtocolVersion:x,noConnectTimeoutMs:_,initialStateTimeoutMs:M,noInitResultTimeoutMs:S}=e,H=Math.max(x??3,3),L={},Q=!1,j=new AbortController,V,ae,W=6,w=new qe(a=>{y?.(a)});function q(a,k){f?.(a,k)}function T(a){let k=v.status;switch(k){case"waitingForConnect":case"preparingInit":case"waitingForInitResult":case"initialized":case"error":break;case"stopped":return;default:return se(k)}let N=lr(a,W);q("out",N),n.contentWindow?.postMessage(N,m)}function K(a){T(te(Ae,a))}function Z(a){T(a)}function C(a){let k=v.status;switch(k){case"initialized":T(te(Zt,a));return;case"waitingForConnect":case"preparingInit":case"waitingForInitResult":case"error":case"stopped":return;default:se(k)}}async function ue(a,k){if(k===void 0)return;let N=await k(a);C({type:`${a.type}Result`,requestId:a.requestId,...N})}function Be(a){let k=a.response.status==="error"?{type:"queryDataSourceResult",subscriptionId:a.subscriptionId,status:"error",error:a.response.error}:{type:"queryDataSourceResult",subscriptionId:a.subscriptionId,status:"success",items:a.response.items,hasMore:a.response.hasMore};C(k)}async function de(a,k=w.subscribe(a)){try{let N=lo(ae,a.dataSourceId),he=po(a,N);if(he!==void 0){w.isCurrent(a.subscriptionId,k)&&(w.unsubscribe(a.subscriptionId),Be({subscriptionId:a.subscriptionId,response:{status:"error",error:he}}));return}let Ne=await s.queryDataSource(a);if(!w.isCurrent(a.subscriptionId,k))return;Ne.status==="error"&&!Ne.error.isRetryable&&w.unsubscribe(a.subscriptionId),Be({subscriptionId:a.subscriptionId,response:Ne})}finally{let N=w.finish(a.subscriptionId,k);N!==void 0&&de(N.message,N.token)}}function ce(a){v.status==="stopped"||v.status==="error"||(Object.assign(L,a),b())}function b(){if(v.status!=="initialized")return;let a=L;L={},a.theme!==void 0&&C({type:"themeChanged",theme:a.theme}),a.contrastMode!==void 0&&C({type:"contrastModeChanged",contrastMode:a.contrastMode}),a.parent!==void 0&&C({type:"parentChanged",parent:a.parent}),a.page!==void 0&&C({type:"pageChanged",page:a.page}),a.dataSources!==void 0&&C({type:"dataSourcesChanged",dataSources:a.dataSources}),a.currentUser!==void 0&&C({type:"currentUserChanged",currentUser:a.currentUser})}let v=ur({async prepareInit(a){W=a.bridgeProtocolVersion;let k=await ee;return v.status!=="preparingInit"?k:G(k)},sendInitMessage:K,warn:a=>q("warn",a),flushPendingHostStateChanges:b,minBridgeProtocolVersion:H,noConnectTimeoutMs:_,initialStateTimeoutMs:M,noInitResultTimeoutMs:S,stopHostWithFailure:st,onInitResult(a){a.status==="success"&&V!==void 0&&c?.({manifest:V,initialHeight:a.initialHeight})},onConnectionFailure:a=>{j.abort(),l?.(a)}});function G(a){if(a.status==="error")return a;let k=te(pr,{...a.initialState,...L});if(V=k.manifest,L={},W<Fr&&k.page.type==="unavailable")return{status:"error",error:Ze()};let N=Ur(k.manifest,k.dataSources);return N!==void 0?{status:"error",error:N}:(ae=k.dataSources,Q=!0,{status:"success",initialState:k})}let ee=Te().catch(a=>(j.signal.aborted||q("warn",{message:"Failed to prepare custom block initialization",error:a}),{status:"error",error:Ce()}));async function Te(){let a=await cr({...e,sandboxOrigin:m,signal:j.signal,onError:N=>{q("warn",{message:"Failed to load custom block manifest",error:N})}});if(a.status==="error")return a;if(j.signal.aborted)return{status:"error",error:Ce()};let k=await o({manifest:a.manifest,signal:j.signal});return k.status==="error"?k:{status:"success",initialState:{...k.initialState,manifest:a.manifest}}}let ot=Ar({iframe:n,sandboxOrigin:m,getInitStatus:()=>v.status,emit:q,sendNack:Z,onInvalidConnect:v.handleInvalidConnect,onInvalidInitResult:v.handleInvalidInitResult,onConnect:v.handleConnect,onInitResult:v.handleInitResult,onQueryDataSource:de,onUnsubscribeDataSourceQuery:a=>w.unsubscribe(a.subscriptionId),onCreatePage:a=>ue(a,s.createPage),onGetPage:a=>ue(a,s.getPage),onOpenPage:a=>ue(a,s.openPage),onGetUser:a=>ue(a,s.getUser),onListUsers:a=>ue(a,s.listUsers),onUpdatePage:a=>ue(a,s.updatePage),onResize:a=>s.resize?.(a)});window.addEventListener("message",ot),n.addEventListener("load",v.onIframeLoad);function it(){j.abort(),window.removeEventListener("message",ot),n.removeEventListener("load",v.onIframeLoad),v.stop(),w.unsubscribeAll()}function st(a){it(),q("warn",a),l?.(a)}return{stop:it,setTheme(a){ce({theme:a})},setContrastMode(a){ce({contrastMode:a})},setParent(a){ce({parent:a})},setPage(a){if(a.type==="unavailable"&&W<Fr&&(v.status==="preparingInit"&&Q||v.status==="waitingForInitResult"||v.status==="initialized")){st({...Ze(),phase:"runtime",source:"host"});return}ce({page:a})},setCurrentUser(a){ce({currentUser:a})},setDataSources(a){let k={bindings:te(le,a.bindings)};if(v.hasConnectedSandbox&&V!==void 0&&Ur(V,k)!==void 0){q("warn",{message:"Ignored invalid data source bindings update",payload:k});return}ae=k,ce({dataSources:k})},refreshQuery({dataSourceId:a}){if(v.status!=="initialized")return;let k=te(Y,a),N=w.refresh(k);if(N===void 0){q("warn",`No active query exists for data source "${a}"`);return}for(let he of N)de(he.message,he.token)}}}function lo(e,n){return Object.values(e?.bindings??{}).find(o=>o.collectionPointer?.id===n)?.collectionSchema}function Ur(e,n){for(let[o,s]of Object.entries(e.dataSources)){let c=n.bindings[o];if(c?.collectionPointer===void 0||c.collectionSchema===void 0)return nr();for(let[l,f]of Object.entries(s.properties??{})){let y=c.propertyIdsByKey?.[l];if(y===void 0)return or();if(c.collectionSchema.propertiesById[y]?.type!==f.type)return ir()}}}function po(e,n){return n===void 0?e.filter===void 0&&(e.sorts?.length??0)===0?void 0:{code:"data_source_schema_unavailable",message:"You cannot query this data source with filters or sorts because its schema is unavailable.",isRetryable:!1}:qr(e.filter,n)??Tr(e.sorts,n)}function fo(e){return te(D,e)}export{zr as LEGACY_PROPERTY_SHAPE_PROTOCOL_VERSION,co as createCustomBlockHost,Hr as getAutoBoundPropertyIdsByKey,tt as isLocalCustomBlockUrl,fo as toNotionPageId};
1
+ var Ue=6,Wr=6;function Jr(e){let{manifestProperties:n,propertySchemasById:o}=e,i=[];for(let[c,l]of Object.entries(n)){let f=Kr({propertyKey:c,manifestProperty:l,propertySchemasById:o});f!==void 0&&i.push([c,f])}return Object.fromEntries(i)}function Kr(e){let{propertyKey:n,manifestProperty:o,propertySchemasById:i}=e,c=ct(o.name),l=Object.entries(i).filter(([f,y])=>y.type===o.type&&(f===n||ct(y.name)===c));return l.length===1?l[0][0]:void 0}function ct(e){return e.trim().toLowerCase()}var Me,Yr={lang:void 0,message:void 0,abortEarly:void 0,abortPipeEarly:void 0};function Fe(e){return!e&&!Me?Yr:{lang:e?.lang??Me?.lang,message:e?.message,abortEarly:e?.abortEarly??Me?.abortEarly,abortPipeEarly:e?.abortPipeEarly??Me?.abortPipeEarly}}var Zr;function en(e){return Zr?.get(e)}var tn;function rn(e){return tn?.get(e)}var nn;function on(e,n){return nn?.get(e)?.get(n)}function be(e){let n=typeof e;return n==="string"?`"${e}"`:n==="number"||n==="bigint"||n==="boolean"?`${e}`:n==="object"||n==="function"?(e&&Object.getPrototypeOf(e)?.constructor?.name)??"null":n}function M(e,n,o,i,c){let l=c&&"input"in c?c.input:o.value,f=c?.expected??e.expects??null,y=c?.received??be(l),m={kind:e.kind,type:e.type,input:l,expected:f,received:y,message:`Invalid ${n}: ${f?`Expected ${f} but r`:"R"}eceived ${y}`,requirement:e.requirement,path:c?.path,issues:c?.issues,lang:i.lang,abortEarly:i.abortEarly,abortPipeEarly:i.abortPipeEarly},_=e.kind==="schema",x=c?.message??e.message??on(e.reference,m.lang)??(_?rn(m.lang):null)??i.message??en(m.lang);x!==void 0&&(m.message=typeof x=="function"?x(m):x),_&&(o.typed=!1),o.issues?o.issues.push(m):o.issues=[m]}var lt=new WeakMap;function H(e){let n=lt.get(e);return n||(n={version:1,vendor:"valibot",validate(o){return e["~run"]({value:o},Fe())}},lt.set(e,n)),n}function sn(e,n){return Object.prototype.hasOwnProperty.call(e,n)&&n!=="__proto__"&&n!=="prototype"&&n!=="constructor"}function ze(e,n){let o=[...new Set(e)];return o.length>1?`(${o.join(` ${n} `)})`:o[0]??"never"}var an=class extends Error{constructor(e){super(e[0].message),this.name="ValiError",this.issues=e}};function ie(e){return{kind:"transformation",type:"brand",reference:ie,async:!1,name:e,"~run"(n){return n}}}function ke(e){return{kind:"validation",type:"finite",reference:ke,async:!1,expects:null,requirement:Number.isFinite,message:e,"~run"(n,o){return n.typed&&!this.requirement(n.value)&&M(this,"finite",n,o),n}}}function De(e,n){return{kind:"validation",type:"max_length",reference:De,async:!1,expects:`<=${e}`,requirement:e,message:n,"~run"(o,i){return o.typed&&o.value.length>this.requirement&&M(this,"length",o,i,{received:`${o.value.length}`}),o}}}function Se(e,n){return{kind:"validation",type:"min_length",reference:Se,async:!1,expects:`>=${e}`,requirement:e,message:n,"~run"(o,i){return o.typed&&o.value.length<this.requirement&&M(this,"length",o,i,{received:`${o.value.length}`}),o}}}function Ie(e,n){return{kind:"validation",type:"min_value",reference:Ie,async:!1,expects:`>=${e instanceof Date?e.toJSON():be(e)}`,requirement:e,message:n,"~run"(o,i){return o.typed&&!(o.value>=this.requirement)&&M(this,"value",o,i,{received:o.value instanceof Date?o.value.toJSON():be(o.value)}),o}}}function He(e,n){return{kind:"validation",type:"regex",reference:He,async:!1,expects:`${e}`,requirement:e,message:n,"~run"(o,i){return o.typed&&!this.requirement.test(o.value)&&M(this,"format",o,i),o}}}function Le(e){return{kind:"transformation",type:"transform",reference:Le,async:!1,operation:e,"~run"(n){return n.value=this.operation(n.value),n}}}var ft={abortEarly:!0};function mt(e,n,o){return typeof e.fallback=="function"?e.fallback(n,o):e.fallback}function we(e,n,o){return typeof e.default=="function"?e.default(n,o):e.default}function yt(e,n){return!e["~run"]({value:n},ft).issues}function O(e,n){return{kind:"schema",type:"array",reference:O,expects:"Array",async:!1,item:e,message:n,get"~standard"(){return H(this)},"~run"(o,i){let c=o.value;if(Array.isArray(c)){o.typed=!0,o.value=[];for(let l=0;l<c.length;l++){let f=c[l],y=this.item["~run"]({value:f},i);if(y.issues){let m={type:"array",origin:"value",input:c,key:l,value:f};for(let _ of y.issues)_.path?_.path.unshift(m):_.path=[m],o.issues?.push(_);if(o.issues||(o.issues=y.issues),i.abortEarly){o.typed=!1;break}}y.typed||(o.typed=!1),o.value.push(y.value)}}else M(this,"type",o,i);return o}}}function d(e){return{kind:"schema",type:"boolean",reference:d,expects:"boolean",async:!1,message:e,get"~standard"(){return H(this)},"~run"(n,o){return typeof n.value=="boolean"?n.typed=!0:M(this,"type",n,o),n}}}function s(e,n){return{kind:"schema",type:"literal",reference:s,expects:be(e),async:!1,literal:e,message:n,get"~standard"(){return H(this)},"~run"(o,i){return o.value===this.literal?o.typed=!0:M(this,"type",o,i),o}}}function Ge(e){return{kind:"schema",type:"nan",reference:Ge,expects:"NaN",async:!1,message:e,get"~standard"(){return H(this)},"~run"(n,o){return Number.isNaN(n.value)?n.typed=!0:M(this,"type",n,o),n}}}function Z(e,n){return{kind:"schema",type:"nullable",reference:Z,expects:`(${e.expects} | null)`,async:!1,wrapped:e,default:n,get"~standard"(){return H(this)},"~run"(o,i){return o.value===null&&(this.default!==void 0&&(o.value=we(this,o,i)),o.value===null)?(o.typed=!0,o):this.wrapped["~run"](o,i)}}}function C(e){return{kind:"schema",type:"number",reference:C,expects:"number",async:!1,message:e,get"~standard"(){return H(this)},"~run"(n,o){return typeof n.value=="number"&&!isNaN(n.value)?n.typed=!0:M(this,"type",n,o),n}}}function r(e,n){return{kind:"schema",type:"object",reference:r,expects:"Object",async:!1,entries:e,message:n,get"~standard"(){return H(this)},"~run"(o,i){let c=o.value;if(c&&typeof c=="object"){o.typed=!0,o.value={};for(let l in this.entries){let f=this.entries[l];if(l in c||(f.type==="exact_optional"||f.type==="optional"||f.type==="nullish")&&f.default!==void 0){let y=l in c?c[l]:we(f),m=f["~run"]({value:y},i);if(m.issues){let _={type:"object",origin:"value",input:c,key:l,value:y};for(let x of m.issues)x.path?x.path.unshift(_):x.path=[_],o.issues?.push(x);if(o.issues||(o.issues=m.issues),i.abortEarly){o.typed=!1;break}}m.typed||(o.typed=!1),o.value[l]=m.value}else if(f.fallback!==void 0)o.value[l]=mt(f);else if(f.type!=="exact_optional"&&f.type!=="optional"&&f.type!=="nullish"&&(M(this,"key",o,i,{input:void 0,expected:`"${l}"`,path:[{type:"object",origin:"key",input:c,key:l,value:c[l]}]}),i.abortEarly))break}}else M(this,"type",o,i);return o}}}function u(e,n){return{kind:"schema",type:"optional",reference:u,expects:`(${e.expects} | undefined)`,async:!1,wrapped:e,default:n,get"~standard"(){return H(this)},"~run"(o,i){return o.value===void 0&&(this.default!==void 0&&(o.value=we(this,o,i)),o.value===void 0)?(o.typed=!0,o):this.wrapped["~run"](o,i)}}}function D(e,n){return{kind:"schema",type:"picklist",reference:D,expects:ze(e.map(be),"|"),async:!1,options:e,message:n,get"~standard"(){return H(this)},"~run"(o,i){return this.options.includes(o.value)?o.typed=!0:M(this,"type",o,i),o}}}function N(e,n,o){return{kind:"schema",type:"record",reference:N,expects:"Object",async:!1,key:e,value:n,message:o,get"~standard"(){return H(this)},"~run"(i,c){let l=i.value;if(l&&typeof l=="object"){i.typed=!0,i.value={};for(let f in l)if(sn(l,f)){let y=l[f],m=this.key["~run"]({value:f},c);if(m.issues){let x={type:"object",origin:"key",input:l,key:f,value:y};for(let w of m.issues)w.path=[x],i.issues?.push(w);if(i.issues||(i.issues=m.issues),c.abortEarly){i.typed=!1;break}}let _=this.value["~run"]({value:y},c);if(_.issues){let x={type:"object",origin:"value",input:l,key:f,value:y};for(let w of _.issues)w.path?w.path.unshift(x):w.path=[x],i.issues?.push(w);if(i.issues||(i.issues=_.issues),c.abortEarly){i.typed=!1;break}}(!m.typed||!_.typed)&&(i.typed=!1),m.typed&&(i.value[m.value]=_.value)}}else M(this,"type",i,c);return i}}}function p(e,n){return{kind:"schema",type:"strict_object",reference:p,expects:"Object",async:!1,entries:e,message:n,get"~standard"(){return H(this)},"~run"(o,i){let c=o.value;if(c&&typeof c=="object"){o.typed=!0,o.value={};for(let l in this.entries){let f=this.entries[l];if(l in c||(f.type==="exact_optional"||f.type==="optional"||f.type==="nullish")&&f.default!==void 0){let y=l in c?c[l]:we(f),m=f["~run"]({value:y},i);if(m.issues){let _={type:"object",origin:"value",input:c,key:l,value:y};for(let x of m.issues)x.path?x.path.unshift(_):x.path=[_],o.issues?.push(x);if(o.issues||(o.issues=m.issues),i.abortEarly){o.typed=!1;break}}m.typed||(o.typed=!1),o.value[l]=m.value}else if(f.fallback!==void 0)o.value[l]=mt(f);else if(f.type!=="exact_optional"&&f.type!=="optional"&&f.type!=="nullish"&&(M(this,"key",o,i,{input:void 0,expected:`"${l}"`,path:[{type:"object",origin:"key",input:c,key:l,value:c[l]}]}),i.abortEarly))break}if(!o.issues||!i.abortEarly){for(let l in c)if(!(l in this.entries)){M(this,"key",o,i,{input:l,expected:"never",path:[{type:"object",origin:"key",input:c,key:l,value:c[l]}]});break}}}else M(this,"type",o,i);return o}}}function t(e){return{kind:"schema",type:"string",reference:t,expects:"string",async:!1,message:e,get"~standard"(){return H(this)},"~run"(n,o){return typeof n.value=="string"?n.typed=!0:M(this,"type",n,o),n}}}function pt(e){let n;if(e)for(let o of e)if(n)for(let i of o.issues)n.push(i);else n=o.issues;return n}function I(e,n){return{kind:"schema",type:"union",reference:I,expects:ze(e.map(o=>o.expects),"|"),async:!1,options:e,message:n,get"~standard"(){return H(this)},"~run"(o,i){let c,l,f;for(let y of this.options){let m=y["~run"]({value:o.value},i);if(m.typed)if(m.issues)l?l.push(m):l=[m];else{c=m;break}else f?f.push(m):f=[m]}if(c)return c;if(l){if(l.length===1)return l[0];M(this,"type",o,i,{issues:pt(l)}),o.typed=!0}else{if(f?.length===1)return f[0];M(this,"type",o,i,{issues:pt(f)})}return o}}}function xe(){return{kind:"schema",type:"unknown",reference:xe,expects:"unknown",async:!1,get"~standard"(){return H(this)},"~run"(e){return e.typed=!0,e}}}function h(e,n,o){return{kind:"schema",type:"variant",reference:h,expects:"Object",async:!1,key:e,options:n,message:o,get"~standard"(){return H(this)},"~run"(i,c){let l=i.value;if(l&&typeof l=="object"){let f,y=0,m=this.key,_=[],x=(w,S)=>{for(let L of w.options){if(L.type==="variant")x(L,new Set(S).add(L.key));else{let G=!0,U=0;for(let j of S){let Y=L.entries[j];if(j in l?Y["~run"]({typed:!1,value:l[j]},ft).issues:Y.type!=="exact_optional"&&Y.type!=="optional"&&Y.type!=="nullish"){G=!1,m!==j&&(y<U||y===U&&j in l&&!(m in l))&&(y=U,m=j,_=[]),m===j&&_.push(L.entries[j].expects);break}U++}if(G){let j=L["~run"]({value:l},c);(!f||!f.typed&&j.typed)&&(f=j)}}if(f&&!f.issues)break}};if(x(this,new Set([this.key])),f)return f;M(this,"type",i,c,{input:l[m],expected:ze(_,"|"),path:[{type:"object",origin:"value",input:l,key:m,value:l[m]}]})}else M(this,"type",i,c);return i}}}function oe(e,n,o){let i=e["~run"]({value:n},Fe(o));if(i.issues)throw new an(i.issues);return i.value}function z(...e){return{...e[0],pipe:e,get"~standard"(){return H(this)},"~run"(n,o){for(let i of e)if(i.kind!=="metadata"){if(n.issues&&(i.kind==="schema"||i.kind==="transformation")){n.typed=!1;break}(!n.issues||!o.abortEarly&&!o.abortPipeEarly)&&(n=i["~run"](n,o))}return n}}}function _e(e,n,o){let i=e["~run"]({value:n},Fe(o));return{typed:i.typed,success:!i.issues,output:i.value,issues:i.issues}}var ae=z(t(),ie("NotionBlockId")),re=z(t(),ie("NotionDataSourceId")),A=z(t(),ie("NotionPageId")),vt=z(t(),ie("NotionAgentId")),dt=z(t(),ie("NotionSpaceId"));var ht=D(["default","gray","brown","orange","yellow","green","blue","purple","pink","red","gray_background","brown_background","orange_background","yellow_background","green_background","blue_background","purple_background","pink_background","red_background","default_background"]),Ve=r({id:t(),name:t(),color:u(ht),description:u(t())}),un=r({id:t(),name:t(),color:u(ht),option_ids:O(t())}),cn=r({synced_property_id:t(),synced_property_name:t()}),P=r({name:t(),description:u(t())}),ln=["title","rich_text","number","checkbox","url","email","phone_number","select","multi_select","status","date","people","files","unique_id","relation","place","formula","rollup","button","verification","last_visited_time","location","created_time","last_edited_time","created_by","last_edited_by"],gt=D(ln),bt=["title","rich_text","number","checkbox","url","email","phone_number","date","created_time","last_edited_time","people","created_by"],$e=h("type",[r({...P.entries,type:s("title")}),r({...P.entries,type:s("rich_text")}),r({...P.entries,type:s("number")}),r({...P.entries,type:s("checkbox")}),r({...P.entries,type:s("url")}),r({...P.entries,type:s("email")}),r({...P.entries,type:s("phone_number")}),r({...P.entries,type:s("select"),options:O(Ve)}),r({...P.entries,type:s("multi_select"),options:O(Ve)}),r({...P.entries,type:s("status"),options:O(Ve),groups:O(un)}),r({...P.entries,type:s("date")}),r({...P.entries,type:s("people")}),r({...P.entries,type:s("files")}),r({...P.entries,type:s("unique_id")}),r({...P.entries,type:s("relation"),data_source_id:u(t()),dual_property:u(cn)}),r({...P.entries,type:s("place")}),r({...P.entries,type:s("formula")}),r({...P.entries,type:s("rollup")}),r({...P.entries,type:s("button")}),r({...P.entries,type:s("verification")}),r({...P.entries,type:s("last_visited_time")}),r({...P.entries,type:s("location")}),r({...P.entries,type:s("created_time")}),r({...P.entries,type:s("last_edited_time")}),r({...P.entries,type:s("created_by")}),r({...P.entries,type:s("last_edited_by")})]);var kt={created_time:{type:"created_time",name:"Created time"},last_edited_time:{type:"last_edited_time",name:"Last edited time"},created_by:{type:"created_by",name:"Created by"},last_edited_by:{type:"last_edited_by",name:"Last edited by"}};var St=r({id:re,table:t(),spaceId:u(dt)}),It=r({id:u(re),propertiesById:N(t(),$e)}),Bo=r({key:t(),collectionPointer:u(St),collectionSchema:u(It),propertyIdsByKey:N(t(),u(t())),propertySchemasById:N(t(),$e)}),pn=r({collectionPointer:u(St),collectionSchema:u(It),propertyIdsByKey:u(N(t(),u(t())))}),fe=N(t(),pn);var ve=D(["standard","high"]),xt="standard";var _t=r({type:s("contrastModeChanged"),contrastMode:ve});var qe=r({id:t(),table:t()});var ue=h("type",[r({type:s("page_id"),page_id:A}),r({type:s("data_source_id"),data_source_id:re}),r({type:s("workspace"),workspace:s(!0)}),r({type:s("block_id"),block_id:ae}),r({type:s("agent_id"),agent_id:vt}),r({type:s("unavailable")})]);var de=h("type",[r({type:s("unavailable")}),r({type:s("page"),id:A,parent:ue})]),fn=r({type:s("emoji"),emoji:t()}),mn=r({type:s("custom_emoji"),custom_emoji:r({id:t(),name:u(t()),url:u(t())})}),Ot=r({type:s("external"),external:r({url:t()})}),Pt=r({type:s("file"),file:r({url:t(),expiry_time:u(t())})}),Xe=h("type",[fn,mn,Ot,Pt]),We=h("type",[Ot,Pt]),Q=Z(t()),Ct=N(t(),xe()),Qe=I([r({id:t(),name:u(t()),color:u(t()),description:u(Q)}),r({name:t(),id:u(t()),color:u(t()),description:u(Q)})]),yn=r({start:t(),end:u(Q),time_zone:u(Q)}),vn=I([r({object:u(s("user")),id:t()}),r({object:s("group"),id:t(),name:u(Q)})]),dn=r({id:t()}),hn=I([r({type:s("external"),name:t(),external:r({url:t()})}),r({type:s("file"),name:t(),file:r({url:t(),expiry_time:u(t())})})]),gn=r({lat:C(),lon:C(),name:u(Q),address:u(Q),aws_place_id:u(Q),google_place_id:u(Q)}),T={id:t()},Et=Z(r({...qe.entries,table:D(["notion_user","bot","organization_bot"]),spaceId:u(t())})),Je=h("type",[r({...T,type:s("title"),title:O(Ct)}),r({...T,type:s("rich_text"),rich_text:O(Ct)}),r({...T,type:s("number"),number:Z(C())}),r({...T,type:s("url"),url:Q}),r({...T,type:s("email"),email:Q}),r({...T,type:s("phone_number"),phone_number:Q}),r({...T,type:s("checkbox"),checkbox:d()}),r({...T,type:s("select"),select:Z(Qe)}),r({...T,type:s("status"),status:Z(Qe)}),r({...T,type:s("multi_select"),multi_select:O(Qe)}),r({...T,type:s("date"),date:Z(yn)}),r({...T,type:s("people"),people:O(vn)}),r({...T,type:s("relation"),has_more:u(d()),relation:O(dn)}),r({...T,type:s("files"),files:O(hn)}),r({...T,type:s("place"),place:Z(gn)}),r({...T,type:s("created_time"),created_time:Q}),r({...T,type:s("last_edited_time"),last_edited_time:Q}),r({...T,type:s("created_by"),created_by:Et}),r({...T,type:s("last_edited_by"),last_edited_by:Et}),r({...T,type:s("last_visited_time"),last_visited_time:Q})]),Ce=N(t(),Je),he=r({object:s("page"),id:A,parent:ue,properties:Ce,created_time:u(t()),last_edited_time:u(t()),icon:u(Xe),cover:u(We),url:u(t()),public_url:u(t()),is_archived:d(),in_trash:d()});var bn=t(),kn=r({code:bn,message:t(),isRetryable:d()}),jt=h("status",[r({type:s("createPageResult"),requestId:t(),status:s("success"),page:he}),r({type:s("createPageResult"),requestId:t(),status:s("error"),error:kn})]);var Ke=z(t(),ie("NotionUserId")),ce=r({object:s("user"),id:Ke,name:u(t()),avatar_url:Z(t()),type:s("person"),person:r({email:t()})}),Bt=r({object:s("list"),results:O(ce),next_cursor:Z(t()),has_more:d(),type:s("user"),user:N(t(),xe())});var Rt=r({type:s("currentUserChanged"),currentUser:ce});var Mt=r({type:s("dataSourcesChanged"),dataSources:r({bindings:fe})});var Sn=t(),In=r({code:Sn,message:t(),isRetryable:d()}),Dt=r({type:s("getPage"),requestId:t(),pageId:A}),wt=h("status",[r({type:s("getPageResult"),requestId:t(),status:s("success"),page:he}),r({type:s("getPageResult"),requestId:t(),status:s("error"),error:In})]);var xn=t(),_n=r({code:xn,message:t(),isRetryable:d()}),qt=r({type:s("getUser"),requestId:t(),userId:Ke}),At=h("status",[r({type:s("getUserResult"),requestId:t(),status:s("success"),user:ce}),r({type:s("getUserResult"),requestId:t(),status:s("error"),error:_n})]);var Cn=h("type",[r({type:s("emoji"),emoji:t()}),r({type:s("external"),url:t()})]),En=r({name:t(),description:u(t()),type:gt}),On=r({name:t(),description:u(t()),icon:u(Cn),properties:u(N(t(),En),{})}),me=r({version:s(1),name:u(t()),description:u(t()),slashCommand:u(t()),icon:u(r({type:s("emoji"),emoji:t()})),dataSources:u(N(t(),On),{})});var ge=D(["light","dark"]);var Pn=t(),jn=r({code:Pn,message:t(),isRetryable:d()});var Ae=h("status",[r({type:s("init"),initializationId:t(),status:s("success"),theme:ge,contrastMode:ve,blockId:ae,parent:ue,page:de,manifest:me,dataSources:r({bindings:fe}),currentUser:ce}),r({type:s("init"),initializationId:t(),status:s("error"),error:jn})]);var Tt=r({type:s("invalidSandboxMessage"),reason:t()});var Bn=t(),Rn=r({code:Bn,message:t(),isRetryable:d()}),Nt=r({type:s("listUsers"),requestId:t(),startCursor:u(t()),pageSize:u(C())}),Ut=h("status",[r({type:s("listUsersResult"),requestId:t(),status:s("success"),list:Bt}),r({type:s("listUsersResult"),requestId:t(),status:s("error"),error:Rn})]);var Mn=t(),Dn=r({code:Mn,message:t(),isRetryable:d()}),Ft=r({type:s("openExternalUrl"),requestId:t(),url:t()}),zt=h("status",[r({type:s("openExternalUrlResult"),requestId:t(),status:s("success")}),r({type:s("openExternalUrlResult"),requestId:t(),status:s("error"),error:Dn})]);var wn=D(["side_peek","center_peek"]),qn=t(),An=r({code:qn,message:t(),isRetryable:d()}),Ht=r({type:s("openPage"),requestId:t(),pageId:A,mode:wn}),Lt=h("status",[r({type:s("openPageResult"),requestId:t(),status:s("success"),pageId:A}),r({type:s("openPageResult"),requestId:t(),status:s("error"),error:An})]);var Gt=r({type:s("pageChanged"),page:de});var Vt=r({type:s("parentChanged"),parent:ue});var $t=r({unit:D(["year","month","week","day"]),value:C(),time:t(),defaultTimeZone:u(t())}),Tn=r({unit:D(["hour","minute"]),value:C()}),Qt=r({unit:s("none")}),Nn=I([$t,Tn]),Xt=u(I([$t,Qt])),Wt=u(I([Nn,Qt])),Un=r({type:s("date"),start_date:t(),reminder:Xt}),Fn=r({type:s("daterange"),start_date:t(),end_date:t(),reminder:Xt}),zn=r({type:s("datetime"),start_date:t(),start_time:t(),time_zone:u(t()),reminder:Wt}),Hn=r({type:s("datetimerange"),start_date:t(),start_time:t(),end_date:t(),end_time:t(),time_zone:u(t()),reminder:Wt}),Jt=h("type",[Un,Fn,zn,Hn]);var Kt=I([t(),C(),d(),Jt,O(t()),O(qe)]);var Yt=r({id:A,is_archived:d(),in_trash:d(),propertiesById:N(t(),u(Kt))}),Zt=r({id:A,is_archived:d(),in_trash:d(),properties:N(t(),u(Je))});var Ln=t(),Gn=r({code:Ln,message:t(),isRetryable:d()}),er=h("status",[r({type:s("queryDataSourceResult"),subscriptionId:t(),status:s("success"),items:O(I([Zt,Yt])),hasMore:d()}),r({type:s("queryDataSourceResult"),subscriptionId:t(),status:s("error"),error:Gn})]);var tr=r({type:s("themeChanged"),theme:ge});var Vn=t(),$n=r({code:Vn,message:t(),isRetryable:d()}),rr=h("status",[r({type:s("updatePageResult"),requestId:t(),status:s("success"),page:he}),r({type:s("updatePageResult"),requestId:t(),status:s("error"),error:$n})]);var nr=h("type",[Ae,tr,_t,Vt,Gt,Rt,Mt,er,jt,wt,At,Ut,Lt,zt,rr,Tt]);function or(){return{code:"no_connect",message:"Sandbox did not send a connect message.",isRetryable:!0}}function sr(){return{code:"invalid_connect_payload",message:"Sandbox sent an invalid connect message.",isRetryable:!1}}function Ye(e){let{currentBridgeProtocolVersion:n}=e;return{code:"invalid_protocol_version",message:`Sandbox reported an invalid bridge protocol version: ${n}`,isRetryable:!1}}function Ze(e){let{currentBridgeProtocolVersion:n,minBridgeProtocolVersion:o}=e;return{code:"unsupported_protocol_version",message:`Sandbox bridge protocol version ${n} is not supported. Minimum supported version is ${o}.`,isRetryable:!1}}function et(){return{code:"context_unavailable",message:"Host page context is unavailable.",isRetryable:!0}}function ir(){return{code:"initial_state_timeout",message:"Host did not prepare initial state before the timeout.",isRetryable:!0}}function ar(){return{code:"missing_data_source_binding",message:"A required data source is not mapped.",isRetryable:!1}}function ur(){return{code:"missing_property_binding",message:"A required data source property is not mapped.",isRetryable:!1}}function cr(){return{code:"invalid_property_binding",message:"A mapped data source property is missing or incompatible.",isRetryable:!1}}function lr(){return{code:"no_init_result",message:"Sandbox did not acknowledge initialization.",isRetryable:!0}}function pr(){return{code:"invalid_init_result_payload",message:"Sandbox sent an invalid initialization result.",isRetryable:!1}}function Ee(){return{code:"unknown_error",message:"Unexpected error while initializing custom block.",isRetryable:!1}}function le(e){throw new Error(`[custom-blocks-host] Unexpected value encountered: ${JSON.stringify(e)}`)}function tt(e){return Number.isFinite(e)&&Number.isInteger(e)&&e>=1}var Qn=5e3,Xn=5e3,Wn=5e3;function fr(e){let{prepareInit:n,sendInitMessage:o,warn:i,flushPendingHostStateChanges:c,minBridgeProtocolVersion:l,noConnectTimeoutMs:f=Qn,initialStateTimeoutMs:y=Xn,noInitResultTimeoutMs:m=Wn,stopHostWithFailure:_,onInitResult:x,onConnectionFailure:w}=e,S="waitingForConnect",L,G,U,j,Y=!1,ee=!1;function W(){L!==void 0&&(window.clearTimeout(L),L=void 0)}function se(){G!==void 0&&(window.clearTimeout(G),G=void 0)}function V(){U!==void 0&&(window.clearTimeout(U),U=void 0)}function B(g){let{initializationId:k,error:$,phase:te,source:q}=g;switch(S){case"waitingForConnect":case"preparingInit":break;case"waitingForInitResult":case"initialized":case"error":case"stopped":return;default:return le(S)}S="error",j=k,W(),se(),o({type:"init",initializationId:k,status:"error",error:$}),w?.({...$,phase:te,source:q})}async function F(g){if(S==="waitingForConnect"){S="preparingInit",j=g.initializationId,W(),G=window.setTimeout(()=>{if(S!=="preparingInit")return;let k=ir();i({...k,initializationId:g.initializationId}),B({initializationId:g.initializationId,error:k,phase:"init",source:"host"})},y);try{let k=await n(g);if(S!=="preparingInit")return;if(se(),k.status==="error"){B({initializationId:g.initializationId,error:k.error,phase:"init",source:"host"});return}S="waitingForInitResult";let $={type:"init",initializationId:g.initializationId,status:"success",theme:k.initialState.theme,contrastMode:k.initialState.contrastMode??xt,blockId:k.initialState.blockId,parent:k.initialState.parent,page:k.initialState.page,currentUser:k.initialState.currentUser,manifest:k.initialState.manifest,dataSources:k.initialState.dataSources};o($),U=window.setTimeout(()=>{if(S!=="waitingForInitResult")return;S="error";let te=lr();w?.({...te,phase:"initResult",source:"host"}),i({...te,initializationId:g.initializationId})},m)}catch(k){if(S!=="preparingInit")return;i({message:"Failed to prepare custom block initialization",error:k}),B({initializationId:g.initializationId,error:Ee(),phase:"init",source:"host"})}}}function J(g){if(S!=="stopped"&&S==="waitingForConnect"){if(!tt(g.bridgeProtocolVersion)){let k=Ye({currentBridgeProtocolVersion:g.bridgeProtocolVersion});B({initializationId:g.initializationId,error:k,phase:"connect",source:"host"});return}if(g.bridgeProtocolVersion<l){let k=Ze({currentBridgeProtocolVersion:g.bridgeProtocolVersion,minBridgeProtocolVersion:l});B({initializationId:g.initializationId,error:k,phase:"connect",source:"host"});return}if(g.status==="error"){B({initializationId:g.initializationId,error:g.error,phase:"connect",source:"sandbox"});return}ee=!0,F(g)}}function ne(g){if(S==="stopped"||S!=="waitingForConnect")return"handled";let{initializationId:k,bridgeProtocolVersion:$}=g;if(k===void 0)return"nack";let te=g.error;return $!==void 0&&(tt($)?$<l&&(te=Ze({currentBridgeProtocolVersion:$,minBridgeProtocolVersion:l})):te=Ye({currentBridgeProtocolVersion:$})),B({initializationId:k,error:te,phase:"connect",source:"host"}),"handled"}function R(g){let{initializationId:k,error:$}=g;S!=="waitingForInitResult"||k===void 0||k!==j||(W(),V(),S="error",i($),w?.({...$,phase:"initResult",source:"host"}))}function K(){if(S!=="stopped"){if(Y){_({phase:"runtime",source:"host",code:"iframe_reloaded",message:"The iframe reloaded. Create a new host and iframe to reconnect.",isRetryable:!0});return}Y=!0,W(),S==="waitingForConnect"&&(L=window.setTimeout(()=>{if(S!=="waitingForConnect")return;S="error";let g=or();i(g),w?.({...g,phase:"connect",source:"host"})},f))}}function pe(g){if(S!=="waitingForInitResult"||g.initializationId!==j){i({message:"Ignored stale or unexpected initResult",payload:g});return}V(),S=g.status==="success"?"initialized":"error",g.status==="success"?c():w?.({...g.error,phase:"initResult",source:"sandbox"}),x?.(g)}function Re(){S="stopped",W(),se(),V()}return{get status(){return S},get hasConnectedSandbox(){return ee},handleConnect:J,handleInitResult:pe,handleInvalidConnect:ne,handleInvalidInitResult:R,onIframeLoad:K,stop:Re}}function rt({url:e,hostOrigin:n}){return typeof n=="string"&&n!==""&&e.origin!==n&&(e.protocol==="http:"||e.protocol==="https:")&&(e.hostname==="localhost"||e.hostname==="127.0.0.1"||e.hostname.endsWith(".localhost"))&&e.username===""&&e.password===""}async function mr(e){let n=new AbortController,o=()=>n.abort();e.signal.addEventListener("abort",o,{once:!0});let i=new Promise((l,f)=>{n.signal.addEventListener("abort",()=>f(n.signal.reason),{once:!0})});e.signal.aborted&&n.abort();let c=e.manifestSource==="local"?window.setTimeout(()=>{n.abort(new Error("Manifest loading timed out after 5000 ms."))},5e3):void 0;try{let l=await Promise.race([e.manifestSource==="local"?Jn(e.sandboxOrigin,n.signal):e.getPersistedManifest({signal:n.signal}),i]);if(n.signal.aborted)throw new Error("Manifest loading was cancelled.");return{status:"success",manifest:oe(me,l)}}catch(l){return e.signal.aborted||e.onError(l),{status:"error",error:{code:"manifest_unavailable",message:"The custom block manifest is unavailable.",isRetryable:!0}}}finally{window.clearTimeout(c),e.signal.removeEventListener("abort",o)}}async function Jn(e,n){let o=new URL(e);if(!rt({url:o,hostOrigin:window.location.origin}))throw new Error("Preview requires a separate loopback origin.");let i=await fetch(new URL("/manifest",o),{credentials:"omit",redirect:"error",cache:"no-store",signal:n});if(!i.ok)throw new Error(`Manifest request failed: HTTP ${i.status}.`);return i.json()}function yr(e,n){return n>=5||!(e.type==="init"&&e.status==="success"||e.type==="dataSourcesChanged")?e:{...e,dataSources:{bindings:Object.fromEntries(Object.entries(e.dataSources.bindings).map(([i,c])=>[i,{...c,collectionSchema:{...c.collectionSchema,propertiesById:{...c.collectionSchema?.propertiesById,...kt}}}]))}}}var vr=r({theme:ge,contrastMode:u(ve),blockId:ae,parent:ue,page:de,manifest:me,dataSources:r({bindings:fe}),currentUser:ce});function dr(e){if(e.length>2048||!URL.canParse(e))return;let n=new URL(e);if(!(n.protocol!=="http:"&&n.protocol!=="https:"||n.username!==""||n.password!==""||n.href.length>2048))return n.href}function hr(e){switch(e.type){case"connect":case"init":case"initResult":return!0;default:return!1}}var gr=r({code:t(),message:t(),isRetryable:d()});var br={type:s("connect"),initializationId:t(),bridgeProtocolVersion:C(),sdkVersion:t()},kr=h("status",[r({status:s("success"),manifest:u(me),...br}),r({status:s("error"),error:gr,...br})]);var Kn=h("type",[r({type:s("start")}),r({type:s("end")}),r({type:s("before"),blockId:ae}),r({type:s("after"),blockId:ae})]),Yn=h("type",[r({type:s("page_id"),page_id:A}),r({type:s("data_source_id"),data_source_id:re})]),Sr=r({type:s("createPage"),requestId:t(),parent:Yn,properties:Ce,position:u(Kn)});var Zn=t(),eo=r({code:Zn,message:t(),isRetryable:d()}),Ir=h("status",[r({type:s("initResult"),initializationId:t(),status:s("success"),initialHeight:u(z(C(),ke(),Ie(0)))}),r({type:s("initResult"),initializationId:t(),status:s("error"),error:eo})]);var xr=r({type:s("invalidHostMessage"),reason:t()});var _r=D(["ascending","descending"]);var Cr=z(A,He(/^(?:[0-9a-f]{32}|[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12})$/i),Le(e=>e.replaceAll("-","").toLowerCase().replace(/^(.{8})(.{4})(.{4})(.{4})(.{12})$/,"$1-$2-$3-$4-$5"))),nt=I([p({contains:Cr}),p({does_not_contain:Cr})]),Be=I([p({is_empty:s(!0)}),p({is_not_empty:s(!0)})]),je=I([t(),O(t())]),Er=p({object:D(["user","group"]),id:z(t(),Se(1))}),to=I([p({contains:Er}),p({does_not_contain:Er}),Be]),Or=p({object:s("user"),id:z(t(),Se(1),De(2e3))}),ro=I([p({contains:Or}),p({does_not_contain:Or}),p({is_empty:s(!0)}),p({is_not_empty:s(!0)})]),Oe=I([p({equals:t()}),p({does_not_equal:t()}),p({contains:t()}),p({does_not_contain:t()}),p({starts_with:t()}),p({ends_with:t()}),Be]),no=I([p({equals:C()}),p({does_not_equal:C()}),p({greater_than:C()}),p({less_than:C()}),p({greater_than_or_equal_to:C()}),p({less_than_or_equal_to:C()}),Be]),oo=I([p({equals:d()}),p({does_not_equal:d()})]),Rr=I([p({equals:je}),p({does_not_equal:je}),Be]),Pr=D(["To-do","In progress","Complete","Current","Future"]),jr=I([Pr,z(O(Pr),Se(1),De(5))]),so=I([p({group_equals:jr}),p({group_does_not_equal:jr})]),io=I([Rr,so]),ao=I([p({contains:je}),p({contains_all:je}),p({does_not_contain:je}),Be]),X=D(["start_date","end_date"]),uo=D(["today","tomorrow","yesterday","one_week_ago","one_week_from_now","one_month_ago","one_month_from_now"]),Pe=I([uo,t()]),co=I([p({target:u(X),equals:Pe}),p({target:u(X),before:Pe}),p({target:u(X),after:Pe}),p({target:u(X),on_or_before:Pe}),p({target:u(X),on_or_after:Pe}),p({target:u(X),this_week:p({})}),p({target:u(X),past_week:p({})}),p({target:u(X),past_month:p({})}),p({target:u(X),past_year:p({})}),p({target:u(X),next_week:p({})}),p({target:u(X),next_month:p({})}),p({target:u(X),next_year:p({})}),p({target:u(X),is_empty:s(!0)}),p({target:u(X),is_not_empty:s(!0)})]),Br=I([p({propertyId:t(),relation:nt}),p({propertyId:t(),created_by:ro}),p({propertyId:t(),title:Oe}),p({propertyId:t(),rich_text:Oe}),p({propertyId:t(),url:Oe}),p({propertyId:t(),email:Oe}),p({propertyId:t(),phone_number:Oe}),p({propertyId:t(),number:no}),p({propertyId:t(),checkbox:oo}),p({propertyId:t(),select:Rr}),p({propertyId:t(),multi_select:ao}),p({propertyId:t(),status:io}),p({propertyId:t(),date:co}),p({propertyId:t(),people:to})]),lo=I([Br,p({and:O(Br)})]),ot=10,po=p({propertyId:t(),direction:_r}),Mr=r({type:s("queryDataSource"),subscriptionId:t(),dataSourceId:re,limit:C(),filter:u(lo),sorts:u(O(po))});var Dr=r({type:s("resize"),height:z(C(),ke(),Ie(0))});var wr=r({type:s("unsubscribeDataSourceQuery"),subscriptionId:t()});var qr=r({type:s("updatePage"),requestId:t(),pageId:A,properties:u(Ce),icon:u(Xe),cover:u(We),archived:u(d())});var Ar=h("type",[kr,Ir,Mr,wr,Sr,Dt,qt,Nt,Ht,Ft,qr,Dr,xr]);function Tr(e){if(typeof e=="object"&&e!==null&&"type"in e&&typeof e.type=="string")return e.type}function Nr(e){let n=Tr(e);return n==="invalidHostMessage"||n==="invalidSandboxMessage"?{incomingType:n}:{incomingType:n,nack:{type:"invalidSandboxMessage",reason:fo(n)}}}function fo(e){return e!==void 0?`Unsupported sandbox message of type "${e}"`:"Unsupported sandbox message (no `type` field or non-object payload)"}var Ur=r({initializationId:t()}),mo=r({bridgeProtocolVersion:I([C(),Ge()])});function Fr(e){let{iframe:n,sandboxOrigin:o,getInitStatus:i,emit:c,sendNack:l,onInvalidConnect:f,onInvalidInitResult:y,onConnect:m,onInitResult:_,onQueryDataSource:x,onUnsubscribeDataSourceQuery:w,onCreatePage:S,onGetPage:L,onOpenPage:G,onOpenExternalUrl:U,onGetUser:j,onListUsers:Y,onUpdatePage:ee,onResize:W}=e;function se(V,B){c("warn",{message:"Ignored unsupported sandbox message",payload:st(V),issues:B});let F=Nr(V);if(F.incomingType==="connect"){let J=_e(Ur,V),ne=_e(mo,V);if(f({initializationId:J.success?J.output.initializationId:void 0,error:sr(),bridgeProtocolVersion:ne.success?ne.output.bridgeProtocolVersion:void 0})==="handled")return}if(F.incomingType==="initResult"){let J=_e(Ur,V);y({initializationId:J.success?J.output.initializationId:void 0,error:pr()})}F.nack!==void 0&&i()!=="stopped"&&l(F.nack)}return function(B){let F=B.source===n.contentWindow,J=B.origin===o;if(!F||!J)return;let ne=_e(Ar,B.data);if(!ne.success){se(B.data,ne.issues);return}let R=ne.output;if(!hr(R)&&i()!=="initialized"){c("warn",{message:`Ignored ${R.type} before initialization completed`,payload:st(R)});return}switch(c("in",st(R)),R.type){case"connect":m(R);return;case"initResult":_(R);return;case"queryDataSource":x(R);return;case"unsubscribeDataSourceQuery":w(R);return;case"createPage":S(R);return;case"openPage":G(R);return;case"openExternalUrl":U(R);return;case"getPage":L(R);return;case"getUser":j(R);return;case"listUsers":Y(R);return;case"updatePage":ee(R);return;case"resize":W(R);return;case"invalidHostMessage":return;default:le(R)}}}function st(e){return typeof e=="object"&&e!==null&&"type"in e&&e.type==="openExternalUrl"?{type:"openExternalUrl",..."requestId"in e?{requestId:e.requestId}:{}}:e}var Te=class{constructor(n){this.onUnsubscribe=n}onUnsubscribe;bySubscriptionId=new Map;subscribe(n){this.unsubscribe(n.subscriptionId);let o={_tag:"QuerySubscriptionToken"};return this.bySubscriptionId.set(n.subscriptionId,{message:n,token:o,isRefreshing:!0,shouldRefreshAgain:!1}),o}isCurrent(n,o){return this.bySubscriptionId.get(n)?.token===o}unsubscribe(n){this.bySubscriptionId.delete(n)&&this.onUnsubscribe(n)}refresh(n){let o=[],i=!1;for(let c of this.bySubscriptionId.values())if(c.message.dataSourceId===n){if(i=!0,c.isRefreshing){c.shouldRefreshAgain=!0;continue}c.isRefreshing=!0,o.push({message:c.message,token:c.token})}return i?o:void 0}finish(n,o){let i=this.bySubscriptionId.get(n);if(i?.token===o&&(i.isRefreshing=!1,!!i.shouldRefreshAgain))return i.shouldRefreshAgain=!1,i.isRefreshing=!0,{message:i.message,token:i.token}}unsubscribeAll(){for(let n of this.bySubscriptionId.keys())this.unsubscribe(n)}};function zr(e,n){if(e===void 0)return;let o="and"in e?e.and:[e];for(let i of o){let c=yo(i,n);if(c!==void 0)return c}}function yo(e,n){if(!Object.hasOwn(n.propertiesById,e.propertyId))return{code:"invalid_data_source_query_filter",message:`Data source query filter property ID "${e.propertyId}" is not defined in the bound data source schema.`,isRetryable:!1};let o=n.propertiesById[e.propertyId],i=Object.keys(e).find(y=>y!=="propertyId");if(i!==o.type)return{code:"invalid_data_source_query_filter",message:`Data source query filter branch "${i}" does not match property type "${o.type}".`,isRetryable:!1};if("status"in e&&o.type==="status"){let y=e.status;if("group_equals"in y||"group_does_not_equal"in y){let m="group_equals"in y?y.group_equals:y.group_does_not_equal,x=(Array.isArray(m)?m:[m]).find(w=>!o.groups.some(S=>S.name===w));return x===void 0?void 0:{code:"invalid_data_source_query_filter",message:`Unknown status group "${x}".`,isRetryable:!1}}}if("relation"in e&&!yt(nt,e.relation))return{code:"invalid_data_source_query_filter",message:"Relation filters require a page ID.",isRetryable:!1};let c=vo(e);if(c===void 0||o.type!==c.propertyType)return;let l=new Set(o.options.map(y=>y.name)),f=ho(c.operator).find(y=>!l.has(y));if(f!==void 0)return{code:"invalid_data_source_query_filter",message:`Data source query filter option "${f}" is not defined for property "${e.propertyId}".`,isRetryable:!1}}function vo(e){if("select"in e)return{propertyType:"select",operator:e.select};if("multi_select"in e)return{propertyType:"multi_select",operator:e.multi_select};if("status"in e){let n=e.status;return"group_equals"in n||"group_does_not_equal"in n?void 0:{propertyType:"status",operator:n}}}function ho(e){let n;if("equals"in e)n=e.equals;else if("does_not_equal"in e)n=e.does_not_equal;else if("contains"in e)n=e.contains;else if("contains_all"in e)n=e.contains_all;else if("does_not_contain"in e)n=e.does_not_contain;else return"is_empty"in e||"is_not_empty"in e?[]:le(e);return Array.isArray(n)?n:[n]}var go=new Set(bt);function Hr(e,n){if(e===void 0)return;if(e.length>ot)return{code:"invalid_data_source_query_sort",message:`Data source query sorts may contain at most ${ot} entries.`,isRetryable:!1};let o=new Set;for(let i of e){if(o.has(i.propertyId))return{code:"invalid_data_source_query_sort",message:`Data source query sorts cannot contain duplicate property ID "${i.propertyId}".`,isRetryable:!1};if(o.add(i.propertyId),!Object.hasOwn(n.propertiesById,i.propertyId))return{code:"invalid_data_source_query_sort",message:`Data source query sort property ID "${i.propertyId}" is not defined in the bound data source schema.`,isRetryable:!1};let c=n.propertiesById[i.propertyId];if(!go.has(c.type))return{code:"invalid_data_source_query_sort",message:`Data source query sorts do not yet support property type "${c.type}".`,isRetryable:!1}}}var Gr=5;function bo(e){let{iframe:n,prepareInitialState:o,handlers:i,onInitialized:c,onConnectionFailure:l,onLog:f,onQueryUnsubscribed:y,sandboxOrigin:m,minBridgeProtocolVersion:_,noConnectTimeoutMs:x,initialStateTimeoutMs:w,noInitResultTimeoutMs:S}=e,L=Math.max(_??3,3),G=new AbortController,U,j={},Y=!1,ee=new AbortController,W,se,V=6,B=new Te(a=>{y?.(a)});function F(a,b){f?.(a,b)}function J(a){let b=q.status;switch(b){case"waitingForConnect":case"preparingInit":case"waitingForInitResult":case"initialized":case"error":break;case"stopped":return;default:return le(b)}let E=yr(a,V);F("out",E),n.contentWindow?.postMessage(E,m)}function ne(a){J(oe(Ae,a))}function R(a){J(a)}function K(a){let b=q.status;switch(b){case"initialized":J(oe(nr,a));return;case"waitingForConnect":case"preparingInit":case"waitingForInitResult":case"error":case"stopped":return;default:le(b)}}async function pe(a,b){if(b===void 0)return;let E=await b(a);K({type:`${a.type}Result`,requestId:a.requestId,...E})}function Re(a){let b=a.response.status==="error"?{type:"queryDataSourceResult",subscriptionId:a.subscriptionId,status:"error",error:a.response.error}:{type:"queryDataSourceResult",subscriptionId:a.subscriptionId,status:"success",items:a.response.items,hasMore:a.response.hasMore};K(b)}async function g(a,b=B.subscribe(a)){try{let E=ko(se,a.dataSourceId),ye=So(a,E);if(ye!==void 0){B.isCurrent(a.subscriptionId,b)&&(B.unsubscribe(a.subscriptionId),Re({subscriptionId:a.subscriptionId,response:{status:"error",error:ye}}));return}let Ne=await i.queryDataSource(a);if(!B.isCurrent(a.subscriptionId,b))return;Ne.status==="error"&&!Ne.error.isRetryable&&B.unsubscribe(a.subscriptionId),Re({subscriptionId:a.subscriptionId,response:Ne})}finally{let E=B.finish(a.subscriptionId,b);E!==void 0&&g(E.message,E.token)}}function k(a){q.status==="stopped"||q.status==="error"||(Object.assign(j,a),te())}async function $(a){if(i.openExternalUrl===void 0||G.signal.aborted||U===a.requestId)return;if(U!==void 0){let E={type:"openExternalUrlResult",requestId:a.requestId,status:"error",error:{code:"pending_navigation",message:"Another external navigation request is pending.",isRetryable:!0}};K(E);return}let b=dr(a.url);if(b===void 0){let E={type:"openExternalUrlResult",requestId:a.requestId,status:"error",error:{code:"invalid_url",message:"Only valid HTTP or HTTPS URLs without credentials, up to 2,048 characters, can be opened.",isRetryable:!1}};K(E);return}U=a.requestId;try{let E=await i.openExternalUrl({...a,url:b},{signal:G.signal});if(G.signal.aborted)return;let ye={type:"openExternalUrlResult",requestId:a.requestId,...E};K(ye)}catch(E){if(!G.signal.aborted)throw E}finally{U===a.requestId&&(U=void 0)}}function te(){if(q.status!=="initialized")return;let a=j;j={},a.theme!==void 0&&K({type:"themeChanged",theme:a.theme}),a.contrastMode!==void 0&&K({type:"contrastModeChanged",contrastMode:a.contrastMode}),a.parent!==void 0&&K({type:"parentChanged",parent:a.parent}),a.page!==void 0&&K({type:"pageChanged",page:a.page}),a.dataSources!==void 0&&K({type:"dataSourcesChanged",dataSources:a.dataSources}),a.currentUser!==void 0&&K({type:"currentUserChanged",currentUser:a.currentUser})}let q=fr({async prepareInit(a){V=a.bridgeProtocolVersion;let b=await Qr;return q.status!=="preparingInit"?b:$r(b)},sendInitMessage:ne,warn:a=>F("warn",a),flushPendingHostStateChanges:te,minBridgeProtocolVersion:L,noConnectTimeoutMs:x,initialStateTimeoutMs:w,noInitResultTimeoutMs:S,stopHostWithFailure:ut,onInitResult(a){a.status==="success"&&W!==void 0&&c?.({manifest:W,initialHeight:a.initialHeight})},onConnectionFailure:a=>{ee.abort(),l?.(a)}});function $r(a){if(a.status==="error")return a;let b=oe(vr,{...a.initialState,...j});if(W=b.manifest,j={},V<Gr&&b.page.type==="unavailable")return{status:"error",error:et()};let E=Vr(b.manifest,b.dataSources);return E!==void 0?{status:"error",error:E}:(se=b.dataSources,Y=!0,{status:"success",initialState:b})}let Qr=Xr().catch(a=>(ee.signal.aborted||F("warn",{message:"Failed to prepare custom block initialization",error:a}),{status:"error",error:Ee()}));async function Xr(){let a=await mr({...e,sandboxOrigin:m,signal:ee.signal,onError:E=>{F("warn",{message:"Failed to load custom block manifest",error:E})}});if(a.status==="error")return a;if(ee.signal.aborted)return{status:"error",error:Ee()};let b=await o({manifest:a.manifest,signal:ee.signal});return b.status==="error"?b:{status:"success",initialState:{...b.initialState,manifest:a.manifest}}}let it=Fr({iframe:n,sandboxOrigin:m,getInitStatus:()=>q.status,emit:F,sendNack:R,onInvalidConnect:q.handleInvalidConnect,onInvalidInitResult:q.handleInvalidInitResult,onConnect:q.handleConnect,onInitResult:q.handleInitResult,onQueryDataSource:g,onUnsubscribeDataSourceQuery:a=>B.unsubscribe(a.subscriptionId),onOpenExternalUrl:$,onCreatePage:a=>pe(a,i.createPage),onGetPage:a=>pe(a,i.getPage),onOpenPage:a=>pe(a,i.openPage),onGetUser:a=>pe(a,i.getUser),onListUsers:a=>pe(a,i.listUsers),onUpdatePage:a=>pe(a,i.updatePage),onResize:a=>i.resize?.(a)});window.addEventListener("message",it),n.addEventListener("load",q.onIframeLoad);function at(){G.abort(),ee.abort(),window.removeEventListener("message",it),n.removeEventListener("load",q.onIframeLoad),q.stop(),B.unsubscribeAll()}function ut(a){at(),F("warn",a),l?.(a)}return{stop:at,setTheme(a){k({theme:a})},setContrastMode(a){k({contrastMode:a})},setParent(a){k({parent:a})},setPage(a){if(a.type==="unavailable"&&V<Gr&&(q.status==="preparingInit"&&Y||q.status==="waitingForInitResult"||q.status==="initialized")){ut({...et(),phase:"runtime",source:"host"});return}k({page:a})},setCurrentUser(a){k({currentUser:a})},setDataSources(a){let b={bindings:oe(fe,a.bindings)};if(q.hasConnectedSandbox&&W!==void 0&&Vr(W,b)!==void 0){F("warn",{message:"Ignored invalid data source bindings update",payload:b});return}se=b,k({dataSources:b})},refreshQuery({dataSourceId:a}){if(q.status!=="initialized")return;let b=oe(re,a),E=B.refresh(b);if(E===void 0){F("warn",`No active query exists for data source "${a}"`);return}for(let ye of E)g(ye.message,ye.token)}}}function ko(e,n){return Object.values(e?.bindings??{}).find(o=>o.collectionPointer?.id===n)?.collectionSchema}function Vr(e,n){for(let[o,i]of Object.entries(e.dataSources)){let c=n.bindings[o];if(c?.collectionPointer===void 0||c.collectionSchema===void 0)return ar();for(let[l,f]of Object.entries(i.properties??{})){let y=c.propertyIdsByKey?.[l];if(y===void 0)return ur();if(c.collectionSchema.propertiesById[y]?.type!==f.type)return cr()}}}function So(e,n){return n===void 0?e.filter===void 0&&(e.sorts?.length??0)===0?void 0:{code:"data_source_schema_unavailable",message:"You cannot query this data source with filters or sorts because its schema is unavailable.",isRetryable:!1}:zr(e.filter,n)??Hr(e.sorts,n)}function Io(e){return oe(A,e)}export{Ue as LATEST_BRIDGE_PROTOCOL_VERSION,Wr as LEGACY_PROPERTY_SHAPE_PROTOCOL_VERSION,bo as createCustomBlockHost,Jr as getAutoBoundPropertyIdsByKey,rt as isLocalCustomBlockUrl,Io as toNotionPageId};
@@ -1 +1 @@
1
- {"version":3,"file":"createCustomBlockHost.d.ts","sourceRoot":"","sources":["../src/createCustomBlockHost.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,8CAA8C,CAAA;AAI5F,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAA;AAClF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAA;AAgBvF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gDAAgD,CAAA;AAC3F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAA;AAEpF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAA;AAClF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gDAAgD,CAAA;AACtF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAWzC,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,gCAAgC,CAAA;AAEpF,OAAO,KAAK,EACX,iCAAiC,EAIjC,kCAAkC,EAClC,MAAM,sBAAsB,CAAA;AAG7B,OAAO,KAAK,EACX,sBAAsB,EACtB,uBAAuB,EACvB,2BAA2B,EAC3B,MAAM,qBAAqB,CAAA;AAe5B,MAAM,MAAM,sBAAsB,GAAG,8BAA8B,GAAG;IACrE,MAAM,EAAE,iBAAiB,CAAA;IACzB,aAAa,EAAE,MAAM,CAAA;IACrB;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,EAAE,uBAAuB,CAAA;IACjC,gGAAgG;IAChG,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE;QACvB,QAAQ,EAAE,mBAAmB,CAAA;QAC7B,aAAa,CAAC,EAAE,MAAM,CAAA;KACtB,KAAK,IAAI,CAAA;IACV;;;;;OAKG;IACH,mBAAmB,EAAE,CAAC,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAA;IAC1E,+FAA+F;IAC/F,mBAAmB,EAAE,CAAC,CAAC,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAA;IACnE,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,2BAA2B,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IAC1E,iFAAiF;IACjF,mBAAmB,EAAE,kCAAkC,CAAA;IACvD,qBAAqB,CAAC,EAAE,MAAM,CAAA;CAC9B,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IACnC,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,KAAK,IAAI,CAAA;IAC/D,eAAe,EAAE,CAChB,YAAY,EAAE,UAAU,CAAC,OAAO,wBAAwB,CAAC,KACrD,IAAI,CAAA;IACT,SAAS,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,KAAK,IAAI,CAAA;IAClE,OAAO,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,KAAK,IAAI,CAAA;IACjE,cAAc,EAAE,CAAC,WAAW,EAAE,iCAAiC,KAAK,IAAI,CAAA;IACxE,cAAc,EAAE,CAAC,WAAW,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,KAAK,IAAI,CAAA;IAC1E,YAAY,EAAE,CAAC,IAAI,EAAE;QACpB,YAAY,EAAE,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAA;KACzD,KAAK,IAAI,CAAA;CACV,CAAA;AAQD,wBAAgB,qBAAqB,CACpC,OAAO,EAAE,sBAAsB,GAC7B,qBAAqB,CA0bvB"}
1
+ {"version":3,"file":"createCustomBlockHost.d.ts","sourceRoot":"","sources":["../src/createCustomBlockHost.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,8CAA8C,CAAA;AAI5F,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAA;AAClF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAA;AAoBvF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gDAAgD,CAAA;AAC3F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAA;AAEpF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAA;AAClF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gDAAgD,CAAA;AACtF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAWzC,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,gCAAgC,CAAA;AAEpF,OAAO,KAAK,EACX,iCAAiC,EAIjC,kCAAkC,EAClC,MAAM,sBAAsB,CAAA;AAI7B,OAAO,KAAK,EACX,sBAAsB,EACtB,uBAAuB,EACvB,2BAA2B,EAC3B,MAAM,qBAAqB,CAAA;AAe5B,MAAM,MAAM,sBAAsB,GAAG,8BAA8B,GAAG;IACrE,MAAM,EAAE,iBAAiB,CAAA;IACzB,aAAa,EAAE,MAAM,CAAA;IACrB;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,EAAE,uBAAuB,CAAA;IACjC,gGAAgG;IAChG,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE;QACvB,QAAQ,EAAE,mBAAmB,CAAA;QAC7B,aAAa,CAAC,EAAE,MAAM,CAAA;KACtB,KAAK,IAAI,CAAA;IACV;;;;;OAKG;IACH,mBAAmB,EAAE,CAAC,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAA;IAC1E,+FAA+F;IAC/F,mBAAmB,EAAE,CAAC,CAAC,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAA;IACnE,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,2BAA2B,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IAC1E,iFAAiF;IACjF,mBAAmB,EAAE,kCAAkC,CAAA;IACvD,qBAAqB,CAAC,EAAE,MAAM,CAAA;CAC9B,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IACnC,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,KAAK,IAAI,CAAA;IAC/D,eAAe,EAAE,CAChB,YAAY,EAAE,UAAU,CAAC,OAAO,wBAAwB,CAAC,KACrD,IAAI,CAAA;IACT,SAAS,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,KAAK,IAAI,CAAA;IAClE,OAAO,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,KAAK,IAAI,CAAA;IACjE,cAAc,EAAE,CAAC,WAAW,EAAE,iCAAiC,KAAK,IAAI,CAAA;IACxE,cAAc,EAAE,CAAC,WAAW,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,KAAK,IAAI,CAAA;IAC1E,YAAY,EAAE,CAAC,IAAI,EAAE;QACpB,YAAY,EAAE,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAA;KACzD,KAAK,IAAI,CAAA;CACV,CAAA;AAQD,wBAAgB,qBAAqB,CACpC,OAAO,EAAE,sBAAsB,GAC7B,qBAAqB,CAmgBvB"}
@@ -9,6 +9,7 @@ import { createInitializationController } from "./lifecycle/initializationContro
9
9
  import { loadCustomBlockManifest } from "./lifecycle/loadCustomBlockManifest.js";
10
10
  import { normalizeHostToSandboxMessage } from "./lifecycle/normalizeHostToSandboxMessage.js";
11
11
  import { customBlockHostInitialStateSchema } from "./lifecycle/types.js";
12
+ import { parseExternalUrl } from "./messages/parseExternalUrl.js";
12
13
  import { createSandboxMessageRouter } from "./messages/sandboxMessageRouter.js";
13
14
  import { MIN_HOST_SUPPORTED_BRIDGE_PROTOCOL_VERSION } from "./protocolVersion.js";
14
15
  import { QuerySubscriptions, } from "./queries/querySubscriptions.js";
@@ -24,6 +25,8 @@ export function createCustomBlockHost(options) {
24
25
  // the runtime no longer implements. Omission uses the runtime minimum.
25
26
  const minBridgeProtocolVersion = Math.max(configuredMinBridgeProtocolVersion ??
26
27
  MIN_HOST_SUPPORTED_BRIDGE_PROTOCOL_VERSION, MIN_HOST_SUPPORTED_BRIDGE_PROTOCOL_VERSION);
28
+ const navigationAbortController = new AbortController();
29
+ let pendingOpenExternalUrlRequestId;
27
30
  let pendingState = {};
28
31
  let hasPreparedInitialState = false;
29
32
  const preparationController = new AbortController();
@@ -152,6 +155,69 @@ export function createCustomBlockHost(options) {
152
155
  Object.assign(pendingState, update);
153
156
  flushPendingHostStateChanges();
154
157
  }
158
+ async function handleOpenExternalUrl(message) {
159
+ if (handlers.openExternalUrl === undefined ||
160
+ navigationAbortController.signal.aborted) {
161
+ return;
162
+ }
163
+ if (pendingOpenExternalUrlRequestId === message.requestId) {
164
+ return;
165
+ }
166
+ if (pendingOpenExternalUrlRequestId !== undefined) {
167
+ const pendingResult = {
168
+ type: "openExternalUrlResult",
169
+ requestId: message.requestId,
170
+ status: "error",
171
+ error: {
172
+ code: "pending_navigation",
173
+ message: "Another external navigation request is pending.",
174
+ isRetryable: true,
175
+ },
176
+ };
177
+ sendInitializedMessage(pendingResult);
178
+ return;
179
+ }
180
+ const url = parseExternalUrl(message.url);
181
+ if (url === undefined) {
182
+ const invalidResult = {
183
+ type: "openExternalUrlResult",
184
+ requestId: message.requestId,
185
+ status: "error",
186
+ error: {
187
+ code: "invalid_url",
188
+ message: "Only valid HTTP or HTTPS URLs without credentials, up to 2,048 characters, can be opened.",
189
+ isRetryable: false,
190
+ },
191
+ };
192
+ sendInitializedMessage(invalidResult);
193
+ return;
194
+ }
195
+ pendingOpenExternalUrlRequestId = message.requestId;
196
+ try {
197
+ const response = await handlers.openExternalUrl({ ...message, url }, {
198
+ signal: navigationAbortController.signal,
199
+ });
200
+ if (navigationAbortController.signal.aborted) {
201
+ return;
202
+ }
203
+ const result = {
204
+ type: "openExternalUrlResult",
205
+ requestId: message.requestId,
206
+ ...response,
207
+ };
208
+ sendInitializedMessage(result);
209
+ }
210
+ catch (error) {
211
+ if (!navigationAbortController.signal.aborted) {
212
+ throw error;
213
+ }
214
+ }
215
+ finally {
216
+ if (pendingOpenExternalUrlRequestId === message.requestId) {
217
+ pendingOpenExternalUrlRequestId = undefined;
218
+ }
219
+ }
220
+ }
155
221
  function flushPendingHostStateChanges() {
156
222
  // Keep updates queued until the sandbox acknowledges initialization.
157
223
  // Updates received before init is sent are included in its payload instead.
@@ -295,6 +361,7 @@ export function createCustomBlockHost(options) {
295
361
  onInitResult: initializationController.handleInitResult,
296
362
  onQueryDataSource: handleQuery,
297
363
  onUnsubscribeDataSourceQuery: message => querySubscriptions.unsubscribe(message.subscriptionId),
364
+ onOpenExternalUrl: handleOpenExternalUrl,
298
365
  onCreatePage: message => respondToRequest(message, handlers.createPage),
299
366
  onGetPage: message => respondToRequest(message, handlers.getPage),
300
367
  onOpenPage: message => respondToRequest(message, handlers.openPage),
@@ -306,6 +373,7 @@ export function createCustomBlockHost(options) {
306
373
  window.addEventListener("message", onMessage);
307
374
  iframe.addEventListener("load", initializationController.onIframeLoad);
308
375
  function stop() {
376
+ navigationAbortController.abort();
309
377
  preparationController.abort();
310
378
  window.removeEventListener("message", onMessage);
311
379
  iframe.removeEventListener("load", initializationController.onIframeLoad);
package/dist/index.d.ts CHANGED
@@ -7,18 +7,19 @@ export type { CreatePageMessage } from "./protocol/messages/createPage.js";
7
7
  export type { GetPageMessage } from "./protocol/messages/getPage.js";
8
8
  export type { GetUserMessage } from "./protocol/messages/getUser.js";
9
9
  export type { ListUsersMessage } from "./protocol/messages/listUsers.js";
10
+ export type { OpenExternalUrlMessage } from "./protocol/messages/openExternalUrl.js";
10
11
  export type { OpenPageMessage } from "./protocol/messages/openPage.js";
11
12
  export type { CustomBlockCheckboxFilterOperator, CustomBlockContainsFilterOperator, CustomBlockCreatedByFilterOperator, CustomBlockDateFilterOperator, CustomBlockNumberFilterOperator, CustomBlockOptionFilterOperator, CustomBlockPeopleFilterOperator, CustomBlockPersonFilterValue, CustomBlockRelationFilterOperator, CustomBlockStatusFilterOperator, CustomBlockStatusGroupFilterOperator, CustomBlockStatusGroupName, CustomBlockTextFilterOperator, QueryDataSourceMessage, ResolvedCustomBlockDataSourceFilter, ResolvedCustomBlockDataSourcePropertyFilter, ResolvedCustomBlockDataSourceSort, } from "./protocol/messages/queryDataSource.js";
12
13
  export type { ResizeMessage } from "./protocol/messages/resize.js";
13
14
  export type { UpdatePageMessage } from "./protocol/messages/updatePage.js";
14
15
  export type { NotionDateInput, NotionFileInput, NotionPageCover, NotionPageIcon, NotionPagePropertyReadMap, NotionPagePropertyValue, NotionPagePropertyWriteMap, NotionRichTextItem, NotionSelectOptionInput, } from "./protocol/pages/page.js";
15
- export { LEGACY_PROPERTY_SHAPE_PROTOCOL_VERSION } from "./protocol/protocolVersion.js";
16
+ export { LATEST_BRIDGE_PROTOCOL_VERSION, LEGACY_PROPERTY_SHAPE_PROTOCOL_VERSION, } from "./protocol/protocolVersion.js";
16
17
  export { type AutoBindableProperty, getAutoBoundPropertyIdsByKey, } from "./autoBindProperties.js";
17
18
  export { type CustomBlockHostHandle, type CustomBlockHostOptions, createCustomBlockHost, } from "./createCustomBlockHost.js";
18
19
  export { toNotionPageId } from "./ids.js";
19
20
  export type { CustomBlockHostManifestOptions } from "./lifecycle/manifestOptions.js";
20
21
  export type { ConnectSuccessMessage, CustomBlockHostDataSourcesPayload, CustomBlockHostInitialState, CustomBlockHostInitialStateResult, CustomBlockHostPreparedStateResult, CustomBlockHostPrepareInitialState, } from "./lifecycle/types.js";
21
22
  export { isLocalCustomBlockUrl } from "./localBlockUrl.js";
22
- export type { CreatePageMessageInput, CustomBlockHostCreatePageResult, CustomBlockHostFailure, CustomBlockHostGetPageResult, CustomBlockHostGetUserResult, CustomBlockHostHandlers, CustomBlockHostListUsersResult, CustomBlockHostLogDirection, CustomBlockHostOpenPageResult, CustomBlockHostUpdatePageResult, GetPageMessageInput, GetUserMessageInput, ListUsersMessageInput, OpenPageMessageInput, QueryDataSourceMessageInput, ResizeMessageInput, UpdatePageMessageInput, } from "./messages/types.js";
23
+ export type { CreatePageMessageInput, CustomBlockHostCreatePageResult, CustomBlockHostFailure, CustomBlockHostGetPageResult, CustomBlockHostGetUserResult, CustomBlockHostHandlers, CustomBlockHostListUsersResult, CustomBlockHostLogDirection, CustomBlockHostNavigationContext, CustomBlockHostOpenExternalUrlResult, CustomBlockHostOpenPageResult, CustomBlockHostUpdatePageResult, GetPageMessageInput, GetUserMessageInput, ListUsersMessageInput, OpenExternalUrlMessageInput, OpenPageMessageInput, QueryDataSourceMessageInput, ResizeMessageInput, UpdatePageMessageInput, } from "./messages/types.js";
23
24
  export type { CustomBlockHostQueryDataSourceResult } from "./queries/types.js";
24
25
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACX,gCAAgC,EAChC,0BAA0B,GAC1B,MAAM,gEAAgE,CAAA;AACvE,YAAY,EAAE,yBAAyB,EAAE,MAAM,gEAAgE,CAAA;AAC/G,YAAY,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAA;AACtF,YAAY,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAA;AAC3E,YAAY,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAA;AACvF,YAAY,EAAE,iBAAiB,EAAE,MAAM,yDAAyD,CAAA;AAChG,YAAY,EAAE,cAAc,EAAE,MAAM,sDAAsD,CAAA;AAC1F,YAAY,EAAE,cAAc,EAAE,MAAM,sDAAsD,CAAA;AAC1F,YAAY,EAAE,gBAAgB,EAAE,MAAM,wDAAwD,CAAA;AAC9F,YAAY,EAAE,eAAe,EAAE,MAAM,uDAAuD,CAAA;AAC5F,YAAY,EACX,iCAAiC,EACjC,iCAAiC,EACjC,kCAAkC,EAClC,6BAA6B,EAC7B,+BAA+B,EAC/B,+BAA+B,EAC/B,+BAA+B,EAC/B,4BAA4B,EAC5B,iCAAiC,EACjC,+BAA+B,EAC/B,oCAAoC,EACpC,0BAA0B,EAC1B,6BAA6B,EAC7B,sBAAsB,EACtB,mCAAmC,EACnC,2CAA2C,EAC3C,iCAAiC,GACjC,MAAM,8DAA8D,CAAA;AACrE,YAAY,EAAE,aAAa,EAAE,MAAM,qDAAqD,CAAA;AACxF,YAAY,EAAE,iBAAiB,EAAE,MAAM,yDAAyD,CAAA;AAChG,YAAY,EACX,eAAe,EACf,eAAe,EACf,eAAe,EACf,cAAc,EACd,yBAAyB,EACzB,uBAAuB,EACvB,0BAA0B,EAC1B,kBAAkB,EAClB,uBAAuB,GACvB,MAAM,gDAAgD,CAAA;AACvD,OAAO,EAAE,sCAAsC,EAAE,MAAM,qDAAqD,CAAA;AAC5G,OAAO,EACN,KAAK,oBAAoB,EACzB,4BAA4B,GAC5B,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACN,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,qBAAqB,GACrB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AACzC,YAAY,EAAE,8BAA8B,EAAE,MAAM,gCAAgC,CAAA;AACpF,YAAY,EACX,qBAAqB,EACrB,iCAAiC,EACjC,2BAA2B,EAC3B,iCAAiC,EACjC,kCAAkC,EAClC,kCAAkC,GAClC,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,YAAY,EACX,sBAAsB,EACtB,+BAA+B,EAC/B,sBAAsB,EACtB,4BAA4B,EAC5B,4BAA4B,EAC5B,uBAAuB,EACvB,8BAA8B,EAC9B,2BAA2B,EAC3B,6BAA6B,EAC7B,+BAA+B,EAC/B,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,2BAA2B,EAC3B,kBAAkB,EAClB,sBAAsB,GACtB,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EAAE,oCAAoC,EAAE,MAAM,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACX,gCAAgC,EAChC,0BAA0B,GAC1B,MAAM,gEAAgE,CAAA;AACvE,YAAY,EAAE,yBAAyB,EAAE,MAAM,gEAAgE,CAAA;AAC/G,YAAY,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAA;AACtF,YAAY,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAA;AAC3E,YAAY,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAA;AACvF,YAAY,EAAE,iBAAiB,EAAE,MAAM,yDAAyD,CAAA;AAChG,YAAY,EAAE,cAAc,EAAE,MAAM,sDAAsD,CAAA;AAC1F,YAAY,EAAE,cAAc,EAAE,MAAM,sDAAsD,CAAA;AAC1F,YAAY,EAAE,gBAAgB,EAAE,MAAM,wDAAwD,CAAA;AAC9F,YAAY,EAAE,sBAAsB,EAAE,MAAM,8DAA8D,CAAA;AAC1G,YAAY,EAAE,eAAe,EAAE,MAAM,uDAAuD,CAAA;AAC5F,YAAY,EACX,iCAAiC,EACjC,iCAAiC,EACjC,kCAAkC,EAClC,6BAA6B,EAC7B,+BAA+B,EAC/B,+BAA+B,EAC/B,+BAA+B,EAC/B,4BAA4B,EAC5B,iCAAiC,EACjC,+BAA+B,EAC/B,oCAAoC,EACpC,0BAA0B,EAC1B,6BAA6B,EAC7B,sBAAsB,EACtB,mCAAmC,EACnC,2CAA2C,EAC3C,iCAAiC,GACjC,MAAM,8DAA8D,CAAA;AACrE,YAAY,EAAE,aAAa,EAAE,MAAM,qDAAqD,CAAA;AACxF,YAAY,EAAE,iBAAiB,EAAE,MAAM,yDAAyD,CAAA;AAChG,YAAY,EACX,eAAe,EACf,eAAe,EACf,eAAe,EACf,cAAc,EACd,yBAAyB,EACzB,uBAAuB,EACvB,0BAA0B,EAC1B,kBAAkB,EAClB,uBAAuB,GACvB,MAAM,gDAAgD,CAAA;AACvD,OAAO,EACN,8BAA8B,EAC9B,sCAAsC,GACtC,MAAM,qDAAqD,CAAA;AAC5D,OAAO,EACN,KAAK,oBAAoB,EACzB,4BAA4B,GAC5B,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACN,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,qBAAqB,GACrB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AACzC,YAAY,EAAE,8BAA8B,EAAE,MAAM,gCAAgC,CAAA;AACpF,YAAY,EACX,qBAAqB,EACrB,iCAAiC,EACjC,2BAA2B,EAC3B,iCAAiC,EACjC,kCAAkC,EAClC,kCAAkC,GAClC,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,YAAY,EACX,sBAAsB,EACtB,+BAA+B,EAC/B,sBAAsB,EACtB,4BAA4B,EAC5B,4BAA4B,EAC5B,uBAAuB,EACvB,8BAA8B,EAC9B,2BAA2B,EAC3B,gCAAgC,EAChC,oCAAoC,EACpC,6BAA6B,EAC7B,+BAA+B,EAC/B,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,2BAA2B,EAC3B,oBAAoB,EACpB,2BAA2B,EAC3B,kBAAkB,EAClB,sBAAsB,GACtB,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EAAE,oCAAoC,EAAE,MAAM,oBAAoB,CAAA"}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export { LEGACY_PROPERTY_SHAPE_PROTOCOL_VERSION } from "./protocol/protocolVersion.js";
1
+ export { LATEST_BRIDGE_PROTOCOL_VERSION, LEGACY_PROPERTY_SHAPE_PROTOCOL_VERSION, } from "./protocol/protocolVersion.js";
2
2
  export { getAutoBoundPropertyIdsByKey, } from "./autoBindProperties.js";
3
3
  export { createCustomBlockHost, } from "./createCustomBlockHost.js";
4
4
  export { toNotionPageId } from "./ids.js";
@@ -0,0 +1,3 @@
1
+ /** Returns a normalized, credential-free HTTP or HTTPS URL. */
2
+ export declare function parseExternalUrl(input: string): string | undefined;
3
+ //# sourceMappingURL=parseExternalUrl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseExternalUrl.d.ts","sourceRoot":"","sources":["../../src/messages/parseExternalUrl.ts"],"names":[],"mappings":"AAEA,+DAA+D;AAC/D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAclE"}
@@ -0,0 +1,15 @@
1
+ const MAX_EXTERNAL_URL_LENGTH = 2048;
2
+ /** Returns a normalized, credential-free HTTP or HTTPS URL. */
3
+ export function parseExternalUrl(input) {
4
+ if (input.length > MAX_EXTERNAL_URL_LENGTH || !URL.canParse(input)) {
5
+ return undefined;
6
+ }
7
+ const parsed = new URL(input);
8
+ if ((parsed.protocol !== "http:" && parsed.protocol !== "https:") ||
9
+ parsed.username !== "" ||
10
+ parsed.password !== "" ||
11
+ parsed.href.length > MAX_EXTERNAL_URL_LENGTH) {
12
+ return undefined;
13
+ }
14
+ return parsed.href;
15
+ }
@@ -5,6 +5,7 @@ import type { GetUserMessage } from "../protocol/messages/getUser.js";
5
5
  import type { InitResultMessage } from "../protocol/messages/initResult.js";
6
6
  import type { InvalidSandboxMessage } from "../protocol/messages/invalidSandboxMessage.js";
7
7
  import type { ListUsersMessage } from "../protocol/messages/listUsers.js";
8
+ import type { OpenExternalUrlMessage } from "../protocol/messages/openExternalUrl.js";
8
9
  import type { OpenPageMessage } from "../protocol/messages/openPage.js";
9
10
  import type { QueryDataSourceMessage } from "../protocol/messages/queryDataSource.js";
10
11
  import type { ResizeMessage } from "../protocol/messages/resize.js";
@@ -27,6 +28,7 @@ export type SandboxMessageRouterOptions = {
27
28
  onUnsubscribeDataSourceQuery: (message: UnsubscribeDataSourceQueryMessage) => void;
28
29
  onCreatePage: (message: CreatePageMessage) => void | Promise<void>;
29
30
  onOpenPage: (message: OpenPageMessage) => void | Promise<void>;
31
+ onOpenExternalUrl: (message: OpenExternalUrlMessage) => void | Promise<void>;
30
32
  onGetPage: (message: GetPageMessage) => void | Promise<void>;
31
33
  onGetUser: (message: GetUserMessage) => void | Promise<void>;
32
34
  onListUsers: (message: ListUsersMessage) => void | Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"sandboxMessageRouter.d.ts","sourceRoot":"","sources":["../../src/messages/sandboxMessageRouter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sDAAsD,CAAA;AAC1F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yDAAyD,CAAA;AAChG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sDAAsD,CAAA;AAC1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sDAAsD,CAAA;AAC1F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yDAAyD,CAAA;AAChG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oEAAoE,CAAA;AAE/G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wDAAwD,CAAA;AAC9F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uDAAuD,CAAA;AAC5F,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8DAA8D,CAAA;AAC1G,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qDAAqD,CAAA;AAExF,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,yEAAyE,CAAA;AAChI,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yDAAyD,CAAA;AAMhG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAA;AACxF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAGvD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAA;AAY7D,MAAM,MAAM,2BAA2B,GAAG;IACzC,MAAM,EAAE,iBAAiB,CAAA;IACzB,aAAa,EAAE,MAAM,CAAA;IACrB,aAAa,EAAE,MAAM,UAAU,CAAA;IAC/B,IAAI,EAAE,CAAC,SAAS,EAAE,2BAA2B,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IACxE,QAAQ,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,IAAI,CAAA;IAClD,gBAAgB,EAAE,wBAAwB,CAAC,sBAAsB,CAAC,CAAA;IAClE,mBAAmB,EAAE,wBAAwB,CAAC,yBAAyB,CAAC,CAAA;IACxE,SAAS,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAA;IAC5C,YAAY,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAA;IAClD,iBAAiB,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5E,4BAA4B,EAAE,CAC7B,OAAO,EAAE,iCAAiC,KACtC,IAAI,CAAA;IACT,YAAY,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClE,UAAU,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9D,SAAS,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,SAAS,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,WAAW,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAChE,YAAY,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClE,QAAQ,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAA;CAC1C,CAAA;AAED,wBAAgB,0BAA0B,CACzC,OAAO,EAAE,2BAA2B,GAClC,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAsI/B"}
1
+ {"version":3,"file":"sandboxMessageRouter.d.ts","sourceRoot":"","sources":["../../src/messages/sandboxMessageRouter.ts"],"names":[],"mappings":"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"}
@@ -13,11 +13,11 @@ const bridgeProtocolVersionSchema = v.object({
13
13
  bridgeProtocolVersion: v.union([v.number(), v.nan()]),
14
14
  });
15
15
  export function createSandboxMessageRouter(options) {
16
- const { iframe, sandboxOrigin, getInitStatus, emit, sendNack, onInvalidConnect, onInvalidInitResult, onConnect, onInitResult, onQueryDataSource, onUnsubscribeDataSourceQuery, onCreatePage, onGetPage, onOpenPage, onGetUser, onListUsers, onUpdatePage, onResize, } = options;
16
+ const { iframe, sandboxOrigin, getInitStatus, emit, sendNack, onInvalidConnect, onInvalidInitResult, onConnect, onInitResult, onQueryDataSource, onUnsubscribeDataSourceQuery, onCreatePage, onGetPage, onOpenPage, onOpenExternalUrl, onGetUser, onListUsers, onUpdatePage, onResize, } = options;
17
17
  function onInvalidSandboxMessage(data, issues) {
18
18
  emit("warn", {
19
19
  message: "Ignored unsupported sandbox message",
20
- payload: data,
20
+ payload: redactExternalUrl(data),
21
21
  issues,
22
22
  });
23
23
  const response = getInvalidSandboxMessageResponse(data);
@@ -70,11 +70,11 @@ export function createSandboxMessageRouter(options) {
70
70
  if (!isInitHandshakeMessage(message) && getInitStatus() !== "initialized") {
71
71
  emit("warn", {
72
72
  message: `Ignored ${message.type} before initialization completed`,
73
- payload: message,
73
+ payload: redactExternalUrl(message),
74
74
  });
75
75
  return;
76
76
  }
77
- emit("in", message);
77
+ emit("in", redactExternalUrl(message));
78
78
  switch (message.type) {
79
79
  case "connect":
80
80
  onConnect(message);
@@ -94,6 +94,9 @@ export function createSandboxMessageRouter(options) {
94
94
  case "openPage":
95
95
  void onOpenPage(message);
96
96
  return;
97
+ case "openExternalUrl":
98
+ void onOpenExternalUrl(message);
99
+ return;
97
100
  case "getPage":
98
101
  void onGetPage(message);
99
102
  return;
@@ -117,3 +120,15 @@ export function createSandboxMessageRouter(options) {
117
120
  }
118
121
  };
119
122
  }
123
+ function redactExternalUrl(data) {
124
+ if (typeof data === "object" &&
125
+ data !== null &&
126
+ "type" in data &&
127
+ data.type === "openExternalUrl") {
128
+ return {
129
+ type: "openExternalUrl",
130
+ ...("requestId" in data ? { requestId: data.requestId } : {}),
131
+ };
132
+ }
133
+ return data;
134
+ }
@@ -5,6 +5,7 @@ import type { CustomBlockGetPageErrorInfo, GetPageMessage, getPageMessageSchema,
5
5
  import type { CustomBlockGetUserErrorInfo, GetUserMessage, getUserMessageSchema, getUserResultMessageSchema } from "../protocol/messages/getUser.js";
6
6
  import type { CustomBlockListUsersErrorInfo, ListUsersMessage, listUsersMessageSchema, listUsersResultMessageSchema } from "../protocol/messages/listUsers.js";
7
7
  import type { BridgeMessagePayload } from "../protocol/messages/messagePayload.js";
8
+ import type { CustomBlockOpenExternalUrlErrorInfo, OpenExternalUrlMessage, OpenExternalUrlResultMessage, openExternalUrlMessageSchema } from "../protocol/messages/openExternalUrl.js";
8
9
  import type { CustomBlockOpenPageErrorInfo, OpenPageMessage, openPageMessageSchema, openPageResultMessageSchema } from "../protocol/messages/openPage.js";
9
10
  import type { QueryDataSourceMessage, queryDataSourceMessageSchema } from "../protocol/messages/queryDataSource.js";
10
11
  import type { ResizeMessage, resizeMessageSchema } from "../protocol/messages/resize.js";
@@ -24,6 +25,10 @@ export type CustomBlockHostUpdatePageResult = BridgeMessagePayload<InferInput<ty
24
25
  export type CustomBlockHostGetUserResult = BridgeMessagePayload<InferInput<typeof getUserResultMessageSchema>, CustomBlockGetUserErrorInfo>;
25
26
  export type CustomBlockHostListUsersResult = BridgeMessagePayload<InferInput<typeof listUsersResultMessageSchema>, CustomBlockListUsersErrorInfo>;
26
27
  export type CustomBlockHostOpenPageResult = BridgeMessagePayload<InferInput<typeof openPageResultMessageSchema>, CustomBlockOpenPageErrorInfo>;
28
+ export type CustomBlockHostOpenExternalUrlResult = BridgeMessagePayload<OpenExternalUrlResultMessage, CustomBlockOpenExternalUrlErrorInfo>;
29
+ export type CustomBlockHostNavigationContext = {
30
+ signal: AbortSignal;
31
+ };
27
32
  export type CustomBlockHostHandlers = {
28
33
  queryDataSource: (message: QueryDataSourceMessage) => MaybePromise<CustomBlockHostQueryDataSourceResult>;
29
34
  createPage?: (message: CreatePageMessage) => MaybePromise<CustomBlockHostCreatePageResult>;
@@ -31,6 +36,7 @@ export type CustomBlockHostHandlers = {
31
36
  getUser?: (message: GetUserMessage) => MaybePromise<CustomBlockHostGetUserResult>;
32
37
  listUsers?: (message: ListUsersMessage) => MaybePromise<CustomBlockHostListUsersResult>;
33
38
  openPage?: (message: OpenPageMessage) => MaybePromise<CustomBlockHostOpenPageResult>;
39
+ openExternalUrl?: (message: OpenExternalUrlMessage, context: CustomBlockHostNavigationContext) => MaybePromise<CustomBlockHostOpenExternalUrlResult>;
34
40
  updatePage?: (message: UpdatePageMessage) => MaybePromise<CustomBlockHostUpdatePageResult>;
35
41
  resize?: (message: ResizeMessage) => void;
36
42
  };
@@ -52,6 +58,7 @@ export type GetPageMessageInput = InferInput<typeof getPageMessageSchema>;
52
58
  export type GetUserMessageInput = InferInput<typeof getUserMessageSchema>;
53
59
  export type ListUsersMessageInput = InferInput<typeof listUsersMessageSchema>;
54
60
  export type OpenPageMessageInput = InferInput<typeof openPageMessageSchema>;
61
+ export type OpenExternalUrlMessageInput = InferInput<typeof openExternalUrlMessageSchema>;
55
62
  export type QueryDataSourceMessageInput = InferInput<typeof queryDataSourceMessageSchema>;
56
63
  export type ResizeMessageInput = InferInput<typeof resizeMessageSchema>;
57
64
  export type UpdatePageMessageInput = InferInput<typeof updatePageMessageSchema>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/messages/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/messages/types.ts"],"names":[],"mappings":"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"}
@@ -34,6 +34,7 @@ export * from "./messages/invalidSandboxMessage.js";
34
34
  export * from "./messages/isInitHandshakeMessage.js";
35
35
  export * from "./messages/listUsers.js";
36
36
  export * from "./messages/messagePayload.js";
37
+ export * from "./messages/openExternalUrl.js";
37
38
  export * from "./messages/openPage.js";
38
39
  export * from "./messages/pageChanged.js";
39
40
  export * from "./messages/parentChanged.js";
@@ -34,6 +34,7 @@ export * from "./messages/invalidSandboxMessage.js";
34
34
  export * from "./messages/isInitHandshakeMessage.js";
35
35
  export * from "./messages/listUsers.js";
36
36
  export * from "./messages/messagePayload.js";
37
+ export * from "./messages/openExternalUrl.js";
37
38
  export * from "./messages/openPage.js";
38
39
  export * from "./messages/pageChanged.js";
39
40
  export * from "./messages/parentChanged.js";
@@ -1216,6 +1216,19 @@ export declare const hostToSandboxMessageSchema: v.VariantSchema<"type", [v.Vari
1216
1216
  readonly message: v.StringSchema<undefined>;
1217
1217
  readonly isRetryable: v.BooleanSchema<undefined>;
1218
1218
  }, undefined>;
1219
+ }, undefined>], undefined>, v.VariantSchema<"status", [v.ObjectSchema<{
1220
+ readonly type: v.LiteralSchema<"openExternalUrlResult", undefined>;
1221
+ readonly requestId: v.StringSchema<undefined>;
1222
+ readonly status: v.LiteralSchema<"success", undefined>;
1223
+ }, undefined>, v.ObjectSchema<{
1224
+ readonly type: v.LiteralSchema<"openExternalUrlResult", undefined>;
1225
+ readonly requestId: v.StringSchema<undefined>;
1226
+ readonly status: v.LiteralSchema<"error", undefined>;
1227
+ readonly error: v.ObjectSchema<{
1228
+ readonly code: v.StringSchema<undefined>;
1229
+ readonly message: v.StringSchema<undefined>;
1230
+ readonly isRetryable: v.BooleanSchema<undefined>;
1231
+ }, undefined>;
1219
1232
  }, undefined>], undefined>, v.VariantSchema<"status", [v.ObjectSchema<{
1220
1233
  readonly type: v.LiteralSchema<"updatePageResult", undefined>;
1221
1234
  readonly requestId: v.StringSchema<undefined>;
@@ -8,6 +8,7 @@ import { getUserResultMessageSchema } from "./getUser.js";
8
8
  import { initMessageSchema } from "./init.js";
9
9
  import { invalidSandboxMessageSchema } from "./invalidSandboxMessage.js";
10
10
  import { listUsersResultMessageSchema } from "./listUsers.js";
11
+ import { openExternalUrlResultMessageSchema } from "./openExternalUrl.js";
11
12
  import { openPageResultMessageSchema } from "./openPage.js";
12
13
  import { pageChangedMessageSchema } from "./pageChanged.js";
13
14
  import { parentChangedMessageSchema } from "./parentChanged.js";
@@ -31,6 +32,7 @@ export const hostToSandboxMessageSchema = v.variant("type", [
31
32
  getUserResultMessageSchema,
32
33
  listUsersResultMessageSchema,
33
34
  openPageResultMessageSchema,
35
+ openExternalUrlResultMessageSchema,
34
36
  updatePageResultMessageSchema,
35
37
  invalidSandboxMessageSchema,
36
38
  ]);
@@ -0,0 +1,32 @@
1
+ import * as v from "valibot";
2
+ import type { CustomBlockErrorCode, CustomBlockErrorInfo } from "../errors.js";
3
+ export declare const customBlockOpenExternalUrlErrorCodeSchema: v.StringSchema<undefined>;
4
+ export type CustomBlockOpenExternalUrlErrorCode = CustomBlockErrorCode<"user_decline" | "pending_navigation" | "invalid_url">;
5
+ export type CustomBlockOpenExternalUrlErrorInfo = CustomBlockErrorInfo<CustomBlockOpenExternalUrlErrorCode>;
6
+ export declare const customBlockOpenExternalUrlErrorInfoSchema: v.ObjectSchema<{
7
+ readonly code: v.StringSchema<undefined>;
8
+ readonly message: v.StringSchema<undefined>;
9
+ readonly isRetryable: v.BooleanSchema<undefined>;
10
+ }, undefined>;
11
+ /** Sandbox -> host: request approval to open an external URL. */
12
+ export declare const openExternalUrlMessageSchema: v.ObjectSchema<{
13
+ readonly type: v.LiteralSchema<"openExternalUrl", undefined>;
14
+ readonly requestId: v.StringSchema<undefined>;
15
+ readonly url: v.StringSchema<undefined>;
16
+ }, undefined>;
17
+ export type OpenExternalUrlMessage = v.InferOutput<typeof openExternalUrlMessageSchema>;
18
+ export declare const openExternalUrlResultMessageSchema: v.VariantSchema<"status", [v.ObjectSchema<{
19
+ readonly type: v.LiteralSchema<"openExternalUrlResult", undefined>;
20
+ readonly requestId: v.StringSchema<undefined>;
21
+ readonly status: v.LiteralSchema<"success", undefined>;
22
+ }, undefined>, v.ObjectSchema<{
23
+ readonly type: v.LiteralSchema<"openExternalUrlResult", undefined>;
24
+ readonly requestId: v.StringSchema<undefined>;
25
+ readonly status: v.LiteralSchema<"error", undefined>;
26
+ readonly error: v.ObjectSchema<{
27
+ readonly code: v.StringSchema<undefined>;
28
+ readonly message: v.StringSchema<undefined>;
29
+ readonly isRetryable: v.BooleanSchema<undefined>;
30
+ }, undefined>;
31
+ }, undefined>], undefined>;
32
+ export type OpenExternalUrlResultMessage = v.InferOutput<typeof openExternalUrlResultMessageSchema>;
@@ -0,0 +1,26 @@
1
+ import * as v from "valibot";
2
+ export const customBlockOpenExternalUrlErrorCodeSchema = v.string();
3
+ export const customBlockOpenExternalUrlErrorInfoSchema = v.object({
4
+ code: customBlockOpenExternalUrlErrorCodeSchema,
5
+ message: v.string(),
6
+ isRetryable: v.boolean(),
7
+ });
8
+ /** Sandbox -> host: request approval to open an external URL. */
9
+ export const openExternalUrlMessageSchema = v.object({
10
+ type: v.literal("openExternalUrl"),
11
+ requestId: v.string(),
12
+ url: v.string(),
13
+ });
14
+ export const openExternalUrlResultMessageSchema = v.variant("status", [
15
+ v.object({
16
+ type: v.literal("openExternalUrlResult"),
17
+ requestId: v.string(),
18
+ status: v.literal("success"),
19
+ }),
20
+ v.object({
21
+ type: v.literal("openExternalUrlResult"),
22
+ requestId: v.string(),
23
+ status: v.literal("error"),
24
+ error: customBlockOpenExternalUrlErrorInfoSchema,
25
+ }),
26
+ ]);
@@ -759,6 +759,10 @@ export declare const sandboxToHostMessageSchema: v.VariantSchema<"type", [v.Vari
759
759
  readonly requestId: v.StringSchema<undefined>;
760
760
  readonly pageId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.BrandAction<string, "NotionPageId">]>;
761
761
  readonly mode: v.PicklistSchema<["side_peek", "center_peek"], undefined>;
762
+ }, undefined>, v.ObjectSchema<{
763
+ readonly type: v.LiteralSchema<"openExternalUrl", undefined>;
764
+ readonly requestId: v.StringSchema<undefined>;
765
+ readonly url: v.StringSchema<undefined>;
762
766
  }, undefined>, v.ObjectSchema<{
763
767
  readonly type: v.LiteralSchema<"updatePage", undefined>;
764
768
  readonly requestId: v.StringSchema<undefined>;
@@ -6,6 +6,7 @@ import { getUserMessageSchema } from "./getUser.js";
6
6
  import { initResultMessageSchema } from "./initResult.js";
7
7
  import { invalidHostMessageSchema } from "./invalidHostMessage.js";
8
8
  import { listUsersMessageSchema } from "./listUsers.js";
9
+ import { openExternalUrlMessageSchema } from "./openExternalUrl.js";
9
10
  import { openPageMessageSchema } from "./openPage.js";
10
11
  import { queryDataSourceMessageSchema } from "./queryDataSource.js";
11
12
  import { resizeMessageSchema } from "./resize.js";
@@ -25,6 +26,7 @@ export const sandboxToHostMessageSchema = v.variant("type", [
25
26
  getUserMessageSchema,
26
27
  listUsersMessageSchema,
27
28
  openPageMessageSchema,
29
+ openExternalUrlMessageSchema,
28
30
  updatePageMessageSchema,
29
31
  resizeMessageSchema,
30
32
  invalidHostMessageSchema,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@notionhq/custom-blocks-host",
3
- "version": "0.3.2",
3
+ "version": "0.3.4",
4
4
  "description": "Reusable host runtime for Notion custom blocks.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -13,6 +13,10 @@ import {
13
13
  initMessageSchema,
14
14
  } from "@notionhq/custom-blocks-protocol/messages/init.js"
15
15
  import type { InvalidSandboxMessage } from "@notionhq/custom-blocks-protocol/messages/invalidSandboxMessage.js"
16
+ import type {
17
+ OpenExternalUrlMessage,
18
+ OpenExternalUrlResultMessage,
19
+ } from "@notionhq/custom-blocks-protocol/messages/openExternalUrl.js"
16
20
  import type { QueryDataSourceMessage } from "@notionhq/custom-blocks-protocol/messages/queryDataSource.js"
17
21
  import type {
18
22
  CustomBlockQueryDataSourceErrorInfo,
@@ -45,6 +49,7 @@ import type {
45
49
  CustomBlockHostPrepareInitialState,
46
50
  } from "./lifecycle/types.js"
47
51
  import { customBlockHostInitialStateSchema } from "./lifecycle/types.js"
52
+ import { parseExternalUrl } from "./messages/parseExternalUrl.js"
48
53
  import { createSandboxMessageRouter } from "./messages/sandboxMessageRouter.js"
49
54
  import type {
50
55
  CustomBlockHostFailure,
@@ -143,6 +148,9 @@ export function createCustomBlockHost(
143
148
  MIN_HOST_SUPPORTED_BRIDGE_PROTOCOL_VERSION,
144
149
  )
145
150
 
151
+ const navigationAbortController = new AbortController()
152
+ let pendingOpenExternalUrlRequestId: string | undefined
153
+
146
154
  type HostStateUpdates = Partial<
147
155
  Omit<CustomBlockHostInitialState, "blockId" | "manifest">
148
156
  >
@@ -304,6 +312,75 @@ export function createCustomBlockHost(
304
312
  flushPendingHostStateChanges()
305
313
  }
306
314
 
315
+ async function handleOpenExternalUrl(message: OpenExternalUrlMessage) {
316
+ if (
317
+ handlers.openExternalUrl === undefined ||
318
+ navigationAbortController.signal.aborted
319
+ ) {
320
+ return
321
+ }
322
+ if (pendingOpenExternalUrlRequestId === message.requestId) {
323
+ return
324
+ }
325
+ if (pendingOpenExternalUrlRequestId !== undefined) {
326
+ const pendingResult: OpenExternalUrlResultMessage = {
327
+ type: "openExternalUrlResult",
328
+ requestId: message.requestId,
329
+ status: "error",
330
+ error: {
331
+ code: "pending_navigation",
332
+ message: "Another external navigation request is pending.",
333
+ isRetryable: true,
334
+ },
335
+ }
336
+ sendInitializedMessage(pendingResult)
337
+ return
338
+ }
339
+ const url = parseExternalUrl(message.url)
340
+ if (url === undefined) {
341
+ const invalidResult: OpenExternalUrlResultMessage = {
342
+ type: "openExternalUrlResult",
343
+ requestId: message.requestId,
344
+ status: "error",
345
+ error: {
346
+ code: "invalid_url",
347
+ message:
348
+ "Only valid HTTP or HTTPS URLs without credentials, up to 2,048 characters, can be opened.",
349
+ isRetryable: false,
350
+ },
351
+ }
352
+ sendInitializedMessage(invalidResult)
353
+ return
354
+ }
355
+
356
+ pendingOpenExternalUrlRequestId = message.requestId
357
+ try {
358
+ const response = await handlers.openExternalUrl(
359
+ { ...message, url },
360
+ {
361
+ signal: navigationAbortController.signal,
362
+ },
363
+ )
364
+ if (navigationAbortController.signal.aborted) {
365
+ return
366
+ }
367
+ const result: OpenExternalUrlResultMessage = {
368
+ type: "openExternalUrlResult",
369
+ requestId: message.requestId,
370
+ ...response,
371
+ }
372
+ sendInitializedMessage(result)
373
+ } catch (error) {
374
+ if (!navigationAbortController.signal.aborted) {
375
+ throw error
376
+ }
377
+ } finally {
378
+ if (pendingOpenExternalUrlRequestId === message.requestId) {
379
+ pendingOpenExternalUrlRequestId = undefined
380
+ }
381
+ }
382
+ }
383
+
307
384
  function flushPendingHostStateChanges() {
308
385
  // Keep updates queued until the sandbox acknowledges initialization.
309
386
  // Updates received before init is sent are included in its payload instead.
@@ -463,6 +540,7 @@ export function createCustomBlockHost(
463
540
  onQueryDataSource: handleQuery,
464
541
  onUnsubscribeDataSourceQuery: message =>
465
542
  querySubscriptions.unsubscribe(message.subscriptionId),
543
+ onOpenExternalUrl: handleOpenExternalUrl,
466
544
  onCreatePage: message => respondToRequest(message, handlers.createPage),
467
545
  onGetPage: message => respondToRequest(message, handlers.getPage),
468
546
  onOpenPage: message => respondToRequest(message, handlers.openPage),
@@ -474,8 +552,8 @@ export function createCustomBlockHost(
474
552
 
475
553
  window.addEventListener("message", onMessage)
476
554
  iframe.addEventListener("load", initializationController.onIframeLoad)
477
-
478
555
  function stop() {
556
+ navigationAbortController.abort()
479
557
  preparationController.abort()
480
558
  window.removeEventListener("message", onMessage)
481
559
  iframe.removeEventListener("load", initializationController.onIframeLoad)
package/src/index.ts CHANGED
@@ -10,6 +10,7 @@ export type { CreatePageMessage } from "@notionhq/custom-blocks-protocol/message
10
10
  export type { GetPageMessage } from "@notionhq/custom-blocks-protocol/messages/getPage.js"
11
11
  export type { GetUserMessage } from "@notionhq/custom-blocks-protocol/messages/getUser.js"
12
12
  export type { ListUsersMessage } from "@notionhq/custom-blocks-protocol/messages/listUsers.js"
13
+ export type { OpenExternalUrlMessage } from "@notionhq/custom-blocks-protocol/messages/openExternalUrl.js"
13
14
  export type { OpenPageMessage } from "@notionhq/custom-blocks-protocol/messages/openPage.js"
14
15
  export type {
15
16
  CustomBlockCheckboxFilterOperator,
@@ -43,7 +44,10 @@ export type {
43
44
  NotionRichTextItem,
44
45
  NotionSelectOptionInput,
45
46
  } from "@notionhq/custom-blocks-protocol/pages/page.js"
46
- export { LEGACY_PROPERTY_SHAPE_PROTOCOL_VERSION } from "@notionhq/custom-blocks-protocol/protocolVersion.js"
47
+ export {
48
+ LATEST_BRIDGE_PROTOCOL_VERSION,
49
+ LEGACY_PROPERTY_SHAPE_PROTOCOL_VERSION,
50
+ } from "@notionhq/custom-blocks-protocol/protocolVersion.js"
47
51
  export {
48
52
  type AutoBindableProperty,
49
53
  getAutoBoundPropertyIdsByKey,
@@ -73,11 +77,14 @@ export type {
73
77
  CustomBlockHostHandlers,
74
78
  CustomBlockHostListUsersResult,
75
79
  CustomBlockHostLogDirection,
80
+ CustomBlockHostNavigationContext,
81
+ CustomBlockHostOpenExternalUrlResult,
76
82
  CustomBlockHostOpenPageResult,
77
83
  CustomBlockHostUpdatePageResult,
78
84
  GetPageMessageInput,
79
85
  GetUserMessageInput,
80
86
  ListUsersMessageInput,
87
+ OpenExternalUrlMessageInput,
81
88
  OpenPageMessageInput,
82
89
  QueryDataSourceMessageInput,
83
90
  ResizeMessageInput,
@@ -0,0 +1,18 @@
1
+ const MAX_EXTERNAL_URL_LENGTH = 2048
2
+
3
+ /** Returns a normalized, credential-free HTTP or HTTPS URL. */
4
+ export function parseExternalUrl(input: string): string | undefined {
5
+ if (input.length > MAX_EXTERNAL_URL_LENGTH || !URL.canParse(input)) {
6
+ return undefined
7
+ }
8
+ const parsed = new URL(input)
9
+ if (
10
+ (parsed.protocol !== "http:" && parsed.protocol !== "https:") ||
11
+ parsed.username !== "" ||
12
+ parsed.password !== "" ||
13
+ parsed.href.length > MAX_EXTERNAL_URL_LENGTH
14
+ ) {
15
+ return undefined
16
+ }
17
+ return parsed.href
18
+ }
@@ -6,6 +6,7 @@ import type { InitResultMessage } from "@notionhq/custom-blocks-protocol/message
6
6
  import type { InvalidSandboxMessage } from "@notionhq/custom-blocks-protocol/messages/invalidSandboxMessage.js"
7
7
  import { isInitHandshakeMessage } from "@notionhq/custom-blocks-protocol/messages/isInitHandshakeMessage.js"
8
8
  import type { ListUsersMessage } from "@notionhq/custom-blocks-protocol/messages/listUsers.js"
9
+ import type { OpenExternalUrlMessage } from "@notionhq/custom-blocks-protocol/messages/openExternalUrl.js"
9
10
  import type { OpenPageMessage } from "@notionhq/custom-blocks-protocol/messages/openPage.js"
10
11
  import type { QueryDataSourceMessage } from "@notionhq/custom-blocks-protocol/messages/queryDataSource.js"
11
12
  import type { ResizeMessage } from "@notionhq/custom-blocks-protocol/messages/resize.js"
@@ -49,6 +50,7 @@ export type SandboxMessageRouterOptions = {
49
50
  ) => void
50
51
  onCreatePage: (message: CreatePageMessage) => void | Promise<void>
51
52
  onOpenPage: (message: OpenPageMessage) => void | Promise<void>
53
+ onOpenExternalUrl: (message: OpenExternalUrlMessage) => void | Promise<void>
52
54
  onGetPage: (message: GetPageMessage) => void | Promise<void>
53
55
  onGetUser: (message: GetUserMessage) => void | Promise<void>
54
56
  onListUsers: (message: ListUsersMessage) => void | Promise<void>
@@ -74,6 +76,7 @@ export function createSandboxMessageRouter(
74
76
  onCreatePage,
75
77
  onGetPage,
76
78
  onOpenPage,
79
+ onOpenExternalUrl,
77
80
  onGetUser,
78
81
  onListUsers,
79
82
  onUpdatePage,
@@ -86,7 +89,7 @@ export function createSandboxMessageRouter(
86
89
  ) {
87
90
  emit("warn", {
88
91
  message: "Ignored unsupported sandbox message",
89
- payload: data,
92
+ payload: redactExternalUrl(data),
90
93
  issues,
91
94
  })
92
95
  const response = getInvalidSandboxMessageResponse(data)
@@ -145,12 +148,12 @@ export function createSandboxMessageRouter(
145
148
  if (!isInitHandshakeMessage(message) && getInitStatus() !== "initialized") {
146
149
  emit("warn", {
147
150
  message: `Ignored ${message.type} before initialization completed`,
148
- payload: message,
151
+ payload: redactExternalUrl(message),
149
152
  })
150
153
  return
151
154
  }
152
155
 
153
- emit("in", message)
156
+ emit("in", redactExternalUrl(message))
154
157
  switch (message.type) {
155
158
  case "connect":
156
159
  onConnect(message)
@@ -170,6 +173,9 @@ export function createSandboxMessageRouter(
170
173
  case "openPage":
171
174
  void onOpenPage(message)
172
175
  return
176
+ case "openExternalUrl":
177
+ void onOpenExternalUrl(message)
178
+ return
173
179
  case "getPage":
174
180
  void onGetPage(message)
175
181
  return
@@ -193,3 +199,18 @@ export function createSandboxMessageRouter(
193
199
  }
194
200
  }
195
201
  }
202
+
203
+ function redactExternalUrl(data: unknown): unknown {
204
+ if (
205
+ typeof data === "object" &&
206
+ data !== null &&
207
+ "type" in data &&
208
+ data.type === "openExternalUrl"
209
+ ) {
210
+ return {
211
+ type: "openExternalUrl",
212
+ ...("requestId" in data ? { requestId: data.requestId } : {}),
213
+ }
214
+ }
215
+ return data
216
+ }
@@ -26,6 +26,12 @@ import type {
26
26
  listUsersResultMessageSchema,
27
27
  } from "@notionhq/custom-blocks-protocol/messages/listUsers.js"
28
28
  import type { BridgeMessagePayload } from "@notionhq/custom-blocks-protocol/messages/messagePayload.js"
29
+ import type {
30
+ CustomBlockOpenExternalUrlErrorInfo,
31
+ OpenExternalUrlMessage,
32
+ OpenExternalUrlResultMessage,
33
+ openExternalUrlMessageSchema,
34
+ } from "@notionhq/custom-blocks-protocol/messages/openExternalUrl.js"
29
35
  import type {
30
36
  CustomBlockOpenPageErrorInfo,
31
37
  OpenPageMessage,
@@ -88,6 +94,15 @@ export type CustomBlockHostOpenPageResult = BridgeMessagePayload<
88
94
  CustomBlockOpenPageErrorInfo
89
95
  >
90
96
 
97
+ export type CustomBlockHostOpenExternalUrlResult = BridgeMessagePayload<
98
+ OpenExternalUrlResultMessage,
99
+ CustomBlockOpenExternalUrlErrorInfo
100
+ >
101
+
102
+ export type CustomBlockHostNavigationContext = {
103
+ signal: AbortSignal
104
+ }
105
+
91
106
  export type CustomBlockHostHandlers = {
92
107
  queryDataSource: (
93
108
  message: QueryDataSourceMessage,
@@ -107,6 +122,10 @@ export type CustomBlockHostHandlers = {
107
122
  openPage?: (
108
123
  message: OpenPageMessage,
109
124
  ) => MaybePromise<CustomBlockHostOpenPageResult>
125
+ openExternalUrl?: (
126
+ message: OpenExternalUrlMessage,
127
+ context: CustomBlockHostNavigationContext,
128
+ ) => MaybePromise<CustomBlockHostOpenExternalUrlResult>
110
129
  updatePage?: (
111
130
  message: UpdatePageMessage,
112
131
  ) => MaybePromise<CustomBlockHostUpdatePageResult>
@@ -139,6 +158,10 @@ export type ListUsersMessageInput = InferInput<typeof listUsersMessageSchema>
139
158
 
140
159
  export type OpenPageMessageInput = InferInput<typeof openPageMessageSchema>
141
160
 
161
+ export type OpenExternalUrlMessageInput = InferInput<
162
+ typeof openExternalUrlMessageSchema
163
+ >
164
+
142
165
  export type QueryDataSourceMessageInput = InferInput<
143
166
  typeof queryDataSourceMessageSchema
144
167
  >