@notionhq/custom-blocks-host 0.3.3 → 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 +12 -0
- package/dist/browser.js +1 -1
- package/dist/createCustomBlockHost.d.ts.map +1 -1
- package/dist/createCustomBlockHost.js +68 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/messages/parseExternalUrl.d.ts +3 -0
- package/dist/messages/parseExternalUrl.d.ts.map +1 -0
- package/dist/messages/parseExternalUrl.js +15 -0
- package/dist/messages/sandboxMessageRouter.d.ts +2 -0
- package/dist/messages/sandboxMessageRouter.d.ts.map +1 -1
- package/dist/messages/sandboxMessageRouter.js +19 -4
- package/dist/messages/types.d.ts +7 -0
- package/dist/messages/types.d.ts.map +1 -1
- package/dist/protocol/index.d.ts +1 -0
- package/dist/protocol/index.js +1 -0
- package/dist/protocol/messages/hostToSandbox.d.ts +13 -0
- package/dist/protocol/messages/hostToSandbox.js +2 -0
- package/dist/protocol/messages/openExternalUrl.d.ts +32 -0
- package/dist/protocol/messages/openExternalUrl.js +26 -0
- package/dist/protocol/messages/sandboxToHost.d.ts +4 -0
- package/dist/protocol/messages/sandboxToHost.js +2 -0
- package/package.json +1 -1
- package/src/createCustomBlockHost.ts +79 -1
- package/src/index.ts +4 -0
- package/src/messages/parseExternalUrl.ts +18 -0
- package/src/messages/sandboxMessageRouter.ts +24 -3
- package/src/messages/types.ts +23 -0
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.
|
package/dist/browser.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var Fe=6,Hr=6;function Lr(e){let{manifestProperties:n,propertySchemasById:o}=e,s=[];for(let[c,l]of Object.entries(n)){let f=Vr({propertyKey:c,manifestProperty:l,propertySchemasById:o});f!==void 0&&s.push([c,f])}return Object.fromEntries(s)}function Vr(e){let{propertyKey:n,manifestProperty:o,propertySchemasById:s}=e,c=ut(o.name),l=Object.entries(s).filter(([f,y])=>y.type===o.type&&(f===n||ut(y.name)===c));return l.length===1?l[0][0]:void 0}function ut(e){return e.trim().toLowerCase()}var Re,Gr={lang:void 0,message:void 0,abortEarly:void 0,abortPipeEarly:void 0};function Ue(e){return!e&&!Re?Gr:{lang:e?.lang??Re?.lang,message:e?.message,abortEarly:e?.abortEarly??Re?.abortEarly,abortPipeEarly:e?.abortPipeEarly??Re?.abortPipeEarly}}var $r;function Qr(e){return $r?.get(e)}var Xr;function Wr(e){return Xr?.get(e)}var Jr;function Kr(e,n){return Jr?.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??Kr(e.reference,m.lang)??(x?Wr(m.lang):null)??s.message??Qr(m.lang);_!==void 0&&(m.message=typeof _=="function"?_(m):_),x&&(o.typed=!1),o.issues?o.issues.push(m):o.issues=[m]}var ct=new WeakMap;function z(e){let n=ct.get(e);return n||(n={version:1,vendor:"valibot",validate(o){return e["~run"]({value:o},Ue())}},ct.set(e,n)),n}function Yr(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 Zr=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 He(e,n){return{kind:"validation",type:"regex",reference:He,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 Le(e){return{kind:"transformation",type:"transform",reference:Le,async:!1,operation:e,"~run"(n){return n.value=this.operation(n.value),n}}}var pt={abortEarly:!0};function ft(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 mt(e,n){return!e["~run"]({value:n},pt).issues}function O(e,n){return{kind:"schema",type:"array",reference:O,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 Ve(e){return{kind:"schema",type:"nan",reference:Ve,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]=ft(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:ze(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(Yr(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]=ft(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 lt(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:ze(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:lt(l)}),o.typed=!0}else{if(f?.length===1)return f[0];B(this,"type",o,s,{issues:lt(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]},pt).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:ze(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},Ue(o));if(s.issues)throw new Zr(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},Ue(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")),yt=U(t(),re("NotionAgentId")),vt=U(t(),re("NotionSpaceId"));var dt=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"]),Ge=r({id:t(),name:t(),color:u(dt),description:u(t())}),en=r({id:t(),name:t(),color:u(dt),option_ids:O(t())}),tn=r({synced_property_id:t(),synced_property_name:t()}),E=r({name:t(),description:u(t())}),rn=["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"],ht=R(rn),gt=["title","rich_text","number","checkbox","url","email","phone_number","date","created_time","last_edited_time","people","created_by"],$e=g("type",[r({...E.entries,type:i("title")}),r({...E.entries,type:i("rich_text")}),r({...E.entries,type:i("number")}),r({...E.entries,type:i("checkbox")}),r({...E.entries,type:i("url")}),r({...E.entries,type:i("email")}),r({...E.entries,type:i("phone_number")}),r({...E.entries,type:i("select"),options:O(Ge)}),r({...E.entries,type:i("multi_select"),options:O(Ge)}),r({...E.entries,type:i("status"),options:O(Ge),groups:O(en)}),r({...E.entries,type:i("date")}),r({...E.entries,type:i("people")}),r({...E.entries,type:i("files")}),r({...E.entries,type:i("unique_id")}),r({...E.entries,type:i("relation"),data_source_id:u(t()),dual_property:u(tn)}),r({...E.entries,type:i("place")}),r({...E.entries,type:i("formula")}),r({...E.entries,type:i("rollup")}),r({...E.entries,type:i("button")}),r({...E.entries,type:i("verification")}),r({...E.entries,type:i("last_visited_time")}),r({...E.entries,type:i("location")}),r({...E.entries,type:i("created_time")}),r({...E.entries,type:i("last_edited_time")}),r({...E.entries,type:i("created_by")}),r({...E.entries,type:i("last_edited_by")})]);var bt={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 kt=r({id:Y,table:t(),spaceId:u(vt)}),St=r({id:u(Y),propertiesById:F(t(),$e)}),So=r({key:t(),collectionPointer:u(kt),collectionSchema:u(St),propertyIdsByKey:F(t(),u(t())),propertySchemasById:F(t(),$e)}),nn=r({collectionPointer:u(kt),collectionSchema:u(St),propertyIdsByKey:u(F(t(),u(t())))}),le=F(t(),nn);var fe=R(["standard","high"]),It="standard";var _t=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:yt}),r({type:i("unavailable")})]);var me=g("type",[r({type:i("unavailable")}),r({type:i("page"),id:D,parent:oe})]),on=r({type:i("emoji"),emoji:t()}),sn=r({type:i("custom_emoji"),custom_emoji:r({id:t(),name:u(t()),url:u(t())})}),Pt=r({type:i("external"),external:r({url:t()})}),Ot=r({type:i("file"),file:r({url:t(),expiry_time:u(t())})}),Xe=g("type",[on,sn,Pt,Ot]),We=g("type",[Pt,Ot]),$=J(t()),xt=F(t(),Ie()),Qe=I([r({id:t(),name:u(t()),color:u(t()),description:u($)}),r({name:t(),id:u(t()),color:u(t()),description:u($)})]),an=r({start:t(),end:u($),time_zone:u($)}),un=I([r({object:u(i("user")),id:t()}),r({object:i("group"),id:t(),name:u($)})]),cn=r({id:t()}),ln=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())})})]),pn=r({lat:P(),lon:P(),name:u($),address:u($),aws_place_id:u($),google_place_id:u($)}),A={id:t()},Ct=J(r({...we.entries,table:R(["notion_user","bot","organization_bot"]),spaceId:u(t())})),Je=g("type",[r({...A,type:i("title"),title:O(xt)}),r({...A,type:i("rich_text"),rich_text:O(xt)}),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(Qe)}),r({...A,type:i("status"),status:J(Qe)}),r({...A,type:i("multi_select"),multi_select:O(Qe)}),r({...A,type:i("date"),date:J(an)}),r({...A,type:i("people"),people:O(un)}),r({...A,type:i("relation"),has_more:u(h()),relation:O(cn)}),r({...A,type:i("files"),files:O(ln)}),r({...A,type:i("place"),place:J(pn)}),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:Ct}),r({...A,type:i("last_edited_by"),last_edited_by:Ct}),r({...A,type:i("last_visited_time"),last_visited_time:$})]),xe=F(t(),Je),ye=r({object:i("page"),id:D,parent:oe,properties:xe,created_time:u(t()),last_edited_time:u(t()),icon:u(Xe),cover:u(We),url:u(t()),public_url:u(t()),is_archived:h(),in_trash:h()});var fn=t(),mn=r({code:fn,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:mn})]);var Ke=U(t(),re("NotionUserId")),ie=r({object:i("user"),id:Ke,name:u(t()),avatar_url:J(t()),type:i("person"),person:r({email:t()})}),jt=r({object:i("list"),results:O(ie),next_cursor:J(t()),has_more:h(),type:i("user"),user:F(t(),Ie())});var Bt=r({type:i("currentUserChanged"),currentUser:ie});var Rt=r({type:i("dataSourcesChanged"),dataSources:r({bindings:le})});var yn=t(),vn=r({code:yn,message:t(),isRetryable:h()}),Mt=r({type:i("getPage"),requestId:t(),pageId:D}),Dt=g("status",[r({type:i("getPageResult"),requestId:t(),status:i("success"),page:ye}),r({type:i("getPageResult"),requestId:t(),status:i("error"),error:vn})]);var dn=t(),hn=r({code:dn,message:t(),isRetryable:h()}),wt=r({type:i("getUser"),requestId:t(),userId:Ke}),At=g("status",[r({type:i("getUserResult"),requestId:t(),status:i("success"),user:ie}),r({type:i("getUserResult"),requestId:t(),status:i("error"),error:hn})]);var gn=g("type",[r({type:i("emoji"),emoji:t()}),r({type:i("external"),url:t()})]),bn=r({name:t(),description:u(t()),type:ht}),kn=r({name:t(),description:u(t()),icon:u(gn),properties:u(F(t(),bn),{})}),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(),kn),{})});var ve=R(["light","dark"]);var Sn=t(),In=r({code:Sn,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:In})]);var Tt=r({type:i("invalidSandboxMessage"),reason:t()});var _n=t(),xn=r({code:_n,message:t(),isRetryable:h()}),qt=r({type:i("listUsers"),requestId:t(),startCursor:u(t()),pageSize:u(P())}),Nt=g("status",[r({type:i("listUsersResult"),requestId:t(),status:i("success"),list:jt}),r({type:i("listUsersResult"),requestId:t(),status:i("error"),error:xn})]);var Cn=R(["side_peek","center_peek"]),Pn=t(),On=r({code:Pn,message:t(),isRetryable:h()}),Ft=r({type:i("openPage"),requestId:t(),pageId:D,mode:Cn}),Ut=g("status",[r({type:i("openPageResult"),requestId:t(),status:i("success"),pageId:D}),r({type:i("openPageResult"),requestId:t(),status:i("error"),error:On})]);var zt=r({type:i("pageChanged"),page:me});var Ht=r({type:i("parentChanged"),parent:oe});var Lt=r({unit:R(["year","month","week","day"]),value:P(),time:t(),defaultTimeZone:u(t())}),En=r({unit:R(["hour","minute"]),value:P()}),Vt=r({unit:i("none")}),jn=I([Lt,En]),Gt=u(I([Lt,Vt])),$t=u(I([jn,Vt])),Bn=r({type:i("date"),start_date:t(),reminder:Gt}),Rn=r({type:i("daterange"),start_date:t(),end_date:t(),reminder:Gt}),Mn=r({type:i("datetime"),start_date:t(),start_time:t(),time_zone:u(t()),reminder:$t}),Dn=r({type:i("datetimerange"),start_date:t(),start_time:t(),end_date:t(),end_time:t(),time_zone:u(t()),reminder:$t}),Qt=g("type",[Bn,Rn,Mn,Dn]);var Xt=I([t(),P(),h(),Qt,O(t()),O(we)]);var Wt=r({id:D,is_archived:h(),in_trash:h(),propertiesById:F(t(),u(Xt))}),Jt=r({id:D,is_archived:h(),in_trash:h(),properties:F(t(),u(Je))});var wn=t(),An=r({code:wn,message:t(),isRetryable:h()}),Kt=g("status",[r({type:i("queryDataSourceResult"),subscriptionId:t(),status:i("success"),items:O(I([Jt,Wt])),hasMore:h()}),r({type:i("queryDataSourceResult"),subscriptionId:t(),status:i("error"),error:An})]);var Yt=r({type:i("themeChanged"),theme:ve});var Tn=t(),qn=r({code:Tn,message:t(),isRetryable:h()}),Zt=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 er=g("type",[Ae,Yt,_t,Ht,zt,Bt,Rt,Kt,Et,Dt,At,Nt,Ut,Zt,Tt]);function tr(){return{code:"no_connect",message:"Sandbox did not send a connect message.",isRetryable:!0}}function rr(){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 nr(){return{code:"initial_state_timeout",message:"Host did not prepare initial state before the timeout.",isRetryable:!0}}function or(){return{code:"missing_data_source_binding",message:"A required data source is not mapped.",isRetryable:!1}}function ir(){return{code:"missing_property_binding",message:"A required data source property is not mapped.",isRetryable:!1}}function sr(){return{code:"invalid_property_binding",message:"A mapped data source property is missing or incompatible.",isRetryable:!1}}function ar(){return{code:"no_init_result",message:"Sandbox did not acknowledge initialization.",isRetryable:!0}}function ur(){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 tt(e){return Number.isFinite(e)&&Number.isInteger(e)&&e>=1}var Nn=5e3,Fn=5e3,Un=5e3;function cr(e){let{prepareInit:n,sendInitMessage:o,warn:s,flushPendingHostStateChanges:c,minBridgeProtocolVersion:l,noConnectTimeoutMs:f=Nn,initialStateTimeoutMs:y=Fn,noInitResultTimeoutMs:m=Un,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 T(){Q!==void 0&&(window.clearTimeout(Q),Q=void 0)}function q(b){let{initializationId:v,error:G,phase:ee,source:qe}=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:qe})}async function K(b){if(S==="waitingForConnect"){S="preparingInit",j=b.initializationId,W(),L=window.setTimeout(()=>{if(S!=="preparingInit")return;let v=nr();s({...v,initializationId:b.initializationId}),q({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"){q({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??It,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=ar();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}),q({initializationId:b.initializationId,error:Ce(),phase:"init",source:"host"})}}}function Z(b){if(S!=="stopped"&&S==="waitingForConnect"){if(!tt(b.bridgeProtocolVersion)){let v=Ye({currentBridgeProtocolVersion:b.bridgeProtocolVersion});q({initializationId:b.initializationId,error:v,phase:"connect",source:"host"});return}if(b.bridgeProtocolVersion<l){let v=Ze({currentBridgeProtocolVersion:b.bridgeProtocolVersion,minBridgeProtocolVersion:l});q({initializationId:b.initializationId,error:v,phase:"connect",source:"host"});return}if(b.status==="error"){q({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&&(tt(G)?G<l&&(ee=Ze({currentBridgeProtocolVersion:G,minBridgeProtocolVersion:l})):ee=Ye({currentBridgeProtocolVersion:G})),q({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(),T(),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=tr();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}T(),S=b.status==="success"?"initialized":"error",b.status==="success"?c():M?.({...b.error,phase:"initResult",source:"sandbox"}),_?.(b)}function ce(){S="stopped",W(),w(),T()}return{get status(){return S},get hasConnectedSandbox(){return ae},handleConnect:Z,handleInitResult:de,handleInvalidConnect:C,handleInvalidInitResult:ue,onIframeLoad:Be,stop:ce}}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 lr(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"?zn(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 zn(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 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 pr(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,...bt}}}]))}}}var fr=r({theme:ve,contrastMode:u(fe),blockId:ne,parent:oe,page:me,manifest:pe,dataSources:r({bindings:le}),currentUser:ie});function mr(e){switch(e.type){case"connect":case"init":case"initResult":return!0;default:return!1}}var yr=r({code:t(),message:t(),isRetryable:h()});var vr={type:i("connect"),initializationId:t(),bridgeProtocolVersion:P(),sdkVersion:t()},dr=g("status",[r({status:i("success"),manifest:u(pe),...vr}),r({status:i("error"),error:yr,...vr})]);var Hn=g("type",[r({type:i("start")}),r({type:i("end")}),r({type:i("before"),blockId:ne}),r({type:i("after"),blockId:ne})]),Ln=g("type",[r({type:i("page_id"),page_id:D}),r({type:i("data_source_id"),data_source_id:Y})]),hr=r({type:i("createPage"),requestId:t(),parent:Ln,properties:xe,position:u(Hn)});var Vn=t(),Gn=r({code:Vn,message:t(),isRetryable:h()}),gr=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:Gn})]);var br=r({type:i("invalidHostMessage"),reason:t()});var kr=R(["ascending","descending"]);var Sr=U(D,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:Sr}),p({does_not_contain:Sr})]),je=I([p({is_empty:i(!0)}),p({is_not_empty:i(!0)})]),Ee=I([t(),O(t())]),Ir=p({object:R(["user","group"]),id:U(t(),ke(1))}),$n=I([p({contains:Ir}),p({does_not_contain:Ir}),je]),_r=p({object:i("user"),id:U(t(),ke(1),Me(2e3))}),Qn=I([p({contains:_r}),p({does_not_contain:_r}),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]),Xn=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]),Wn=I([p({equals:h()}),p({does_not_equal:h()})]),Or=I([p({equals:Ee}),p({does_not_equal:Ee}),je]),xr=R(["To-do","In progress","Complete","Current","Future"]),Cr=I([xr,U(O(xr),ke(1),Me(5))]),Jn=I([p({group_equals:Cr}),p({group_does_not_equal:Cr})]),Kn=I([Or,Jn]),Yn=I([p({contains:Ee}),p({contains_all:Ee}),p({does_not_contain:Ee}),je]),X=R(["start_date","end_date"]),Zn=R(["today","tomorrow","yesterday","one_week_ago","one_week_from_now","one_month_ago","one_month_from_now"]),Oe=I([Zn,t()]),eo=I([p({target:u(X),equals:Oe}),p({target:u(X),before:Oe}),p({target:u(X),after:Oe}),p({target:u(X),on_or_before:Oe}),p({target:u(X),on_or_after:Oe}),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)})]),Pr=I([p({propertyId:t(),relation:nt}),p({propertyId:t(),created_by:Qn}),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:Xn}),p({propertyId:t(),checkbox:Wn}),p({propertyId:t(),select:Or}),p({propertyId:t(),multi_select:Yn}),p({propertyId:t(),status:Kn}),p({propertyId:t(),date:eo}),p({propertyId:t(),people:$n})]),to=I([Pr,p({and:O(Pr)})]),ot=10,ro=p({propertyId:t(),direction:kr}),Er=r({type:i("queryDataSource"),subscriptionId:t(),dataSourceId:Y,limit:P(),filter:u(to),sorts:u(O(ro))});var jr=r({type:i("resize"),height:U(P(),be(),Se(0))});var Br=r({type:i("unsubscribeDataSourceQuery"),subscriptionId:t()});var Rr=r({type:i("updatePage"),requestId:t(),pageId:D,properties:u(xe),icon:u(Xe),cover:u(We),archived:u(h())});var Mr=g("type",[dr,gr,Er,Br,hr,Mt,wt,qt,Ft,Rr,jr,br]);function Dr(e){if(typeof e=="object"&&e!==null&&"type"in e&&typeof e.type=="string")return e.type}function wr(e){let n=Dr(e);return n==="invalidHostMessage"||n==="invalidSandboxMessage"?{incomingType:n}:{incomingType:n,nack:{type:"invalidSandboxMessage",reason:no(n)}}}function no(e){return e!==void 0?`Unsupported sandbox message of type "${e}"`:"Unsupported sandbox message (no `type` field or non-object payload)"}var Ar=r({initializationId:t()}),oo=r({bridgeProtocolVersion:I([P(),Ve()])});function Tr(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,T){c("warn",{message:"Ignored unsupported sandbox message",payload:w,issues:T});let q=wr(w);if(q.incomingType==="connect"){let K=_e(Ar,w),Z=_e(oo,w);if(f({initializationId:K.success?K.output.initializationId:void 0,error:rr(),bridgeProtocolVersion:Z.success?Z.output.bridgeProtocolVersion:void 0})==="handled")return}if(q.incomingType==="initResult"){let K=_e(Ar,w);y({initializationId:K.success?K.output.initializationId:void 0,error:ur()})}q.nack!==void 0&&s()!=="stopped"&&l(q.nack)}return function(T){let q=T.source===n.contentWindow,K=T.origin===o;if(!q||!K)return;let Z=_e(Mr,T.data);if(!Z.success){W(T.data,Z.issues);return}let C=Z.output;if(!mr(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 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=[],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=io(s,n);if(c!==void 0)return c}}function io(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&&!mt(nt,e.relation))return{code:"invalid_data_source_query_filter",message:"Relation filters require a page ID.",isRetryable:!1};let c=so(e);if(c===void 0||o.type!==c.propertyType)return;let l=new Set(o.options.map(y=>y.name)),f=ao(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 so(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 ao(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 uo=new Set(gt);function Nr(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 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(!uo.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 Ur=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 Te(a=>{y?.(a)});function T(a,k){f?.(a,k)}function q(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=pr(a,W);T("out",N),n.contentWindow?.postMessage(N,m)}function K(a){q(te(Ae,a))}function Z(a){q(a)}function C(a){let k=v.status;switch(k){case"initialized":q(te(er,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=cr({async prepareInit(a){W=a.bridgeProtocolVersion;let k=await ee;return v.status!=="preparingInit"?k:G(k)},sendInitMessage:K,warn:a=>T("warn",a),flushPendingHostStateChanges:b,minBridgeProtocolVersion:H,noConnectTimeoutMs:_,initialStateTimeoutMs:M,noInitResultTimeoutMs:S,stopHostWithFailure:at,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(fr,{...a.initialState,...L});if(V=k.manifest,L={},W<Ur&&k.page.type==="unavailable")return{status:"error",error:et()};let N=zr(k.manifest,k.dataSources);return N!==void 0?{status:"error",error:N}:(ae=k.dataSources,Q=!0,{status:"success",initialState:k})}let ee=qe().catch(a=>(j.signal.aborted||T("warn",{message:"Failed to prepare custom block initialization",error:a}),{status:"error",error:Ce()}));async function qe(){let a=await lr({...e,sandboxOrigin:m,signal:j.signal,onError:N=>{T("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 it=Tr({iframe:n,sandboxOrigin:m,getInitStatus:()=>v.status,emit:T,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",it),n.addEventListener("load",v.onIframeLoad);function st(){j.abort(),window.removeEventListener("message",it),n.removeEventListener("load",v.onIframeLoad),v.stop(),w.unsubscribeAll()}function at(a){st(),T("warn",a),l?.(a)}return{stop:st,setTheme(a){ce({theme:a})},setContrastMode(a){ce({contrastMode:a})},setParent(a){ce({parent:a})},setPage(a){if(a.type==="unavailable"&&W<Ur&&(v.status==="preparingInit"&&Q||v.status==="waitingForInitResult"||v.status==="initialized")){at({...et(),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&&zr(V,k)!==void 0){T("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){T("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 zr(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 or();for(let[l,f]of Object.entries(s.properties??{})){let y=c.propertyIdsByKey?.[l];if(y===void 0)return ir();if(c.collectionSchema.propertiesById[y]?.type!==f.type)return sr()}}}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)??Nr(e.sorts,n)}function fo(e){return te(D,e)}export{Fe as LATEST_BRIDGE_PROTOCOL_VERSION,Hr as LEGACY_PROPERTY_SHAPE_PROTOCOL_VERSION,co as createCustomBlockHost,Lr as getAutoBoundPropertyIdsByKey,rt 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;
|
|
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,6 +7,7 @@ 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";
|
|
@@ -19,6 +20,6 @@ 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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,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,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"}
|
|
@@ -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,
|
|
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
|
+
}
|
package/dist/messages/types.d.ts
CHANGED
|
@@ -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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"}
|
package/dist/protocol/index.d.ts
CHANGED
|
@@ -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";
|
package/dist/protocol/index.js
CHANGED
|
@@ -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
|
@@ -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,
|
|
@@ -76,11 +77,14 @@ export type {
|
|
|
76
77
|
CustomBlockHostHandlers,
|
|
77
78
|
CustomBlockHostListUsersResult,
|
|
78
79
|
CustomBlockHostLogDirection,
|
|
80
|
+
CustomBlockHostNavigationContext,
|
|
81
|
+
CustomBlockHostOpenExternalUrlResult,
|
|
79
82
|
CustomBlockHostOpenPageResult,
|
|
80
83
|
CustomBlockHostUpdatePageResult,
|
|
81
84
|
GetPageMessageInput,
|
|
82
85
|
GetUserMessageInput,
|
|
83
86
|
ListUsersMessageInput,
|
|
87
|
+
OpenExternalUrlMessageInput,
|
|
84
88
|
OpenPageMessageInput,
|
|
85
89
|
QueryDataSourceMessageInput,
|
|
86
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
|
+
}
|
package/src/messages/types.ts
CHANGED
|
@@ -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
|
>
|