@notionhq/custom-blocks 0.1.7 → 0.1.8

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.
Files changed (298) hide show
  1. package/README.md +14 -1
  2. package/bin/notion-custom-blocks/cli.js +6 -0
  3. package/dist/bridge/SandboxBridge.d.ts +3 -9
  4. package/dist/bridge/SandboxBridge.d.ts.map +1 -1
  5. package/dist/bridge/SandboxBridge.js +5 -10
  6. package/dist/bridge/dataSources/resolve.d.ts +3 -3
  7. package/dist/bridge/dataSources/resolve.d.ts.map +1 -1
  8. package/dist/bridge/dataSources/resolve.js +1 -1
  9. package/dist/bridge/dataSources/resolveProperty.d.ts +6 -9
  10. package/dist/bridge/dataSources/resolveProperty.d.ts.map +1 -1
  11. package/dist/bridge/dataSources/resolveProperty.js +3 -6
  12. package/dist/bridge/hostState.d.ts +11 -11
  13. package/dist/bridge/hostState.d.ts.map +1 -1
  14. package/dist/bridge/loadManifest.d.ts +2 -2
  15. package/dist/bridge/loadManifest.d.ts.map +1 -1
  16. package/dist/bridge/loadManifest.js +1 -1
  17. package/dist/bridge/sandboxClient.d.ts +1 -1
  18. package/dist/bridge/sandboxClient.d.ts.map +1 -1
  19. package/dist/customBlock.d.ts +8 -8
  20. package/dist/customBlock.d.ts.map +1 -1
  21. package/dist/index.d.ts +24 -25
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +2 -2
  24. package/dist/init.d.ts +8 -8
  25. package/dist/init.d.ts.map +1 -1
  26. package/dist/init.js +1 -1
  27. package/dist/protocol/contrast.d.ts.map +1 -0
  28. package/dist/protocol/dataSources/dataSource.d.ts.map +1 -0
  29. package/dist/protocol/dataSources/dataSourcePage.d.ts.map +1 -0
  30. package/dist/protocol/dataSources/dataSourceValue.d.ts.map +1 -0
  31. package/dist/protocol/dataSources/dateValue.d.ts.map +1 -0
  32. package/dist/{bridge → protocol}/dataSources/errors.d.ts +3 -0
  33. package/dist/protocol/dataSources/errors.d.ts.map +1 -0
  34. package/dist/{bridge → protocol}/dataSources/errors.js +3 -0
  35. package/dist/protocol/dataSources/propertySchema.d.ts.map +1 -0
  36. package/dist/protocol/dataSources/recordPointer.d.ts.map +1 -0
  37. package/dist/protocol/errors.d.ts.map +1 -0
  38. package/dist/protocol/ids.d.ts.map +1 -0
  39. package/dist/protocol/incomingType.d.ts.map +1 -0
  40. package/dist/protocol/index.d.ts +48 -0
  41. package/dist/protocol/index.d.ts.map +1 -0
  42. package/dist/protocol/index.js +47 -0
  43. package/dist/protocol/manifest.d.ts.map +1 -0
  44. package/dist/protocol/messages/connect.d.ts.map +1 -0
  45. package/dist/protocol/messages/contrastModeChanged.d.ts.map +1 -0
  46. package/dist/protocol/messages/createPage.d.ts.map +1 -0
  47. package/dist/protocol/messages/createPageResult.d.ts.map +1 -0
  48. package/dist/protocol/messages/currentUserChanged.d.ts.map +1 -0
  49. package/dist/{bridge → protocol}/messages/dataSourcesChanged.d.ts +1 -1
  50. package/dist/protocol/messages/dataSourcesChanged.d.ts.map +1 -0
  51. package/dist/{bridge → protocol}/messages/dataSourcesChanged.js +1 -1
  52. package/dist/protocol/messages/getPage.d.ts.map +1 -0
  53. package/dist/protocol/messages/getUser.d.ts.map +1 -0
  54. package/dist/{bridge → protocol}/messages/hostToSandbox.d.ts.map +1 -1
  55. package/dist/protocol/messages/init.d.ts.map +1 -0
  56. package/dist/protocol/messages/initResult.d.ts.map +1 -0
  57. package/dist/protocol/messages/invalidHostMessage.d.ts.map +1 -0
  58. package/dist/protocol/messages/invalidSandboxMessage.d.ts.map +1 -0
  59. package/dist/protocol/messages/listUsers.d.ts.map +1 -0
  60. package/dist/protocol/messages/pageChanged.d.ts.map +1 -0
  61. package/dist/protocol/messages/parentChanged.d.ts.map +1 -0
  62. package/dist/protocol/messages/queryDataSource.d.ts.map +1 -0
  63. package/dist/protocol/messages/queryDataSourceResult.d.ts.map +1 -0
  64. package/dist/protocol/messages/resize.d.ts.map +1 -0
  65. package/dist/{bridge → protocol}/messages/sandboxToHost.d.ts.map +1 -1
  66. package/dist/protocol/messages/themeChanged.d.ts.map +1 -0
  67. package/dist/protocol/messages/updatePage.d.ts.map +1 -0
  68. package/dist/protocol/messages/updatePageResult.d.ts.map +1 -0
  69. package/dist/{bridge → protocol}/pages/page.d.ts +1 -1
  70. package/dist/protocol/pages/page.d.ts.map +1 -0
  71. package/dist/protocol/parent.d.ts.map +1 -0
  72. package/dist/protocol/protocolVersion.d.ts +7 -0
  73. package/dist/protocol/protocolVersion.d.ts.map +1 -0
  74. package/dist/protocol/protocolVersion.js +6 -0
  75. package/dist/protocol/theme.d.ts.map +1 -0
  76. package/dist/protocol/users/user.d.ts.map +1 -0
  77. package/dist/react/index.d.ts +1 -1
  78. package/dist/react/index.js +1 -1
  79. package/dist/react/standalonePreview.d.ts.map +1 -1
  80. package/dist/react/standalonePreview.js +2 -2
  81. package/dist/react/useCustomBlockInit.d.ts +1 -1
  82. package/dist/react/useCustomBlockInit.d.ts.map +1 -1
  83. package/dist/react/useDataSource.d.ts +1 -1
  84. package/dist/react/useDataSource.js +1 -1
  85. package/dist/react/useRuntimeState.d.ts +9 -9
  86. package/dist/react/useRuntimeState.d.ts.map +1 -1
  87. package/dist/react/useRuntimeState.js +2 -2
  88. package/dist/types.d.ts +19 -18
  89. package/dist/types.d.ts.map +1 -1
  90. package/dist/version.js +1 -1
  91. package/docs/block-location.md +1 -1
  92. package/docs/data-sources.md +1 -1
  93. package/docs/deployment.md +1 -1
  94. package/docs/errors.md +0 -2
  95. package/docs/lifecycle.md +5 -5
  96. package/docs/pages.md +4 -4
  97. package/package.json +3 -7
  98. package/src/bridge/SandboxBridge.ts +36 -42
  99. package/src/bridge/dataSources/resolve.ts +3 -3
  100. package/src/bridge/dataSources/resolveProperty.ts +14 -20
  101. package/src/bridge/hostState.ts +15 -12
  102. package/src/bridge/loadManifest.ts +5 -2
  103. package/src/bridge/sandboxClient.ts +1 -1
  104. package/src/customBlock.ts +8 -8
  105. package/src/index.ts +26 -30
  106. package/src/init.ts +8 -8
  107. package/src/react/index.ts +1 -1
  108. package/src/react/standalonePreview.ts +5 -2
  109. package/src/react/useCustomBlockInit.ts +1 -1
  110. package/src/react/useDataSource.ts +1 -1
  111. package/src/react/useRuntimeState.ts +9 -9
  112. package/src/types.ts +27 -24
  113. package/HOST.md +0 -224
  114. package/dist/bridge/contrast.d.ts.map +0 -1
  115. package/dist/bridge/dataSources/dataSource.d.ts.map +0 -1
  116. package/dist/bridge/dataSources/dataSourcePage.d.ts.map +0 -1
  117. package/dist/bridge/dataSources/dataSourceValue.d.ts.map +0 -1
  118. package/dist/bridge/dataSources/dateValue.d.ts.map +0 -1
  119. package/dist/bridge/dataSources/errors.d.ts.map +0 -1
  120. package/dist/bridge/dataSources/propertySchema.d.ts.map +0 -1
  121. package/dist/bridge/dataSources/recordPointer.d.ts.map +0 -1
  122. package/dist/bridge/errors.d.ts.map +0 -1
  123. package/dist/bridge/ids.d.ts.map +0 -1
  124. package/dist/bridge/incomingType.d.ts.map +0 -1
  125. package/dist/bridge/manifest.d.ts.map +0 -1
  126. package/dist/bridge/messages/connect.d.ts.map +0 -1
  127. package/dist/bridge/messages/contrastModeChanged.d.ts.map +0 -1
  128. package/dist/bridge/messages/createPage.d.ts.map +0 -1
  129. package/dist/bridge/messages/createPageResult.d.ts.map +0 -1
  130. package/dist/bridge/messages/currentUserChanged.d.ts.map +0 -1
  131. package/dist/bridge/messages/dataSourcesChanged.d.ts.map +0 -1
  132. package/dist/bridge/messages/getPage.d.ts.map +0 -1
  133. package/dist/bridge/messages/getUser.d.ts.map +0 -1
  134. package/dist/bridge/messages/init.d.ts.map +0 -1
  135. package/dist/bridge/messages/initResult.d.ts.map +0 -1
  136. package/dist/bridge/messages/invalidHostMessage.d.ts.map +0 -1
  137. package/dist/bridge/messages/invalidSandboxMessage.d.ts.map +0 -1
  138. package/dist/bridge/messages/listUsers.d.ts.map +0 -1
  139. package/dist/bridge/messages/pageChanged.d.ts.map +0 -1
  140. package/dist/bridge/messages/parentChanged.d.ts.map +0 -1
  141. package/dist/bridge/messages/queryDataSource.d.ts.map +0 -1
  142. package/dist/bridge/messages/queryDataSourceResult.d.ts.map +0 -1
  143. package/dist/bridge/messages/resize.d.ts.map +0 -1
  144. package/dist/bridge/messages/themeChanged.d.ts.map +0 -1
  145. package/dist/bridge/messages/updatePage.d.ts.map +0 -1
  146. package/dist/bridge/messages/updatePageResult.d.ts.map +0 -1
  147. package/dist/bridge/pages/page.d.ts.map +0 -1
  148. package/dist/bridge/parent.d.ts.map +0 -1
  149. package/dist/bridge/theme.d.ts.map +0 -1
  150. package/dist/bridge/users/user.d.ts.map +0 -1
  151. package/dist/host/createCustomBlockHost.d.ts +0 -39
  152. package/dist/host/createCustomBlockHost.d.ts.map +0 -1
  153. package/dist/host/createCustomBlockHost.js +0 -495
  154. package/dist/host/lifecycle/initErrors.d.ts +0 -13
  155. package/dist/host/lifecycle/initErrors.d.ts.map +0 -1
  156. package/dist/host/lifecycle/initErrors.js +0 -152
  157. package/dist/host/lifecycle/protocolVersion.d.ts +0 -2
  158. package/dist/host/lifecycle/protocolVersion.d.ts.map +0 -1
  159. package/dist/host/lifecycle/protocolVersion.js +0 -3
  160. package/dist/host/lifecycle/types.d.ts +0 -28
  161. package/dist/host/lifecycle/types.d.ts.map +0 -1
  162. package/dist/host/lifecycle/types.js +0 -1
  163. package/dist/host/messages/invalidSandboxMessage.d.ts +0 -7
  164. package/dist/host/messages/invalidSandboxMessage.d.ts.map +0 -1
  165. package/dist/host/messages/invalidSandboxMessage.js +0 -21
  166. package/dist/host/messages/types.d.ts +0 -60
  167. package/dist/host/messages/types.d.ts.map +0 -1
  168. package/dist/host/messages/types.js +0 -1
  169. package/dist/host/queries/querySubscriptions.d.ts +0 -20
  170. package/dist/host/queries/querySubscriptions.d.ts.map +0 -1
  171. package/dist/host/queries/querySubscriptions.js +0 -45
  172. package/dist/host/queries/types.d.ts +0 -11
  173. package/dist/host/queries/types.d.ts.map +0 -1
  174. package/dist/host/queries/types.js +0 -1
  175. package/dist/host.d.ts +0 -79
  176. package/dist/host.d.ts.map +0 -1
  177. package/dist/host.js +0 -45
  178. package/src/bridge/contrast.ts +0 -6
  179. package/src/bridge/dataSources/dataSource.ts +0 -63
  180. package/src/bridge/dataSources/dataSourcePage.ts +0 -71
  181. package/src/bridge/dataSources/dataSourceValue.ts +0 -19
  182. package/src/bridge/dataSources/dateValue.ts +0 -96
  183. package/src/bridge/dataSources/errors.ts +0 -14
  184. package/src/bridge/dataSources/propertySchema.ts +0 -186
  185. package/src/bridge/dataSources/recordPointer.ts +0 -13
  186. package/src/bridge/errors.ts +0 -21
  187. package/src/bridge/ids.ts +0 -72
  188. package/src/bridge/incomingType.ts +0 -19
  189. package/src/bridge/manifest.ts +0 -47
  190. package/src/bridge/messages/connect.ts +0 -42
  191. package/src/bridge/messages/contrastModeChanged.ts +0 -12
  192. package/src/bridge/messages/createPage.ts +0 -62
  193. package/src/bridge/messages/createPageResult.ts +0 -52
  194. package/src/bridge/messages/currentUserChanged.ts +0 -14
  195. package/src/bridge/messages/dataSourcesChanged.ts +0 -18
  196. package/src/bridge/messages/getPage.ts +0 -51
  197. package/src/bridge/messages/getUser.ts +0 -49
  198. package/src/bridge/messages/hostToSandbox.ts +0 -39
  199. package/src/bridge/messages/init.ts +0 -99
  200. package/src/bridge/messages/initResult.ts +0 -37
  201. package/src/bridge/messages/invalidHostMessage.ts +0 -16
  202. package/src/bridge/messages/invalidSandboxMessage.ts +0 -18
  203. package/src/bridge/messages/listUsers.ts +0 -50
  204. package/src/bridge/messages/pageChanged.ts +0 -12
  205. package/src/bridge/messages/parentChanged.ts +0 -14
  206. package/src/bridge/messages/queryDataSource.ts +0 -20
  207. package/src/bridge/messages/queryDataSourceResult.ts +0 -45
  208. package/src/bridge/messages/resize.ts +0 -13
  209. package/src/bridge/messages/sandboxToHost.ts +0 -32
  210. package/src/bridge/messages/themeChanged.ts +0 -15
  211. package/src/bridge/messages/updatePage.ts +0 -22
  212. package/src/bridge/messages/updatePageResult.ts +0 -49
  213. package/src/bridge/pages/page.ts +0 -290
  214. package/src/bridge/parent.ts +0 -30
  215. package/src/bridge/theme.ts +0 -5
  216. package/src/bridge/users/user.ts +0 -31
  217. package/src/host/createCustomBlockHost.ts +0 -662
  218. package/src/host/lifecycle/initErrors.ts +0 -165
  219. package/src/host/lifecycle/protocolVersion.ts +0 -3
  220. package/src/host/lifecycle/types.ts +0 -40
  221. package/src/host/messages/invalidSandboxMessage.ts +0 -35
  222. package/src/host/messages/types.ts +0 -67
  223. package/src/host/queries/querySubscriptions.ts +0 -71
  224. package/src/host/queries/types.ts +0 -13
  225. package/src/host.ts +0 -182
  226. /package/dist/{bridge → protocol}/contrast.d.ts +0 -0
  227. /package/dist/{bridge → protocol}/contrast.js +0 -0
  228. /package/dist/{bridge → protocol}/dataSources/dataSource.d.ts +0 -0
  229. /package/dist/{bridge → protocol}/dataSources/dataSource.js +0 -0
  230. /package/dist/{bridge → protocol}/dataSources/dataSourcePage.d.ts +0 -0
  231. /package/dist/{bridge → protocol}/dataSources/dataSourcePage.js +0 -0
  232. /package/dist/{bridge → protocol}/dataSources/dataSourceValue.d.ts +0 -0
  233. /package/dist/{bridge → protocol}/dataSources/dataSourceValue.js +0 -0
  234. /package/dist/{bridge → protocol}/dataSources/dateValue.d.ts +0 -0
  235. /package/dist/{bridge → protocol}/dataSources/dateValue.js +0 -0
  236. /package/dist/{bridge → protocol}/dataSources/propertySchema.d.ts +0 -0
  237. /package/dist/{bridge → protocol}/dataSources/propertySchema.js +0 -0
  238. /package/dist/{bridge → protocol}/dataSources/recordPointer.d.ts +0 -0
  239. /package/dist/{bridge → protocol}/dataSources/recordPointer.js +0 -0
  240. /package/dist/{bridge → protocol}/errors.d.ts +0 -0
  241. /package/dist/{bridge → protocol}/errors.js +0 -0
  242. /package/dist/{bridge → protocol}/ids.d.ts +0 -0
  243. /package/dist/{bridge → protocol}/ids.js +0 -0
  244. /package/dist/{bridge → protocol}/incomingType.d.ts +0 -0
  245. /package/dist/{bridge → protocol}/incomingType.js +0 -0
  246. /package/dist/{bridge → protocol}/manifest.d.ts +0 -0
  247. /package/dist/{bridge → protocol}/manifest.js +0 -0
  248. /package/dist/{bridge → protocol}/messages/connect.d.ts +0 -0
  249. /package/dist/{bridge → protocol}/messages/connect.js +0 -0
  250. /package/dist/{bridge → protocol}/messages/contrastModeChanged.d.ts +0 -0
  251. /package/dist/{bridge → protocol}/messages/contrastModeChanged.js +0 -0
  252. /package/dist/{bridge → protocol}/messages/createPage.d.ts +0 -0
  253. /package/dist/{bridge → protocol}/messages/createPage.js +0 -0
  254. /package/dist/{bridge → protocol}/messages/createPageResult.d.ts +0 -0
  255. /package/dist/{bridge → protocol}/messages/createPageResult.js +0 -0
  256. /package/dist/{bridge → protocol}/messages/currentUserChanged.d.ts +0 -0
  257. /package/dist/{bridge → protocol}/messages/currentUserChanged.js +0 -0
  258. /package/dist/{bridge → protocol}/messages/getPage.d.ts +0 -0
  259. /package/dist/{bridge → protocol}/messages/getPage.js +0 -0
  260. /package/dist/{bridge → protocol}/messages/getUser.d.ts +0 -0
  261. /package/dist/{bridge → protocol}/messages/getUser.js +0 -0
  262. /package/dist/{bridge → protocol}/messages/hostToSandbox.d.ts +0 -0
  263. /package/dist/{bridge → protocol}/messages/hostToSandbox.js +0 -0
  264. /package/dist/{bridge → protocol}/messages/init.d.ts +0 -0
  265. /package/dist/{bridge → protocol}/messages/init.js +0 -0
  266. /package/dist/{bridge → protocol}/messages/initResult.d.ts +0 -0
  267. /package/dist/{bridge → protocol}/messages/initResult.js +0 -0
  268. /package/dist/{bridge → protocol}/messages/invalidHostMessage.d.ts +0 -0
  269. /package/dist/{bridge → protocol}/messages/invalidHostMessage.js +0 -0
  270. /package/dist/{bridge → protocol}/messages/invalidSandboxMessage.d.ts +0 -0
  271. /package/dist/{bridge → protocol}/messages/invalidSandboxMessage.js +0 -0
  272. /package/dist/{bridge → protocol}/messages/listUsers.d.ts +0 -0
  273. /package/dist/{bridge → protocol}/messages/listUsers.js +0 -0
  274. /package/dist/{bridge → protocol}/messages/pageChanged.d.ts +0 -0
  275. /package/dist/{bridge → protocol}/messages/pageChanged.js +0 -0
  276. /package/dist/{bridge → protocol}/messages/parentChanged.d.ts +0 -0
  277. /package/dist/{bridge → protocol}/messages/parentChanged.js +0 -0
  278. /package/dist/{bridge → protocol}/messages/queryDataSource.d.ts +0 -0
  279. /package/dist/{bridge → protocol}/messages/queryDataSource.js +0 -0
  280. /package/dist/{bridge → protocol}/messages/queryDataSourceResult.d.ts +0 -0
  281. /package/dist/{bridge → protocol}/messages/queryDataSourceResult.js +0 -0
  282. /package/dist/{bridge → protocol}/messages/resize.d.ts +0 -0
  283. /package/dist/{bridge → protocol}/messages/resize.js +0 -0
  284. /package/dist/{bridge → protocol}/messages/sandboxToHost.d.ts +0 -0
  285. /package/dist/{bridge → protocol}/messages/sandboxToHost.js +0 -0
  286. /package/dist/{bridge → protocol}/messages/themeChanged.d.ts +0 -0
  287. /package/dist/{bridge → protocol}/messages/themeChanged.js +0 -0
  288. /package/dist/{bridge → protocol}/messages/updatePage.d.ts +0 -0
  289. /package/dist/{bridge → protocol}/messages/updatePage.js +0 -0
  290. /package/dist/{bridge → protocol}/messages/updatePageResult.d.ts +0 -0
  291. /package/dist/{bridge → protocol}/messages/updatePageResult.js +0 -0
  292. /package/dist/{bridge → protocol}/pages/page.js +0 -0
  293. /package/dist/{bridge → protocol}/parent.d.ts +0 -0
  294. /package/dist/{bridge → protocol}/parent.js +0 -0
  295. /package/dist/{bridge → protocol}/theme.d.ts +0 -0
  296. /package/dist/{bridge → protocol}/theme.js +0 -0
  297. /package/dist/{bridge → protocol}/users/user.d.ts +0 -0
  298. /package/dist/{bridge → protocol}/users/user.js +0 -0
@@ -1,662 +0,0 @@
1
- import * as v from "valibot"
2
- import {
3
- DEFAULT_CONTRAST_MODE,
4
- type NotionContrastMode,
5
- } from "../bridge/contrast.js"
6
- import type { NotionDataSourceId } from "../bridge/ids.js"
7
- import type { CustomBlockManifest } from "../bridge/manifest.js"
8
- import type { ConnectMessage } from "../bridge/messages/connect.js"
9
- import type { ContrastModeChangedMessage } from "../bridge/messages/contrastModeChanged.js"
10
- import type { CreatePageMessage } from "../bridge/messages/createPage.js"
11
- import type { CreatePageResultMessage } from "../bridge/messages/createPageResult.js"
12
- import type { DataSourcesChangedMessage } from "../bridge/messages/dataSourcesChanged.js"
13
- import type {
14
- GetPageMessage,
15
- GetPageResultMessage,
16
- } from "../bridge/messages/getPage.js"
17
- import type {
18
- GetUserMessage,
19
- GetUserResultMessage,
20
- } from "../bridge/messages/getUser.js"
21
- import type { HostToSandboxMessage } from "../bridge/messages/hostToSandbox.js"
22
- import type {
23
- CustomBlockInitErrorCode,
24
- CustomBlockInitErrorInfo,
25
- InitMessage,
26
- } from "../bridge/messages/init.js"
27
- import type { InitResultMessage } from "../bridge/messages/initResult.js"
28
- import type {
29
- ListUsersMessage,
30
- ListUsersResultMessage,
31
- } from "../bridge/messages/listUsers.js"
32
- import type { PageChangedMessage } from "../bridge/messages/pageChanged.js"
33
- import type { ParentChangedMessage } from "../bridge/messages/parentChanged.js"
34
- import type { QueryDataSourceMessage } from "../bridge/messages/queryDataSource.js"
35
- import type { QueryDataSourceResultMessage } from "../bridge/messages/queryDataSourceResult.js"
36
- import { sandboxToHostMessageSchema } from "../bridge/messages/sandboxToHost.js"
37
- import type { ThemeChangedMessage } from "../bridge/messages/themeChanged.js"
38
- import type { UpdatePageMessage } from "../bridge/messages/updatePage.js"
39
- import type { UpdatePageResultMessage } from "../bridge/messages/updatePageResult.js"
40
- import type { CustomBlockPage } from "../bridge/pages/page.js"
41
- import type { NotionParent } from "../bridge/parent.js"
42
- import { CUSTOM_BLOCK_BRIDGE_PROTOCOL_VERSION } from "../bridge/SandboxBridge.js"
43
- import type { NotionTheme } from "../bridge/theme.js"
44
- import type { NotionUser } from "../bridge/users/user.js"
45
- import { unreachable } from "../utils.js"
46
- import { initErrorForFailureReason } from "./lifecycle/initErrors.js"
47
- import { isValidBridgeProtocolVersion } from "./lifecycle/protocolVersion.js"
48
- import type {
49
- ConnectSuccessMessage,
50
- CustomBlockHostDataSourcesPayload,
51
- CustomBlockHostInitialState,
52
- InitStatus,
53
- } from "./lifecycle/types.js"
54
- import { getInvalidSandboxMessageResponse } from "./messages/invalidSandboxMessage.js"
55
- import type {
56
- CustomBlockHostHandlers,
57
- CustomBlockHostLogDirection,
58
- } from "./messages/types.js"
59
- import { QuerySubscriptions } from "./queries/querySubscriptions.js"
60
- import type { CustomBlockHostQueryDataSourceResult } from "./queries/types.js"
61
-
62
- export type CustomBlockHostOptions = {
63
- iframe: HTMLIFrameElement
64
- targetOrigin?: string
65
- minBridgeProtocolVersion: number
66
- noConnectTimeoutMs?: number
67
- noInitResultTimeoutMs?: number
68
- initialState: CustomBlockHostInitialState
69
- handlers: CustomBlockHostHandlers
70
- onConnect?: (message: ConnectSuccessMessage) => void
71
- onInitResult?: (message: InitResultMessage) => void
72
- onLog?: (direction: CustomBlockHostLogDirection, payload: unknown) => void
73
- }
74
-
75
- export type CustomBlockHostHandle = {
76
- stop: () => void
77
- post: (message: HostToSandboxMessage) => void
78
- setTheme: (theme: NotionTheme) => void
79
- setContrastMode: (contrastMode: NotionContrastMode) => void
80
- setParent: (parent: NotionParent) => void
81
- setPage: (page: CustomBlockPage) => void
82
- setDataSources: (dataSources: CustomBlockHostDataSourcesPayload) => void
83
- setCurrentUser: (currentUser: NotionUser) => void
84
- refreshQuery: (args: {
85
- dataSourceId: NotionDataSourceId
86
- response: CustomBlockHostQueryDataSourceResult
87
- }) => void
88
- }
89
-
90
- const DEFAULT_NO_CONNECT_TIMEOUT_MS = 5_000
91
- const DEFAULT_NO_INIT_RESULT_TIMEOUT_MS = 5_000
92
- const initializationIdentitySchema = v.object({
93
- initializationId: v.string(),
94
- })
95
-
96
- export function createCustomBlockHost(
97
- options: CustomBlockHostOptions,
98
- ): CustomBlockHostHandle {
99
- const {
100
- iframe,
101
- initialState,
102
- handlers,
103
- onConnect,
104
- onInitResult,
105
- onLog,
106
- targetOrigin = "*",
107
- minBridgeProtocolVersion: configuredMinBridgeProtocolVersion,
108
- noConnectTimeoutMs = DEFAULT_NO_CONNECT_TIMEOUT_MS,
109
- noInitResultTimeoutMs = DEFAULT_NO_INIT_RESULT_TIMEOUT_MS,
110
- } = options
111
- const minBridgeProtocolVersion = Math.max(
112
- configuredMinBridgeProtocolVersion ?? CUSTOM_BLOCK_BRIDGE_PROTOCOL_VERSION,
113
- CUSTOM_BLOCK_BRIDGE_PROTOCOL_VERSION,
114
- )
115
-
116
- let theme = initialState.theme
117
- let contrastMode = initialState.contrastMode ?? DEFAULT_CONTRAST_MODE
118
- let parent = initialState.parent
119
- let page = initialState.page
120
- let dataSources = initialState.dataSources
121
- let manifest = initialState.manifest
122
- let currentUser = initialState.currentUser
123
- let initStatus: InitStatus = "waitingForConnect"
124
- let noConnectTimeoutId: number | undefined
125
- let noInitResultTimeoutId: number | undefined
126
- let activeInitializationId: string | undefined
127
- let connectedSandbox: ConnectSuccessMessage | undefined
128
- let pendingThemeChange = false
129
- let pendingContrastModeChange = false
130
- let pendingParentChange = false
131
- let pendingPageChange = false
132
- let pendingDataSourcesChange: CustomBlockHostDataSourcesPayload | undefined
133
- let pendingCurrentUserChange = false
134
- const querySubscriptions = new QuerySubscriptions()
135
-
136
- function emit(direction: CustomBlockHostLogDirection, payload: unknown) {
137
- onLog?.(direction, payload)
138
- }
139
-
140
- function post(message: HostToSandboxMessage) {
141
- emit("out", message)
142
- iframe.contentWindow?.postMessage(message, targetOrigin)
143
- }
144
-
145
- function postQueryDataSourceResult(args: {
146
- subscriptionId: string
147
- response: CustomBlockHostQueryDataSourceResult
148
- }) {
149
- const message: QueryDataSourceResultMessage =
150
- args.response.status === "error"
151
- ? {
152
- type: "queryDataSourceResult",
153
- subscriptionId: args.subscriptionId,
154
- status: "error",
155
- error: args.response.error,
156
- }
157
- : {
158
- type: "queryDataSourceResult",
159
- subscriptionId: args.subscriptionId,
160
- status: "success",
161
- items: args.response.items,
162
- hasMore: args.response.hasMore,
163
- }
164
- post(message)
165
- }
166
-
167
- function clearNoConnectTimeout() {
168
- if (noConnectTimeoutId !== undefined) {
169
- window.clearTimeout(noConnectTimeoutId)
170
- noConnectTimeoutId = undefined
171
- }
172
- }
173
-
174
- function clearNoInitResultTimeout() {
175
- if (noInitResultTimeoutId !== undefined) {
176
- window.clearTimeout(noInitResultTimeoutId)
177
- noInitResultTimeoutId = undefined
178
- }
179
- }
180
-
181
- function resolveDataSourcesPayload(
182
- connect: ConnectSuccessMessage,
183
- ): CustomBlockHostDataSourcesPayload {
184
- return typeof dataSources === "function"
185
- ? dataSources(connect)
186
- : dataSources
187
- }
188
-
189
- function sendInit(connect: ConnectSuccessMessage): boolean {
190
- if (initStatus !== "waitingForConnect") {
191
- return false
192
- }
193
- onConnect?.(connect)
194
- manifest = connect.manifest ?? initialState.manifest
195
- const resolvedDataSources = resolveDataSourcesPayload(connect)
196
- const bindingErrorCode = getBindingErrorCode(manifest, resolvedDataSources)
197
- if (bindingErrorCode !== undefined) {
198
- sendInitError(
199
- connect.initializationId,
200
- initErrorForFailureReason(bindingErrorCode),
201
- )
202
- return false
203
- }
204
- initStatus = "waitingForInitResult"
205
- activeInitializationId = connect.initializationId
206
- clearNoConnectTimeout()
207
- const message: InitMessage = {
208
- type: "init",
209
- initializationId: connect.initializationId,
210
- status: "success",
211
- theme,
212
- contrastMode,
213
- blockId: initialState.blockId,
214
- parent,
215
- page,
216
- manifest,
217
- dataSources: resolvedDataSources,
218
- currentUser,
219
- }
220
- post(message)
221
- noInitResultTimeoutId = window.setTimeout(() => {
222
- if (initStatus !== "waitingForInitResult") {
223
- return
224
- }
225
- initStatus = "error"
226
- emit("warn", {
227
- message: "Sandbox did not send initResult",
228
- initializationId: connect.initializationId,
229
- })
230
- }, noInitResultTimeoutMs)
231
- return true
232
- }
233
-
234
- function sendInitError(
235
- initializationId: string,
236
- error: CustomBlockInitErrorInfo,
237
- ) {
238
- if (initStatus !== "waitingForConnect") {
239
- return
240
- }
241
- initStatus = "error"
242
- activeInitializationId = initializationId
243
- clearNoConnectTimeout()
244
- post({
245
- type: "init",
246
- initializationId,
247
- status: "error",
248
- error,
249
- })
250
- }
251
-
252
- function onIframeLoad() {
253
- clearNoConnectTimeout()
254
- if (initStatus !== "waitingForConnect") {
255
- // Only set the timeout if the iframe loaded before the `connect` message was sent.
256
- return
257
- }
258
- noConnectTimeoutId = window.setTimeout(() => {
259
- if (initStatus !== "waitingForConnect") {
260
- // Only do anything if the iframe loaded before the `connect` message was sent.
261
- return
262
- }
263
- initStatus = "error"
264
- emit("warn", initErrorForFailureReason("no_connect"))
265
- }, noConnectTimeoutMs)
266
- }
267
-
268
- async function handleQuery(message: QueryDataSourceMessage) {
269
- const token = querySubscriptions.track(message)
270
- const response = await handlers.queryDataSource(message)
271
- if (!querySubscriptions.isCurrent(message.subscriptionId, token)) {
272
- return
273
- }
274
- postQueryDataSourceResult({
275
- subscriptionId: message.subscriptionId,
276
- response,
277
- })
278
- }
279
-
280
- async function handleCreatePage(message: CreatePageMessage) {
281
- if (handlers.createPage === undefined) {
282
- return
283
- }
284
- const response = await handlers.createPage(message)
285
- const result: CreatePageResultMessage = {
286
- type: "createPageResult",
287
- requestId: message.requestId,
288
- ...response,
289
- }
290
- post(result)
291
- }
292
-
293
- async function handleGetPage(message: GetPageMessage) {
294
- if (handlers.getPage === undefined) {
295
- return
296
- }
297
- const response = await handlers.getPage(message)
298
- const result: GetPageResultMessage = {
299
- type: "getPageResult",
300
- requestId: message.requestId,
301
- ...response,
302
- }
303
- post(result)
304
- }
305
-
306
- async function handleGetUser(message: GetUserMessage) {
307
- if (handlers.getUser === undefined) {
308
- return
309
- }
310
- const response = await handlers.getUser(message)
311
- const result: GetUserResultMessage = {
312
- type: "getUserResult",
313
- requestId: message.requestId,
314
- ...response,
315
- }
316
- post(result)
317
- }
318
-
319
- async function handleListUsers(message: ListUsersMessage) {
320
- if (handlers.listUsers === undefined) {
321
- return
322
- }
323
- const response = await handlers.listUsers(message)
324
- const result: ListUsersResultMessage = {
325
- type: "listUsersResult",
326
- requestId: message.requestId,
327
- ...response,
328
- }
329
- post(result)
330
- }
331
-
332
- async function handleUpdatePage(message: UpdatePageMessage) {
333
- if (handlers.updatePage === undefined) {
334
- return
335
- }
336
- const response = await handlers.updatePage(message)
337
- const result: UpdatePageResultMessage = {
338
- type: "updatePageResult",
339
- requestId: message.requestId,
340
- ...response,
341
- }
342
- post(result)
343
- }
344
-
345
- function handleConnect(message: ConnectMessage) {
346
- // Verify the bridge protocol version is valid.
347
- if (!isValidBridgeProtocolVersion(message.bridgeProtocolVersion)) {
348
- const initError = initErrorForFailureReason("invalid_protocol_version", {
349
- currentBridgeProtocolVersion: message.bridgeProtocolVersion,
350
- })
351
- sendInitError(message.initializationId, initError)
352
- return
353
- }
354
- if (message.bridgeProtocolVersion < minBridgeProtocolVersion) {
355
- const initError = initErrorForFailureReason(
356
- "unsupported_protocol_version",
357
- {
358
- currentBridgeProtocolVersion: message.bridgeProtocolVersion,
359
- minBridgeProtocolVersion,
360
- },
361
- )
362
- sendInitError(message.initializationId, initError)
363
- return
364
- }
365
-
366
- // If the sandbox reported an error during `connect`, return it as an `init` error.
367
- if (message.status === "error") {
368
- sendInitError(message.initializationId, message.error)
369
- return
370
- }
371
-
372
- if (!sendInit(message)) {
373
- return
374
- }
375
- connectedSandbox = message
376
- }
377
-
378
- /**
379
- * Sends any pending host state changes to the sandbox. It is possible for these to change
380
- * between when the host sends `init` and when the sandbox responds with `initResult`. The host
381
- * does send any pending state changes until hearing back from the sandbox.
382
- */
383
- function flushPendingHostStateChanges() {
384
- if (pendingThemeChange) {
385
- pendingThemeChange = false
386
- post({ type: "themeChanged", theme })
387
- }
388
- if (pendingContrastModeChange) {
389
- pendingContrastModeChange = false
390
- post({ type: "contrastModeChanged", contrastMode })
391
- }
392
- if (pendingParentChange) {
393
- pendingParentChange = false
394
- post({ type: "parentChanged", parent })
395
- }
396
- if (pendingPageChange) {
397
- pendingPageChange = false
398
- post({ type: "pageChanged", page })
399
- }
400
- if (pendingDataSourcesChange !== undefined) {
401
- const nextDataSources = pendingDataSourcesChange
402
- pendingDataSourcesChange = undefined
403
- post({ type: "dataSourcesChanged", dataSources: nextDataSources })
404
- }
405
- if (pendingCurrentUserChange) {
406
- pendingCurrentUserChange = false
407
- post({ type: "currentUserChanged", currentUser })
408
- }
409
- }
410
-
411
- function handleInitResult(message: InitResultMessage) {
412
- if (
413
- initStatus !== "waitingForInitResult" ||
414
- message.initializationId !== activeInitializationId
415
- ) {
416
- emit("warn", {
417
- message: "Ignored stale or unexpected initResult",
418
- payload: message,
419
- })
420
- return
421
- }
422
- clearNoInitResultTimeout()
423
- initStatus = message.status === "success" ? "success" : "error"
424
- if (initStatus === "success") {
425
- flushPendingHostStateChanges()
426
- }
427
- onInitResult?.(message)
428
- }
429
-
430
- function onInvalidSandboxMessage(
431
- data: unknown,
432
- issues: readonly v.BaseIssue<unknown>[],
433
- ) {
434
- emit("warn", {
435
- message: "Ignored unsupported sandbox message",
436
- payload: data,
437
- issues,
438
- })
439
- const response = getInvalidSandboxMessageResponse(data)
440
-
441
- const parsedIdentity = v.safeParse(initializationIdentitySchema, data)
442
- const initializationId = parsedIdentity.success
443
- ? parsedIdentity.output.initializationId
444
- : undefined
445
- if (
446
- initStatus === "waitingForConnect" &&
447
- response.incomingType === "connect" &&
448
- initializationId !== undefined
449
- ) {
450
- sendInitError(
451
- initializationId,
452
- initErrorForFailureReason("invalid_connect"),
453
- )
454
- } else if (response.nack !== undefined) {
455
- post(response.nack)
456
- }
457
- }
458
-
459
- function onMessage(event: MessageEvent) {
460
- if (event.source !== iframe.contentWindow) {
461
- return
462
- }
463
-
464
- const parsed = v.safeParse(sandboxToHostMessageSchema, event.data)
465
- if (!parsed.success) {
466
- onInvalidSandboxMessage(event.data, parsed.issues)
467
- return
468
- }
469
-
470
- const message = parsed.output
471
- emit("in", message)
472
-
473
- if (
474
- message.type !== "connect" &&
475
- message.type !== "initResult" &&
476
- initStatus !== "success"
477
- ) {
478
- emit("warn", {
479
- message: `Ignored ${message.type} before initialization completed`,
480
- payload: message,
481
- })
482
- return
483
- }
484
-
485
- switch (message.type) {
486
- case "connect":
487
- handleConnect(message)
488
- return
489
- case "initResult":
490
- handleInitResult(message)
491
- return
492
- case "queryDataSource":
493
- void handleQuery(message)
494
- return
495
- case "createPage":
496
- void handleCreatePage(message)
497
- return
498
- case "getPage":
499
- void handleGetPage(message)
500
- return
501
- case "getUser":
502
- void handleGetUser(message)
503
- return
504
- case "listUsers":
505
- void handleListUsers(message)
506
- return
507
- case "updatePage":
508
- void handleUpdatePage(message)
509
- return
510
- case "resize":
511
- handlers.resize?.(message)
512
- return
513
- case "invalidHostMessage":
514
- return
515
- default:
516
- unreachable(message)
517
- }
518
- }
519
-
520
- window.addEventListener("message", onMessage)
521
- iframe.addEventListener("load", onIframeLoad)
522
-
523
- return {
524
- stop() {
525
- window.removeEventListener("message", onMessage)
526
- iframe.removeEventListener("load", onIframeLoad)
527
- clearNoConnectTimeout()
528
- clearNoInitResultTimeout()
529
- querySubscriptions.clear()
530
- },
531
- post,
532
- setTheme(nextTheme) {
533
- theme = nextTheme
534
- if (initStatus !== "success") {
535
- if (initStatus === "waitingForInitResult") {
536
- pendingThemeChange = true
537
- }
538
- return
539
- }
540
- const message: ThemeChangedMessage = { type: "themeChanged", theme }
541
- post(message)
542
- },
543
- setContrastMode(nextContrastMode) {
544
- contrastMode = nextContrastMode
545
- if (initStatus !== "success") {
546
- if (initStatus === "waitingForInitResult") {
547
- pendingContrastModeChange = true
548
- }
549
- return
550
- }
551
- const message: ContrastModeChangedMessage = {
552
- type: "contrastModeChanged",
553
- contrastMode,
554
- }
555
- post(message)
556
- },
557
- setParent(nextParent) {
558
- parent = nextParent
559
- if (initStatus !== "success") {
560
- if (initStatus === "waitingForInitResult") {
561
- pendingParentChange = true
562
- }
563
- return
564
- }
565
- const message: ParentChangedMessage = { type: "parentChanged", parent }
566
- post(message)
567
- },
568
- setPage(nextPage) {
569
- page = nextPage
570
- if (initStatus !== "success") {
571
- if (initStatus === "waitingForInitResult") {
572
- pendingPageChange = true
573
- }
574
- return
575
- }
576
- const message: PageChangedMessage = { type: "pageChanged", page }
577
- post(message)
578
- },
579
- setDataSources(nextDataSources) {
580
- if (
581
- connectedSandbox !== undefined &&
582
- getBindingErrorCode(manifest, nextDataSources) !== undefined
583
- ) {
584
- emit("warn", {
585
- message: "Ignored invalid data source bindings update",
586
- payload: nextDataSources,
587
- })
588
- return
589
- }
590
- dataSources = nextDataSources
591
- if (initStatus !== "success") {
592
- if (initStatus === "waitingForInitResult") {
593
- pendingDataSourcesChange = nextDataSources
594
- }
595
- return
596
- }
597
- const message: DataSourcesChangedMessage = {
598
- type: "dataSourcesChanged",
599
- dataSources: nextDataSources,
600
- }
601
- post(message)
602
- },
603
- setCurrentUser(nextCurrentUser) {
604
- currentUser = nextCurrentUser
605
- if (initStatus !== "success") {
606
- if (initStatus === "waitingForInitResult") {
607
- pendingCurrentUserChange = true
608
- }
609
- return
610
- }
611
- post({ type: "currentUserChanged", currentUser })
612
- },
613
- refreshQuery({ dataSourceId, response }) {
614
- if (initStatus !== "success") {
615
- return
616
- }
617
- const refreshes = querySubscriptions.resolveRefreshes({
618
- dataSourceId,
619
- response,
620
- })
621
- if (refreshes.length === 0) {
622
- emit("warn", `No active query exists for data source "${dataSourceId}"`)
623
- return
624
- }
625
- for (const refresh of refreshes) {
626
- postQueryDataSourceResult(refresh)
627
- }
628
- },
629
- }
630
- }
631
-
632
- function getBindingErrorCode(
633
- manifest: CustomBlockManifest,
634
- dataSources: CustomBlockHostDataSourcesPayload,
635
- ): CustomBlockInitErrorCode | undefined {
636
- for (const [dataSourceKey, manifestDataSource] of Object.entries(
637
- manifest.dataSources,
638
- )) {
639
- const binding = dataSources.bindings[dataSourceKey]
640
- if (
641
- binding?.collectionPointer === undefined ||
642
- binding.collectionSchema === undefined
643
- ) {
644
- return "missing_data_source_binding"
645
- }
646
- for (const [propertyKey, manifestProperty] of Object.entries(
647
- manifestDataSource.properties ?? {},
648
- )) {
649
- const propertyId = binding.propertyIdsByKey?.[propertyKey]
650
- if (propertyId === undefined) {
651
- return "missing_property_binding"
652
- }
653
- if (
654
- binding.collectionSchema.propertiesById[propertyId]?.type !==
655
- manifestProperty.type
656
- ) {
657
- return "invalid_property_binding"
658
- }
659
- }
660
- }
661
- return undefined
662
- }