ncblock 0.0.5 → 0.0.7
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/dist/bridge/SandboxBridge.d.ts +16 -0
- package/dist/bridge/SandboxBridge.d.ts.map +1 -1
- package/dist/bridge/SandboxBridge.js +38 -18
- package/dist/bridge/context.d.ts.map +1 -1
- package/dist/bridge/dataSources/dataSource.d.ts.map +1 -1
- package/dist/bridge/dataSources/dataSourcePage.d.ts.map +1 -1
- package/dist/bridge/dataSources/dataSourceValue.d.ts.map +1 -1
- package/dist/bridge/dataSources/dateValue.d.ts.map +1 -1
- package/dist/bridge/dataSources/propertySchema.d.ts.map +1 -1
- package/dist/bridge/dataSources/recordPointer.d.ts.map +1 -1
- package/dist/bridge/dataSources/resolve.d.ts.map +1 -1
- package/dist/bridge/dataSources/resolveProperty.d.ts.map +1 -1
- package/dist/bridge/hostState.d.ts.map +1 -1
- package/dist/bridge/ids.d.ts.map +1 -1
- package/dist/bridge/incomingType.d.ts.map +1 -1
- package/dist/bridge/loadManifest.d.ts.map +1 -1
- package/dist/bridge/manifest.d.ts.map +1 -1
- package/dist/bridge/messages/contextChanged.d.ts.map +1 -1
- package/dist/bridge/messages/createPage.d.ts.map +1 -1
- package/dist/bridge/messages/createPageResult.d.ts.map +1 -1
- package/dist/bridge/messages/dataSourcesChanged.d.ts.map +1 -1
- package/dist/bridge/messages/getPage.d.ts.map +1 -1
- package/dist/bridge/messages/getUser.d.ts.map +1 -1
- package/dist/bridge/messages/hostToSandbox.d.ts.map +1 -1
- package/dist/bridge/messages/init.d.ts.map +1 -1
- package/dist/bridge/messages/invalidHostMessage.d.ts.map +1 -1
- package/dist/bridge/messages/invalidSandboxMessage.d.ts.map +1 -1
- package/dist/bridge/messages/listUsers.d.ts.map +1 -1
- package/dist/bridge/messages/queryDataSource.d.ts.map +1 -1
- package/dist/bridge/messages/queryDataSourceResult.d.ts.map +1 -1
- package/dist/bridge/messages/ready.d.ts.map +1 -1
- package/dist/bridge/messages/resize.d.ts.map +1 -1
- package/dist/bridge/messages/sandboxToHost.d.ts.map +1 -1
- package/dist/bridge/messages/themeChanged.d.ts.map +1 -1
- package/dist/bridge/messages/updatePage.d.ts.map +1 -1
- package/dist/bridge/messages/updatePageResult.d.ts.map +1 -1
- package/dist/bridge/pages/page.d.ts.map +1 -1
- package/dist/bridge/pendingRequests.d.ts.map +1 -1
- package/dist/bridge/sandboxClient.d.ts +4 -0
- package/dist/bridge/sandboxClient.d.ts.map +1 -1
- package/dist/bridge/sandboxClient.js +6 -0
- package/dist/bridge/theme.d.ts.map +1 -1
- package/dist/bridge/users/user.d.ts.map +1 -1
- package/dist/host.d.ts.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +32 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/users.d.ts.map +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/docs/lifecycle.md +32 -0
- package/package.json +6 -13
- package/{bridge → src/bridge}/SandboxBridge.ts +53 -18
- package/{bridge → src/bridge}/sandboxClient.ts +11 -1
- package/{index.ts → src/index.ts} +6 -1
- package/{react.tsx → src/react.tsx} +43 -2
- /package/{bridge → src/bridge}/context.ts +0 -0
- /package/{bridge → src/bridge}/dataSources/dataSource.ts +0 -0
- /package/{bridge → src/bridge}/dataSources/dataSourcePage.ts +0 -0
- /package/{bridge → src/bridge}/dataSources/dataSourceValue.ts +0 -0
- /package/{bridge → src/bridge}/dataSources/dateValue.ts +0 -0
- /package/{bridge → src/bridge}/dataSources/propertySchema.ts +0 -0
- /package/{bridge → src/bridge}/dataSources/recordPointer.ts +0 -0
- /package/{bridge → src/bridge}/dataSources/resolve.ts +0 -0
- /package/{bridge → src/bridge}/dataSources/resolveProperty.ts +0 -0
- /package/{bridge → src/bridge}/hostState.ts +0 -0
- /package/{bridge → src/bridge}/ids.ts +0 -0
- /package/{bridge → src/bridge}/incomingType.ts +0 -0
- /package/{bridge → src/bridge}/loadManifest.ts +0 -0
- /package/{bridge → src/bridge}/manifest.ts +0 -0
- /package/{bridge → src/bridge}/messages/contextChanged.ts +0 -0
- /package/{bridge → src/bridge}/messages/createPage.ts +0 -0
- /package/{bridge → src/bridge}/messages/createPageResult.ts +0 -0
- /package/{bridge → src/bridge}/messages/dataSourcesChanged.ts +0 -0
- /package/{bridge → src/bridge}/messages/getPage.ts +0 -0
- /package/{bridge → src/bridge}/messages/getUser.ts +0 -0
- /package/{bridge → src/bridge}/messages/hostToSandbox.ts +0 -0
- /package/{bridge → src/bridge}/messages/init.ts +0 -0
- /package/{bridge → src/bridge}/messages/invalidHostMessage.ts +0 -0
- /package/{bridge → src/bridge}/messages/invalidSandboxMessage.ts +0 -0
- /package/{bridge → src/bridge}/messages/listUsers.ts +0 -0
- /package/{bridge → src/bridge}/messages/queryDataSource.ts +0 -0
- /package/{bridge → src/bridge}/messages/queryDataSourceResult.ts +0 -0
- /package/{bridge → src/bridge}/messages/ready.ts +0 -0
- /package/{bridge → src/bridge}/messages/resize.ts +0 -0
- /package/{bridge → src/bridge}/messages/sandboxToHost.ts +0 -0
- /package/{bridge → src/bridge}/messages/themeChanged.ts +0 -0
- /package/{bridge → src/bridge}/messages/updatePage.ts +0 -0
- /package/{bridge → src/bridge}/messages/updatePageResult.ts +0 -0
- /package/{bridge → src/bridge}/pages/page.ts +0 -0
- /package/{bridge → src/bridge}/pendingRequests.ts +0 -0
- /package/{bridge → src/bridge}/theme.ts +0 -0
- /package/{bridge → src/bridge}/users/user.ts +0 -0
- /package/{host.ts → src/host.ts} +0 -0
- /package/{init.ts → src/init.ts} +0 -0
- /package/{types.ts → src/types.ts} +0 -0
- /package/{users.ts → src/users.ts} +0 -0
- /package/{utils.ts → src/utils.ts} +0 -0
package/dist/react.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsxs as _jsxs, Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { useCallback, useEffect, useState, useSyncExternalStore, } from "react";
|
|
3
|
-
import { getCustomBlockHostState, getDataSourceQueryView, postCustomBlockResize, queryCustomBlockDataSource, setMockCustomBlockState, subscribeToCustomBlockHost, } from "./bridge/sandboxClient";
|
|
3
|
+
import { getCustomBlockHostState, getDataSourceQueryView, getMessageLog, postCustomBlockResize, queryCustomBlockDataSource, setMockCustomBlockState, subscribeToCustomBlockHost, subscribeToMessageLog, } from "./bridge/sandboxClient";
|
|
4
4
|
import { initCustomBlock, NotInIframeError, } from "./init";
|
|
5
5
|
const DEFAULT_DATA_SOURCE_QUERY_LIMIT = 20;
|
|
6
6
|
function useCustomBlockHost() {
|
|
@@ -80,6 +80,16 @@ export function NotionCustomBlock({ children, timeoutMs, fallback = null, errorF
|
|
|
80
80
|
useCustomBlockAutoResize({ enabled: autoResize });
|
|
81
81
|
const isStandalone = init.error instanceof NotInIframeError;
|
|
82
82
|
const host = useCustomBlockHost();
|
|
83
|
+
const [debugOpen, setDebugOpen] = useState(false);
|
|
84
|
+
useEffect(() => {
|
|
85
|
+
const onKeyDown = (e) => {
|
|
86
|
+
if (e.key === "\\") {
|
|
87
|
+
setDebugOpen(prev => !prev);
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
window.addEventListener("keydown", onKeyDown);
|
|
91
|
+
return () => window.removeEventListener("keydown", onKeyDown);
|
|
92
|
+
}, []);
|
|
83
93
|
useEffect(() => {
|
|
84
94
|
if (!isStandalone) {
|
|
85
95
|
return;
|
|
@@ -110,13 +120,32 @@ export function NotionCustomBlock({ children, timeoutMs, fallback = null, errorF
|
|
|
110
120
|
if (host.status !== "initialized") {
|
|
111
121
|
return _jsx(_Fragment, { children: fallback });
|
|
112
122
|
}
|
|
113
|
-
return (_jsxs(_Fragment, { children: [_jsx("div", { role: "status", style: STANDALONE_BANNER_STYLE, children: "Notion host not detected \u2014 running in standalone preview. SDK hooks return placeholder values until embedded in Notion." }), children] }));
|
|
123
|
+
return (_jsxs(_Fragment, { children: [_jsx("div", { role: "status", style: STANDALONE_BANNER_STYLE, children: "Notion host not detected \u2014 running in standalone preview. SDK hooks return placeholder values until embedded in Notion." }), debugOpen ? _jsx(DebugMessageLog, {}) : children] }));
|
|
114
124
|
}
|
|
115
125
|
if (!init.isLoaded) {
|
|
116
126
|
return _jsx(_Fragment, { children: fallback });
|
|
117
127
|
}
|
|
118
|
-
return _jsx(_Fragment, { children: children });
|
|
128
|
+
return _jsx(_Fragment, { children: debugOpen ? _jsx(DebugMessageLog, {}) : children });
|
|
119
129
|
}
|
|
130
|
+
function DebugMessageLog() {
|
|
131
|
+
const log = useSyncExternalStore(subscribeToMessageLog, getMessageLog);
|
|
132
|
+
const text = log
|
|
133
|
+
.map(entry => `[${entry.timestamp}] ${entry.direction}: ${JSON.stringify(entry.data)}`)
|
|
134
|
+
.join("\n");
|
|
135
|
+
return (_jsx("pre", { "data-testid": "debug-message-log", style: DEBUG_PRE_STYLE, children: text || "(no messages yet)" }));
|
|
136
|
+
}
|
|
137
|
+
const DEBUG_PRE_STYLE = {
|
|
138
|
+
margin: 0,
|
|
139
|
+
padding: "8px 12px",
|
|
140
|
+
fontSize: 12,
|
|
141
|
+
fontFamily: "ui-monospace, SFMono-Regular, Menlo, Consolas, monospace",
|
|
142
|
+
lineHeight: 1.5,
|
|
143
|
+
whiteSpace: "pre-wrap",
|
|
144
|
+
wordBreak: "break-all",
|
|
145
|
+
userSelect: "text",
|
|
146
|
+
background: "#1e1e1e",
|
|
147
|
+
color: "#d4d4d4",
|
|
148
|
+
};
|
|
120
149
|
const STANDALONE_BANNER_STYLE = {
|
|
121
150
|
padding: "8px 12px",
|
|
122
151
|
background: "#fff8e1",
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/users.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../users.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,aAAa,EACb,cAAc,EACd,eAAe,EACf,YAAY,EACZ,MAAM,SAAS,CAAA;AAEhB;;GAEG;AACH,eAAO,MAAM,KAAK;IACjB;;OAEG;iBACU,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IAItD;;OAEG;gBACS,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;CAGjD,CAAA"}
|
|
1
|
+
{"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../src/users.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,aAAa,EACb,cAAc,EACd,eAAe,EACf,YAAY,EACZ,MAAM,SAAS,CAAA;AAEhB;;GAEG;AACH,eAAO,MAAM,KAAK;IACjB;;OAEG;iBACU,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IAItD;;OAEG;gBACS,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;CAGjD,CAAA"}
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAI/C"}
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAI/C"}
|
package/docs/lifecycle.md
CHANGED
|
@@ -90,3 +90,35 @@ function App() {
|
|
|
90
90
|
return <div>…</div>;
|
|
91
91
|
}
|
|
92
92
|
```
|
|
93
|
+
|
|
94
|
+
## Debug console
|
|
95
|
+
|
|
96
|
+
Press `\` while focused in a custom block to toggle a debug overlay that replaces the block's children with a `<pre>` log of every `postMessage` sent and received over the bridge. Each line is formatted as:
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
[ISO timestamp] sent/received: {"type":"ready", …}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
The log is intentionally plain — no filtering or decoration — so it can be copied and pasted directly to a local coding agent for debugging.
|
|
103
|
+
|
|
104
|
+
### `getMessageLog()`
|
|
105
|
+
|
|
106
|
+
```ts
|
|
107
|
+
function getMessageLog(): readonly MessageLogEntry[];
|
|
108
|
+
|
|
109
|
+
type MessageLogEntry = {
|
|
110
|
+
timestamp: string;
|
|
111
|
+
direction: "sent" | "received";
|
|
112
|
+
data: unknown;
|
|
113
|
+
};
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Returns the full in-memory log. Entries accumulate for the lifetime of the page.
|
|
117
|
+
|
|
118
|
+
### `subscribeToMessageLog(listener)`
|
|
119
|
+
|
|
120
|
+
```ts
|
|
121
|
+
function subscribeToMessageLog(listener: () => void): () => void;
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Subscribe to new log entries. Compatible with `useSyncExternalStore` for custom debug UIs.
|
package/package.json
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ncblock",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.7",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
8
8
|
"exports": {
|
|
9
9
|
".": {
|
|
10
|
-
"import": "
|
|
11
|
-
"types": "
|
|
10
|
+
"import": "././dist/index.js",
|
|
11
|
+
"types": "././dist/index.d.ts"
|
|
12
12
|
},
|
|
13
13
|
"./host": {
|
|
14
|
-
"import": "
|
|
15
|
-
"types": "
|
|
14
|
+
"import": "././dist/host.js",
|
|
15
|
+
"types": "././dist/host.d.ts"
|
|
16
16
|
},
|
|
17
17
|
"./vite": {
|
|
18
18
|
"import": "./vite-plugin/index.js",
|
|
@@ -23,17 +23,10 @@
|
|
|
23
23
|
"test": "vitest run --environment jsdom"
|
|
24
24
|
},
|
|
25
25
|
"files": [
|
|
26
|
-
"
|
|
27
|
-
"host.ts",
|
|
26
|
+
"src",
|
|
28
27
|
"HOST.md",
|
|
29
28
|
"docs",
|
|
30
|
-
"react.tsx",
|
|
31
|
-
"init.ts",
|
|
32
|
-
"users.ts",
|
|
33
|
-
"types.ts",
|
|
34
|
-
"utils.ts",
|
|
35
29
|
"vite-plugin",
|
|
36
|
-
"bridge",
|
|
37
30
|
"dist"
|
|
38
31
|
],
|
|
39
32
|
"peerDependencies": {
|
|
@@ -50,12 +50,24 @@ import type { NotionUser } from "./users/user"
|
|
|
50
50
|
*/
|
|
51
51
|
export const CUSTOM_BLOCK_BRIDGE_PROTOCOL_VERSION = 1
|
|
52
52
|
|
|
53
|
+
/**
|
|
54
|
+
* A single entry in the bridge message log. Kept intentionally plain so the log
|
|
55
|
+
* is copy-pasteable to a local coding agent without needing extra context.
|
|
56
|
+
*/
|
|
57
|
+
export type MessageLogEntry = {
|
|
58
|
+
timestamp: string
|
|
59
|
+
direction: "sent" | "received"
|
|
60
|
+
data: unknown
|
|
61
|
+
}
|
|
62
|
+
|
|
53
63
|
export class SandboxBridge {
|
|
54
64
|
private hostState: CustomBlockHostState = {
|
|
55
65
|
status: "uninitialized",
|
|
56
66
|
theme: "light",
|
|
57
67
|
}
|
|
58
68
|
private listeners = new Set<() => void>()
|
|
69
|
+
private messageLog: MessageLogEntry[] = []
|
|
70
|
+
private messageLogListeners = new Set<() => void>()
|
|
59
71
|
private nextRequestId = 1
|
|
60
72
|
private readonly pendingCreatePage = new PendingRequests<CreatePageResult>(
|
|
61
73
|
"custom-block-create-page",
|
|
@@ -87,6 +99,31 @@ export class SandboxBridge {
|
|
|
87
99
|
}
|
|
88
100
|
}
|
|
89
101
|
|
|
102
|
+
private static MAX_LOG_ENTRIES = 100
|
|
103
|
+
|
|
104
|
+
private logMessage(direction: "sent" | "received", data: unknown) {
|
|
105
|
+
if (this.messageLog.length >= SandboxBridge.MAX_LOG_ENTRIES) {
|
|
106
|
+
this.messageLog.shift()
|
|
107
|
+
}
|
|
108
|
+
this.messageLog.push({
|
|
109
|
+
timestamp: new Date().toISOString(),
|
|
110
|
+
direction,
|
|
111
|
+
data,
|
|
112
|
+
})
|
|
113
|
+
for (const listener of this.messageLogListeners) {
|
|
114
|
+
listener()
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
getMessageLog(): readonly MessageLogEntry[] {
|
|
119
|
+
return this.messageLog
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
subscribeToMessageLog(listener: () => void) {
|
|
123
|
+
this.messageLogListeners.add(listener)
|
|
124
|
+
return () => this.messageLogListeners.delete(listener)
|
|
125
|
+
}
|
|
126
|
+
|
|
90
127
|
awaitInit(signal?: AbortSignal): Promise<InitMessage> {
|
|
91
128
|
if (!signal) {
|
|
92
129
|
return this.initMessage
|
|
@@ -121,8 +158,13 @@ export class SandboxBridge {
|
|
|
121
158
|
bridgeProtocolVersion: CUSTOM_BLOCK_BRIDGE_PROTOCOL_VERSION,
|
|
122
159
|
manifest,
|
|
123
160
|
}
|
|
124
|
-
|
|
125
|
-
|
|
161
|
+
this.postToHost(readyMessage)
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
private postToHost(message: unknown) {
|
|
165
|
+
console.debug("[notion-custom-sdk] outbound postMessage", message)
|
|
166
|
+
this.logMessage("sent", message)
|
|
167
|
+
window.parent.postMessage(message, "*")
|
|
126
168
|
}
|
|
127
169
|
|
|
128
170
|
private notify = () => {
|
|
@@ -139,6 +181,7 @@ export class SandboxBridge {
|
|
|
139
181
|
if (event.source !== window.parent) {
|
|
140
182
|
return
|
|
141
183
|
}
|
|
184
|
+
this.logMessage("received", event.data)
|
|
142
185
|
|
|
143
186
|
const parsed = v.safeParse(hostToSandboxMessageSchema, event.data)
|
|
144
187
|
if (!parsed.success) {
|
|
@@ -159,8 +202,7 @@ export class SandboxBridge {
|
|
|
159
202
|
type: "invalidHostMessage",
|
|
160
203
|
reason: formatInvalidHostReason(incomingType, parsed.issues),
|
|
161
204
|
}
|
|
162
|
-
|
|
163
|
-
window.parent.postMessage(nack, "*")
|
|
205
|
+
this.postToHost(nack)
|
|
164
206
|
}
|
|
165
207
|
return
|
|
166
208
|
}
|
|
@@ -409,8 +451,7 @@ export class SandboxBridge {
|
|
|
409
451
|
key,
|
|
410
452
|
limit,
|
|
411
453
|
}
|
|
412
|
-
|
|
413
|
-
window.parent.postMessage(outbound, "*")
|
|
454
|
+
this.postToHost(outbound)
|
|
414
455
|
}
|
|
415
456
|
|
|
416
457
|
postResize(height: number) {
|
|
@@ -423,8 +464,7 @@ export class SandboxBridge {
|
|
|
423
464
|
type: "resize",
|
|
424
465
|
height: safeHeight,
|
|
425
466
|
}
|
|
426
|
-
|
|
427
|
-
window.parent.postMessage(outbound, "*")
|
|
467
|
+
this.postToHost(outbound)
|
|
428
468
|
}
|
|
429
469
|
|
|
430
470
|
createPage(input: CreatePageInput): Promise<CreatePageResult> {
|
|
@@ -459,8 +499,7 @@ export class SandboxBridge {
|
|
|
459
499
|
if (input.position !== undefined) {
|
|
460
500
|
outbound.position = input.position
|
|
461
501
|
}
|
|
462
|
-
|
|
463
|
-
window.parent.postMessage(outbound, "*")
|
|
502
|
+
this.postToHost(outbound)
|
|
464
503
|
})
|
|
465
504
|
}
|
|
466
505
|
|
|
@@ -472,8 +511,7 @@ export class SandboxBridge {
|
|
|
472
511
|
requestId,
|
|
473
512
|
pageId,
|
|
474
513
|
}
|
|
475
|
-
|
|
476
|
-
window.parent.postMessage(outbound, "*")
|
|
514
|
+
this.postToHost(outbound)
|
|
477
515
|
})
|
|
478
516
|
}
|
|
479
517
|
|
|
@@ -485,8 +523,7 @@ export class SandboxBridge {
|
|
|
485
523
|
requestId,
|
|
486
524
|
userId,
|
|
487
525
|
}
|
|
488
|
-
|
|
489
|
-
window.parent.postMessage(outbound, "*")
|
|
526
|
+
this.postToHost(outbound)
|
|
490
527
|
})
|
|
491
528
|
}
|
|
492
529
|
|
|
@@ -499,8 +536,7 @@ export class SandboxBridge {
|
|
|
499
536
|
startCursor: input.startCursor,
|
|
500
537
|
pageSize: input.pageSize,
|
|
501
538
|
}
|
|
502
|
-
|
|
503
|
-
window.parent.postMessage(outbound, "*")
|
|
539
|
+
this.postToHost(outbound)
|
|
504
540
|
})
|
|
505
541
|
}
|
|
506
542
|
|
|
@@ -539,8 +575,7 @@ export class SandboxBridge {
|
|
|
539
575
|
if (input.archived !== undefined) {
|
|
540
576
|
outbound.archived = input.archived
|
|
541
577
|
}
|
|
542
|
-
|
|
543
|
-
window.parent.postMessage(outbound, "*")
|
|
578
|
+
this.postToHost(outbound)
|
|
544
579
|
})
|
|
545
580
|
}
|
|
546
581
|
|
|
@@ -17,7 +17,9 @@ import {
|
|
|
17
17
|
} from "./hostState"
|
|
18
18
|
import type { CustomBlockManifest } from "./manifest"
|
|
19
19
|
import type { InitMessage } from "./messages/init"
|
|
20
|
-
import { SandboxBridge } from "./SandboxBridge"
|
|
20
|
+
import { type MessageLogEntry, SandboxBridge } from "./SandboxBridge"
|
|
21
|
+
|
|
22
|
+
export type { MessageLogEntry }
|
|
21
23
|
|
|
22
24
|
const bridge = new SandboxBridge()
|
|
23
25
|
|
|
@@ -57,6 +59,14 @@ export function postCustomBlockResize(height: number) {
|
|
|
57
59
|
bridge.postResize(height)
|
|
58
60
|
}
|
|
59
61
|
|
|
62
|
+
export function getMessageLog(): readonly MessageLogEntry[] {
|
|
63
|
+
return bridge.getMessageLog()
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function subscribeToMessageLog(listener: () => void) {
|
|
67
|
+
return bridge.subscribeToMessageLog(listener)
|
|
68
|
+
}
|
|
69
|
+
|
|
60
70
|
export function getUser(userId: NotionUserId): Promise<GetUserResult> {
|
|
61
71
|
return bridge.getUser(userId)
|
|
62
72
|
}
|
|
@@ -63,7 +63,12 @@ export type {
|
|
|
63
63
|
NotionPagePropertyValue,
|
|
64
64
|
NotionPagePropertyWriteMap,
|
|
65
65
|
} from "./bridge/pages/page"
|
|
66
|
-
export {
|
|
66
|
+
export type { MessageLogEntry } from "./bridge/sandboxClient"
|
|
67
|
+
export {
|
|
68
|
+
getMessageLog,
|
|
69
|
+
pages,
|
|
70
|
+
subscribeToMessageLog,
|
|
71
|
+
} from "./bridge/sandboxClient"
|
|
67
72
|
export type { NotionTheme } from "./bridge/theme"
|
|
68
73
|
export {
|
|
69
74
|
type CustomBlockInitial,
|
|
@@ -11,10 +11,12 @@ import type { CustomBlockHostState } from "./bridge/hostState"
|
|
|
11
11
|
import {
|
|
12
12
|
getCustomBlockHostState,
|
|
13
13
|
getDataSourceQueryView,
|
|
14
|
+
getMessageLog,
|
|
14
15
|
postCustomBlockResize,
|
|
15
16
|
queryCustomBlockDataSource,
|
|
16
17
|
setMockCustomBlockState,
|
|
17
18
|
subscribeToCustomBlockHost,
|
|
19
|
+
subscribeToMessageLog,
|
|
18
20
|
} from "./bridge/sandboxClient"
|
|
19
21
|
import type { NotionTheme } from "./bridge/theme"
|
|
20
22
|
import {
|
|
@@ -168,6 +170,17 @@ export function NotionCustomBlock({
|
|
|
168
170
|
useCustomBlockAutoResize({ enabled: autoResize })
|
|
169
171
|
const isStandalone = init.error instanceof NotInIframeError
|
|
170
172
|
const host = useCustomBlockHost()
|
|
173
|
+
const [debugOpen, setDebugOpen] = useState(false)
|
|
174
|
+
|
|
175
|
+
useEffect(() => {
|
|
176
|
+
const onKeyDown = (e: KeyboardEvent) => {
|
|
177
|
+
if (e.key === "\\") {
|
|
178
|
+
setDebugOpen(prev => !prev)
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
window.addEventListener("keydown", onKeyDown)
|
|
182
|
+
return () => window.removeEventListener("keydown", onKeyDown)
|
|
183
|
+
}, [])
|
|
171
184
|
|
|
172
185
|
useEffect(() => {
|
|
173
186
|
if (!isStandalone) {
|
|
@@ -212,14 +225,42 @@ export function NotionCustomBlock({
|
|
|
212
225
|
Notion host not detected — running in standalone preview. SDK hooks
|
|
213
226
|
return placeholder values until embedded in Notion.
|
|
214
227
|
</div>
|
|
215
|
-
{children}
|
|
228
|
+
{debugOpen ? <DebugMessageLog /> : children}
|
|
216
229
|
</>
|
|
217
230
|
)
|
|
218
231
|
}
|
|
219
232
|
if (!init.isLoaded) {
|
|
220
233
|
return <>{fallback}</>
|
|
221
234
|
}
|
|
222
|
-
return <>{children}</>
|
|
235
|
+
return <>{debugOpen ? <DebugMessageLog /> : children}</>
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
function DebugMessageLog() {
|
|
239
|
+
const log = useSyncExternalStore(subscribeToMessageLog, getMessageLog)
|
|
240
|
+
const text = log
|
|
241
|
+
.map(
|
|
242
|
+
entry =>
|
|
243
|
+
`[${entry.timestamp}] ${entry.direction}: ${JSON.stringify(entry.data)}`,
|
|
244
|
+
)
|
|
245
|
+
.join("\n")
|
|
246
|
+
return (
|
|
247
|
+
<pre data-testid="debug-message-log" style={DEBUG_PRE_STYLE}>
|
|
248
|
+
{text || "(no messages yet)"}
|
|
249
|
+
</pre>
|
|
250
|
+
)
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
const DEBUG_PRE_STYLE = {
|
|
254
|
+
margin: 0,
|
|
255
|
+
padding: "8px 12px",
|
|
256
|
+
fontSize: 12,
|
|
257
|
+
fontFamily: "ui-monospace, SFMono-Regular, Menlo, Consolas, monospace",
|
|
258
|
+
lineHeight: 1.5,
|
|
259
|
+
whiteSpace: "pre-wrap" as const,
|
|
260
|
+
wordBreak: "break-all" as const,
|
|
261
|
+
userSelect: "text" as const,
|
|
262
|
+
background: "#1e1e1e",
|
|
263
|
+
color: "#d4d4d4",
|
|
223
264
|
}
|
|
224
265
|
|
|
225
266
|
const STANDALONE_BANNER_STYLE = {
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/{host.ts → src/host.ts}
RENAMED
|
File without changes
|
/package/{init.ts → src/init.ts}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|