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