@notionhq/custom-blocks 0.0.58
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/HOST.md +171 -0
- package/README.md +57 -0
- package/bin/cli/attach.js +180 -0
- package/bin/cli/cli.js +248 -0
- package/bin/cli/create.js +106 -0
- package/bin/cli/datasources.js +255 -0
- package/bin/cli/deploy.js +109 -0
- package/bin/cli/ids.js +13 -0
- package/bin/cli/ntn.js +95 -0
- package/bin/cli/pullData.js +76 -0
- package/bin/cli/pullManifest.js +158 -0
- package/bin/cli/target.js +95 -0
- package/bin/src/bridge/dataSources/propertySchema.js +148 -0
- package/bin/src/bridge/manifest.js +40 -0
- package/dist/autoResize.d.ts +4 -0
- package/dist/autoResize.d.ts.map +1 -0
- package/dist/autoResize.js +71 -0
- package/dist/bridge/SandboxBridge.d.ts +92 -0
- package/dist/bridge/SandboxBridge.d.ts.map +1 -0
- package/dist/bridge/SandboxBridge.js +718 -0
- package/dist/bridge/dataSources/dataSource.d.ts +732 -0
- package/dist/bridge/dataSources/dataSource.d.ts.map +1 -0
- package/dist/bridge/dataSources/dataSource.js +37 -0
- package/dist/bridge/dataSources/dataSourcePage.d.ts +118 -0
- package/dist/bridge/dataSources/dataSourcePage.d.ts.map +1 -0
- package/dist/bridge/dataSources/dataSourcePage.js +14 -0
- package/dist/bridge/dataSources/dataSourceValue.d.ts +67 -0
- package/dist/bridge/dataSources/dataSourceValue.d.ts.map +1 -0
- package/dist/bridge/dataSources/dataSourceValue.js +14 -0
- package/dist/bridge/dataSources/dateValue.d.ts +158 -0
- package/dist/bridge/dataSources/dateValue.d.ts.map +1 -0
- package/dist/bridge/dataSources/dateValue.js +59 -0
- package/dist/bridge/dataSources/errors.d.ts +6 -0
- package/dist/bridge/dataSources/errors.d.ts.map +1 -0
- package/dist/bridge/dataSources/errors.js +4 -0
- package/dist/bridge/dataSources/propertySchema.d.ts +191 -0
- package/dist/bridge/dataSources/propertySchema.d.ts.map +1 -0
- package/dist/bridge/dataSources/propertySchema.js +148 -0
- package/dist/bridge/dataSources/recordPointer.d.ts +10 -0
- package/dist/bridge/dataSources/recordPointer.d.ts.map +1 -0
- package/dist/bridge/dataSources/recordPointer.js +8 -0
- package/dist/bridge/dataSources/resolve.d.ts +22 -0
- package/dist/bridge/dataSources/resolve.d.ts.map +1 -0
- package/dist/bridge/dataSources/resolve.js +65 -0
- package/dist/bridge/dataSources/resolveProperty.d.ts +41 -0
- package/dist/bridge/dataSources/resolveProperty.d.ts.map +1 -0
- package/dist/bridge/dataSources/resolveProperty.js +73 -0
- package/dist/bridge/errors.d.ts +12 -0
- package/dist/bridge/errors.d.ts.map +1 -0
- package/dist/bridge/errors.js +6 -0
- package/dist/bridge/hostState.d.ts +65 -0
- package/dist/bridge/hostState.d.ts.map +1 -0
- package/dist/bridge/hostState.js +65 -0
- package/dist/bridge/ids.d.ts +39 -0
- package/dist/bridge/ids.d.ts.map +1 -0
- package/dist/bridge/ids.js +5 -0
- package/dist/bridge/incomingType.d.ts +10 -0
- package/dist/bridge/incomingType.d.ts.map +1 -0
- package/dist/bridge/incomingType.js +17 -0
- package/dist/bridge/loadManifest.d.ts +25 -0
- package/dist/bridge/loadManifest.d.ts.map +1 -0
- package/dist/bridge/loadManifest.js +68 -0
- package/dist/bridge/manifest.d.ts +66 -0
- package/dist/bridge/manifest.d.ts.map +1 -0
- package/dist/bridge/manifest.js +40 -0
- package/dist/bridge/messages/createPage.d.ts +225 -0
- package/dist/bridge/messages/createPage.d.ts.map +1 -0
- package/dist/bridge/messages/createPage.js +46 -0
- package/dist/bridge/messages/createPageResult.d.ts +211 -0
- package/dist/bridge/messages/createPageResult.d.ts.map +1 -0
- package/dist/bridge/messages/createPageResult.js +28 -0
- package/dist/bridge/messages/currentUserChanged.d.ts +19 -0
- package/dist/bridge/messages/currentUserChanged.d.ts.map +1 -0
- package/dist/bridge/messages/currentUserChanged.js +9 -0
- package/dist/bridge/messages/dataSourcesChanged.d.ts +158 -0
- package/dist/bridge/messages/dataSourcesChanged.d.ts.map +1 -0
- package/dist/bridge/messages/dataSourcesChanged.js +13 -0
- package/dist/bridge/messages/getPage.d.ts +216 -0
- package/dist/bridge/messages/getPage.d.ts.map +1 -0
- package/dist/bridge/messages/getPage.js +33 -0
- package/dist/bridge/messages/getUser.d.ts +45 -0
- package/dist/bridge/messages/getUser.d.ts.map +1 -0
- package/dist/bridge/messages/getUser.js +32 -0
- package/dist/bridge/messages/hostToSandbox.d.ts +1089 -0
- package/dist/bridge/messages/hostToSandbox.d.ts.map +1 -0
- package/dist/bridge/messages/hostToSandbox.js +32 -0
- package/dist/bridge/messages/init.d.ts +209 -0
- package/dist/bridge/messages/init.d.ts.map +1 -0
- package/dist/bridge/messages/init.js +47 -0
- package/dist/bridge/messages/invalidHostMessage.d.ts +15 -0
- package/dist/bridge/messages/invalidHostMessage.d.ts.map +1 -0
- package/dist/bridge/messages/invalidHostMessage.js +13 -0
- package/dist/bridge/messages/invalidSandboxMessage.d.ts +15 -0
- package/dist/bridge/messages/invalidSandboxMessage.d.ts.map +1 -0
- package/dist/bridge/messages/invalidSandboxMessage.js +13 -0
- package/dist/bridge/messages/listUsers.d.ts +53 -0
- package/dist/bridge/messages/listUsers.d.ts.map +1 -0
- package/dist/bridge/messages/listUsers.js +33 -0
- package/dist/bridge/messages/pageChanged.d.ts +12 -0
- package/dist/bridge/messages/pageChanged.d.ts.map +1 -0
- package/dist/bridge/messages/pageChanged.js +9 -0
- package/dist/bridge/messages/parentChanged.d.ts +22 -0
- package/dist/bridge/messages/parentChanged.d.ts.map +1 -0
- package/dist/bridge/messages/parentChanged.js +9 -0
- package/dist/bridge/messages/queryDataSource.d.ts +20 -0
- package/dist/bridge/messages/queryDataSource.d.ts.map +1 -0
- package/dist/bridge/messages/queryDataSource.js +19 -0
- package/dist/bridge/messages/queryDataSourceResult.d.ts +90 -0
- package/dist/bridge/messages/queryDataSourceResult.d.ts.map +1 -0
- package/dist/bridge/messages/queryDataSourceResult.js +21 -0
- package/dist/bridge/messages/ready.d.ts +45 -0
- package/dist/bridge/messages/ready.d.ts.map +1 -0
- package/dist/bridge/messages/ready.js +37 -0
- package/dist/bridge/messages/resize.d.ts +12 -0
- package/dist/bridge/messages/resize.d.ts.map +1 -0
- package/dist/bridge/messages/resize.js +10 -0
- package/dist/bridge/messages/sandboxToHost.d.ts +410 -0
- package/dist/bridge/messages/sandboxToHost.d.ts.map +1 -0
- package/dist/bridge/messages/sandboxToHost.js +25 -0
- package/dist/bridge/messages/themeChanged.d.ts +11 -0
- package/dist/bridge/messages/themeChanged.d.ts.map +1 -0
- package/dist/bridge/messages/themeChanged.js +10 -0
- package/dist/bridge/messages/updatePage.d.ts +171 -0
- package/dist/bridge/messages/updatePage.d.ts.map +1 -0
- package/dist/bridge/messages/updatePage.js +15 -0
- package/dist/bridge/messages/updatePageResult.d.ts +210 -0
- package/dist/bridge/messages/updatePageResult.d.ts.map +1 -0
- package/dist/bridge/messages/updatePageResult.js +27 -0
- package/dist/bridge/pages/page.d.ts +600 -0
- package/dist/bridge/pages/page.d.ts.map +1 -0
- package/dist/bridge/pages/page.js +217 -0
- package/dist/bridge/parent.d.ts +25 -0
- package/dist/bridge/parent.d.ts.map +1 -0
- package/dist/bridge/parent.js +11 -0
- package/dist/bridge/pendingRequests.d.ts +14 -0
- package/dist/bridge/pendingRequests.d.ts.map +1 -0
- package/dist/bridge/pendingRequests.js +27 -0
- package/dist/bridge/sandboxClient.d.ts +63 -0
- package/dist/bridge/sandboxClient.d.ts.map +1 -0
- package/dist/bridge/sandboxClient.js +92 -0
- package/dist/bridge/theme.d.ts +4 -0
- package/dist/bridge/theme.d.ts.map +1 -0
- package/dist/bridge/theme.js +2 -0
- package/dist/bridge/users/user.d.ts +36 -0
- package/dist/bridge/users/user.d.ts.map +1 -0
- package/dist/bridge/users/user.js +19 -0
- package/dist/customBlock.d.ts +36 -0
- package/dist/customBlock.d.ts.map +1 -0
- package/dist/customBlock.js +65 -0
- package/dist/host/createCustomBlockHost.d.ts +34 -0
- package/dist/host/createCustomBlockHost.d.ts.map +1 -0
- package/dist/host/createCustomBlockHost.js +278 -0
- package/dist/host/lifecycle/initErrors.d.ts +10 -0
- package/dist/host/lifecycle/initErrors.d.ts.map +1 -0
- package/dist/host/lifecycle/initErrors.js +123 -0
- package/dist/host/lifecycle/ready.d.ts +8 -0
- package/dist/host/lifecycle/ready.d.ts.map +1 -0
- package/dist/host/lifecycle/ready.js +24 -0
- package/dist/host/lifecycle/types.d.ts +24 -0
- package/dist/host/lifecycle/types.d.ts.map +1 -0
- package/dist/host/lifecycle/types.js +1 -0
- package/dist/host/messages/invalidSandboxMessage.d.ts +7 -0
- package/dist/host/messages/invalidSandboxMessage.d.ts.map +1 -0
- package/dist/host/messages/invalidSandboxMessage.js +24 -0
- package/dist/host/messages/types.d.ts +60 -0
- package/dist/host/messages/types.d.ts.map +1 -0
- package/dist/host/messages/types.js +1 -0
- package/dist/host/queries/querySubscriptions.d.ts +20 -0
- package/dist/host/queries/querySubscriptions.d.ts.map +1 -0
- package/dist/host/queries/querySubscriptions.js +29 -0
- package/dist/host/queries/types.d.ts +9 -0
- package/dist/host/queries/types.d.ts.map +1 -0
- package/dist/host/queries/types.js +1 -0
- package/dist/host.d.ts +73 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +42 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/init.d.ts +53 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +87 -0
- package/dist/react/DebugMessageLog.d.ts +2 -0
- package/dist/react/DebugMessageLog.d.ts.map +1 -0
- package/dist/react/DebugMessageLog.js +22 -0
- package/dist/react/NotionCustomBlock.css +110 -0
- package/dist/react/NotionCustomBlock.d.ts +50 -0
- package/dist/react/NotionCustomBlock.d.ts.map +1 -0
- package/dist/react/NotionCustomBlock.js +81 -0
- package/dist/react/index.d.ts +14 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +13 -0
- package/dist/react/standalonePreview.d.ts +2 -0
- package/dist/react/standalonePreview.d.ts.map +1 -0
- package/dist/react/standalonePreview.js +26 -0
- package/dist/react/useCustomBlockAutoResize.d.ts +30 -0
- package/dist/react/useCustomBlockAutoResize.d.ts.map +1 -0
- package/dist/react/useCustomBlockAutoResize.js +35 -0
- package/dist/react/useCustomBlockInit.d.ts +43 -0
- package/dist/react/useCustomBlockInit.d.ts.map +1 -0
- package/dist/react/useCustomBlockInit.js +60 -0
- package/dist/react/useDataSource.d.ts +13 -0
- package/dist/react/useDataSource.d.ts.map +1 -0
- package/dist/react/useDataSource.js +37 -0
- package/dist/react/useHostState.d.ts +2 -0
- package/dist/react/useHostState.d.ts.map +1 -0
- package/dist/react/useHostState.js +5 -0
- package/dist/react/useRuntimeState.d.ts +66 -0
- package/dist/react/useRuntimeState.d.ts.map +1 -0
- package/dist/react/useRuntimeState.js +73 -0
- package/dist/types.d.ts +154 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +1 -0
- package/dist/utils.d.ts +9 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +10 -0
- package/dist/version.d.ts +9 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +7 -0
- package/docs/block-location.md +83 -0
- package/docs/data-sources.md +186 -0
- package/docs/lifecycle.md +172 -0
- package/docs/manifest.md +42 -0
- package/docs/pages.md +143 -0
- package/docs/users.md +92 -0
- package/package.json +69 -0
- package/src/autoResize.ts +84 -0
- package/src/bridge/SandboxBridge.ts +921 -0
- package/src/bridge/dataSources/dataSource.ts +63 -0
- package/src/bridge/dataSources/dataSourcePage.ts +71 -0
- package/src/bridge/dataSources/dataSourceValue.ts +19 -0
- package/src/bridge/dataSources/dateValue.ts +96 -0
- package/src/bridge/dataSources/errors.ts +14 -0
- package/src/bridge/dataSources/propertySchema.ts +186 -0
- package/src/bridge/dataSources/recordPointer.ts +13 -0
- package/src/bridge/dataSources/resolve.ts +99 -0
- package/src/bridge/dataSources/resolveProperty.ts +130 -0
- package/src/bridge/errors.ts +13 -0
- package/src/bridge/hostState.ts +154 -0
- package/src/bridge/ids.ts +58 -0
- package/src/bridge/incomingType.ts +19 -0
- package/src/bridge/loadManifest.ts +89 -0
- package/src/bridge/manifest.ts +53 -0
- package/src/bridge/messages/createPage.ts +67 -0
- package/src/bridge/messages/createPageResult.ts +52 -0
- package/src/bridge/messages/currentUserChanged.ts +14 -0
- package/src/bridge/messages/dataSourcesChanged.ts +18 -0
- package/src/bridge/messages/getPage.ts +52 -0
- package/src/bridge/messages/getUser.ts +48 -0
- package/src/bridge/messages/hostToSandbox.ts +37 -0
- package/src/bridge/messages/init.ts +81 -0
- package/src/bridge/messages/invalidHostMessage.ts +16 -0
- package/src/bridge/messages/invalidSandboxMessage.ts +18 -0
- package/src/bridge/messages/listUsers.ts +49 -0
- package/src/bridge/messages/pageChanged.ts +12 -0
- package/src/bridge/messages/parentChanged.ts +14 -0
- package/src/bridge/messages/queryDataSource.ts +24 -0
- package/src/bridge/messages/queryDataSourceResult.ts +38 -0
- package/src/bridge/messages/ready.ts +41 -0
- package/src/bridge/messages/resize.ts +13 -0
- package/src/bridge/messages/sandboxToHost.ts +30 -0
- package/src/bridge/messages/themeChanged.ts +15 -0
- package/src/bridge/messages/updatePage.ts +22 -0
- package/src/bridge/messages/updatePageResult.ts +49 -0
- package/src/bridge/pages/page.ts +281 -0
- package/src/bridge/parent.ts +27 -0
- package/src/bridge/pendingRequests.ts +28 -0
- package/src/bridge/sandboxClient.ts +137 -0
- package/src/bridge/theme.ts +5 -0
- package/src/bridge/users/user.ts +31 -0
- package/src/css.d.ts +1 -0
- package/src/customBlock.ts +102 -0
- package/src/host/createCustomBlockHost.ts +392 -0
- package/src/host/lifecycle/initErrors.ts +132 -0
- package/src/host/lifecycle/ready.ts +36 -0
- package/src/host/lifecycle/types.ts +28 -0
- package/src/host/messages/invalidSandboxMessage.ts +38 -0
- package/src/host/messages/types.ts +67 -0
- package/src/host/queries/querySubscriptions.ts +52 -0
- package/src/host/queries/types.ts +16 -0
- package/src/host.ts +167 -0
- package/src/index.ts +115 -0
- package/src/init.ts +143 -0
- package/src/react/DebugMessageLog.tsx +30 -0
- package/src/react/NotionCustomBlock.css +110 -0
- package/src/react/NotionCustomBlock.tsx +151 -0
- package/src/react/index.ts +28 -0
- package/src/react/standalonePreview.ts +28 -0
- package/src/react/useCustomBlockAutoResize.ts +46 -0
- package/src/react/useCustomBlockInit.ts +91 -0
- package/src/react/useDataSource.ts +47 -0
- package/src/react/useHostState.ts +9 -0
- package/src/react/useRuntimeState.ts +85 -0
- package/src/types.ts +175 -0
- package/src/utils.ts +13 -0
- package/src/version.ts +8 -0
- package/vite-plugin/index.d.ts +46 -0
- package/vite-plugin/index.js +115 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { resolve as resolvePath } from "node:path";
|
|
3
|
+
import { NOTION_BUILTIN_PROPERTY_IDS } from "../src/bridge/dataSources/propertySchema.js";
|
|
4
|
+
import { extractId, formatUuid } from "./ids.js";
|
|
5
|
+
import { loginHintCommand, ntnApi } from "./ntn.js";
|
|
6
|
+
import { mergeTarget, readTarget, writeTarget } from "./target.js";
|
|
7
|
+
const MANIFEST_FILENAME = "custom_blocks.json";
|
|
8
|
+
const BUILTIN_TYPES = new Set(NOTION_BUILTIN_PROPERTY_IDS);
|
|
9
|
+
// ── Helpers ───────────────────────────────────────────────────────
|
|
10
|
+
function deriveKey(name) {
|
|
11
|
+
return name
|
|
12
|
+
.toLowerCase()
|
|
13
|
+
.replace(/\s+/g, "_")
|
|
14
|
+
.replace(/[^a-z0-9_]/g, "");
|
|
15
|
+
}
|
|
16
|
+
function plainText(items) {
|
|
17
|
+
if (!items?.length) {
|
|
18
|
+
return "Data source";
|
|
19
|
+
}
|
|
20
|
+
return items.map(t => t.plain_text ?? "").join("") || "Data source";
|
|
21
|
+
}
|
|
22
|
+
function is404(error) {
|
|
23
|
+
return error instanceof Error && error.message.includes("404");
|
|
24
|
+
}
|
|
25
|
+
// ── Schema transform ─────────────────────────────────────────────
|
|
26
|
+
function transformProperties(props) {
|
|
27
|
+
const out = {};
|
|
28
|
+
for (const prop of Object.values(props)) {
|
|
29
|
+
if (BUILTIN_TYPES.has(prop.type)) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
const key = deriveKey(prop.name);
|
|
33
|
+
if (key) {
|
|
34
|
+
out[key] = { name: prop.name, type: prop.type };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return out;
|
|
38
|
+
}
|
|
39
|
+
function fetchDataSource(dataSourceId, quiet) {
|
|
40
|
+
const id = formatUuid(dataSourceId);
|
|
41
|
+
if (!quiet) {
|
|
42
|
+
console.log(` Fetching data source ${id}…`);
|
|
43
|
+
}
|
|
44
|
+
const ds = ntnApi(`/v1/data_sources/${id}`);
|
|
45
|
+
if (!ds.properties || Object.keys(ds.properties).length === 0) {
|
|
46
|
+
throw new Error(`Data source ${id} has no properties.`);
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
dataSourceId: id,
|
|
50
|
+
name: plainText(ds.title),
|
|
51
|
+
properties: transformProperties(ds.properties),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Pull schema from a database or data source ID. Tries `/v1/databases/<id>`
|
|
56
|
+
* first (most common entry point); falls back to `/v1/data_sources/<id>` if
|
|
57
|
+
* that 404s. ID-type classification (block / view / database / wrong-workspace)
|
|
58
|
+
* happens upstream in `init.ts` — by the time we get here, the ID is expected
|
|
59
|
+
* to point at a database or data source.
|
|
60
|
+
*/
|
|
61
|
+
function fetchSchema(id, quiet) {
|
|
62
|
+
const uuid = formatUuid(id);
|
|
63
|
+
let dbError;
|
|
64
|
+
try {
|
|
65
|
+
if (!quiet) {
|
|
66
|
+
console.log(` Fetching database ${uuid}…`);
|
|
67
|
+
}
|
|
68
|
+
const db = ntnApi(`/v1/databases/${uuid}`);
|
|
69
|
+
if (db.object === "database") {
|
|
70
|
+
if (!db.data_sources?.length) {
|
|
71
|
+
throw new Error(`Database ${uuid} has no data sources. Confirm you're logged in to the right workspace with \`${loginHintCommand()}\`.`);
|
|
72
|
+
}
|
|
73
|
+
return fetchDataSource(db.data_sources[0].id, quiet);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
if (!is404(error)) {
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
dbError = error;
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
return fetchDataSource(uuid, quiet);
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
if (!is404(error)) {
|
|
87
|
+
throw error;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
throw new Error(dbError instanceof Error
|
|
91
|
+
? `${uuid} isn't a database or data source. Confirm you're logged in to the right workspace with \`${loginHintCommand()}\`.`
|
|
92
|
+
: `${uuid} isn't a database or data source.`);
|
|
93
|
+
}
|
|
94
|
+
export function pullManifest(options) {
|
|
95
|
+
const { idOrUrl, key = "default", out = MANIFEST_FILENAME, dryRun = false, quiet = false, } = options;
|
|
96
|
+
const outPath = resolvePath(process.cwd(), out);
|
|
97
|
+
const id = extractId(idOrUrl);
|
|
98
|
+
if (quiet) {
|
|
99
|
+
console.log("\nPulling data source schema…");
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
console.log(`\nResolving ${idOrUrl}…\n`);
|
|
103
|
+
}
|
|
104
|
+
const result = fetchSchema(id, quiet);
|
|
105
|
+
const entry = {
|
|
106
|
+
name: result.name,
|
|
107
|
+
properties: result.properties,
|
|
108
|
+
};
|
|
109
|
+
// Read existing manifest or start fresh. The entry for `key` is fully
|
|
110
|
+
// replaced so stale properties are automatically removed.
|
|
111
|
+
let manifest;
|
|
112
|
+
if (existsSync(outPath)) {
|
|
113
|
+
try {
|
|
114
|
+
const existing = JSON.parse(readFileSync(outPath, "utf-8"));
|
|
115
|
+
manifest = { version: 1, dataSources: existing.dataSources ?? {} };
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
manifest = { version: 1, dataSources: {} };
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
manifest = { version: 1, dataSources: {} };
|
|
123
|
+
}
|
|
124
|
+
manifest.dataSources[key] = entry;
|
|
125
|
+
const json = JSON.stringify(manifest, null, "\t") + "\n";
|
|
126
|
+
if (dryRun) {
|
|
127
|
+
console.log(json);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
writeFileSync(outPath, json);
|
|
131
|
+
// Stash the resolved data-source ID in .notion/target.json so `connect`
|
|
132
|
+
// can wire the block without the user re-typing it. Don't touch block_id
|
|
133
|
+
// or property_ids_by_key — init seeds block_id at scaffold time, and
|
|
134
|
+
// `connect` fills in property_ids_by_key.
|
|
135
|
+
const existingTarget = readTarget();
|
|
136
|
+
const existingEntry = existingTarget?.data_sources[key];
|
|
137
|
+
const merged = mergeTarget(existingTarget, {
|
|
138
|
+
data_sources: {
|
|
139
|
+
[key]: {
|
|
140
|
+
data_source_id: result.dataSourceId,
|
|
141
|
+
property_ids_by_key: existingEntry?.property_ids_by_key ?? {},
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
writeTarget(merged);
|
|
146
|
+
const count = Object.keys(result.properties).length;
|
|
147
|
+
if (quiet) {
|
|
148
|
+
console.log(`Found database "${result.name}" (${count} properties)`);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
console.log(`\n✓ Updated ${out} (key: "${key}")\n`);
|
|
152
|
+
console.log(` → recorded data_source_id in .notion/target.json (${key})`);
|
|
153
|
+
console.log(` ${count} properties from "${result.name}":`);
|
|
154
|
+
for (const [k, p] of Object.entries(result.properties)) {
|
|
155
|
+
console.log(` ${k}: ${p.name} (${p.type})`);
|
|
156
|
+
}
|
|
157
|
+
console.log("");
|
|
158
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname, resolve as resolvePath } from "node:path";
|
|
3
|
+
export const TARGET_PATH = ".notion/target.json";
|
|
4
|
+
function defaultTarget() {
|
|
5
|
+
return { env: "production", block_id: [], data_sources: {} };
|
|
6
|
+
}
|
|
7
|
+
export function resolveTargetPath(cwd = process.cwd()) {
|
|
8
|
+
return resolvePath(cwd, TARGET_PATH);
|
|
9
|
+
}
|
|
10
|
+
export function readTarget(cwd = process.cwd()) {
|
|
11
|
+
const path = resolveTargetPath(cwd);
|
|
12
|
+
if (!existsSync(path)) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
let raw;
|
|
16
|
+
try {
|
|
17
|
+
raw = readFileSync(path, "utf-8");
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
21
|
+
throw new Error(`Error: failed to read ${TARGET_PATH}: ${message}\n Check file permissions.`);
|
|
22
|
+
}
|
|
23
|
+
let parsed;
|
|
24
|
+
try {
|
|
25
|
+
parsed = JSON.parse(raw);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
throw new Error(`Error: ${TARGET_PATH} contains invalid JSON.\n Fix the syntax or delete the file to regenerate it with 'ncblock connect'.`);
|
|
29
|
+
}
|
|
30
|
+
return normalizeTarget(parsed);
|
|
31
|
+
}
|
|
32
|
+
export function writeTarget(config, cwd = process.cwd()) {
|
|
33
|
+
const path = resolveTargetPath(cwd);
|
|
34
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
35
|
+
writeFileSync(path, JSON.stringify(config, null, "\t") + "\n");
|
|
36
|
+
}
|
|
37
|
+
function normalizeTarget(value) {
|
|
38
|
+
if (!isRecord(value)) {
|
|
39
|
+
throw new Error(`Error: ${TARGET_PATH} must be a JSON object.\n Delete the file to regenerate it with 'ncblock connect'.`);
|
|
40
|
+
}
|
|
41
|
+
const env = typeof value.env === "string" ? value.env : "production";
|
|
42
|
+
const block_id = [];
|
|
43
|
+
if (Array.isArray(value.block_id)) {
|
|
44
|
+
for (const entry of value.block_id) {
|
|
45
|
+
if (typeof entry === "string" && entry.length > 0) {
|
|
46
|
+
block_id.push(entry);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else if (typeof value.block_id === "string" && value.block_id.length > 0) {
|
|
51
|
+
block_id.push(value.block_id);
|
|
52
|
+
}
|
|
53
|
+
const data_sources = {};
|
|
54
|
+
if (isRecord(value.data_sources)) {
|
|
55
|
+
for (const [key, ds] of Object.entries(value.data_sources)) {
|
|
56
|
+
if (!isRecord(ds) || typeof ds.data_source_id !== "string") {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
const property_ids_by_key = {};
|
|
60
|
+
if (isRecord(ds.property_ids_by_key)) {
|
|
61
|
+
for (const [k, v] of Object.entries(ds.property_ids_by_key)) {
|
|
62
|
+
if (typeof v === "string") {
|
|
63
|
+
property_ids_by_key[k] = v;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
data_sources[key] = {
|
|
68
|
+
data_source_id: ds.data_source_id,
|
|
69
|
+
property_ids_by_key,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return { env, block_id, data_sources };
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Merge a new partial target into the existing one. Block IDs from `incoming`
|
|
77
|
+
* are appended (de-duplicated). Data source bindings replace any existing
|
|
78
|
+
* binding for matching keys; unrelated keys are preserved.
|
|
79
|
+
*/
|
|
80
|
+
export function mergeTarget(existing, incoming) {
|
|
81
|
+
const base = existing ?? defaultTarget();
|
|
82
|
+
const env = incoming.env ?? base.env;
|
|
83
|
+
const blockIds = new Set(base.block_id);
|
|
84
|
+
for (const id of incoming.block_id ?? []) {
|
|
85
|
+
blockIds.add(id);
|
|
86
|
+
}
|
|
87
|
+
const data_sources = {
|
|
88
|
+
...base.data_sources,
|
|
89
|
+
...(incoming.data_sources ?? {}),
|
|
90
|
+
};
|
|
91
|
+
return { env, block_id: [...blockIds], data_sources };
|
|
92
|
+
}
|
|
93
|
+
function isRecord(value) {
|
|
94
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
95
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import * as v from "valibot";
|
|
2
|
+
/**
|
|
3
|
+
* Hex-token identifiers for Notion's named colors. Mirrors the public API's
|
|
4
|
+
* `select.options[].color` enum
|
|
5
|
+
* (https://developers.notion.com/reference/property-object#select).
|
|
6
|
+
*/
|
|
7
|
+
export const notionPropertyColorSchema = v.picklist([
|
|
8
|
+
"default",
|
|
9
|
+
"gray",
|
|
10
|
+
"brown",
|
|
11
|
+
"orange",
|
|
12
|
+
"yellow",
|
|
13
|
+
"green",
|
|
14
|
+
"blue",
|
|
15
|
+
"purple",
|
|
16
|
+
"pink",
|
|
17
|
+
"red",
|
|
18
|
+
"gray_background",
|
|
19
|
+
"brown_background",
|
|
20
|
+
"orange_background",
|
|
21
|
+
"yellow_background",
|
|
22
|
+
"green_background",
|
|
23
|
+
"blue_background",
|
|
24
|
+
"purple_background",
|
|
25
|
+
"pink_background",
|
|
26
|
+
"red_background",
|
|
27
|
+
"default_background",
|
|
28
|
+
]);
|
|
29
|
+
export const notionPropertyOptionSchema = v.object({
|
|
30
|
+
id: v.string(),
|
|
31
|
+
name: v.string(),
|
|
32
|
+
color: v.optional(notionPropertyColorSchema),
|
|
33
|
+
description: v.optional(v.string()),
|
|
34
|
+
});
|
|
35
|
+
export const notionStatusGroupSchema = v.object({
|
|
36
|
+
id: v.string(),
|
|
37
|
+
name: v.string(),
|
|
38
|
+
color: v.optional(notionPropertyColorSchema),
|
|
39
|
+
option_ids: v.array(v.string()),
|
|
40
|
+
});
|
|
41
|
+
export const notionDualPropertySchema = v.object({
|
|
42
|
+
synced_property_id: v.string(),
|
|
43
|
+
synced_property_name: v.string(),
|
|
44
|
+
});
|
|
45
|
+
const baseProp = v.object({
|
|
46
|
+
name: v.string(),
|
|
47
|
+
description: v.optional(v.string()),
|
|
48
|
+
});
|
|
49
|
+
/**
|
|
50
|
+
* Every Notion property type the bridge speaks, in a single readable list.
|
|
51
|
+
* Mirrors the Notion public API
|
|
52
|
+
* [property object](https://developers.notion.com/reference/property-object)
|
|
53
|
+
* type field. Internal-only types (`button`, `verification`,
|
|
54
|
+
* `last_visited_time`, `location`) and the four built-ins (`created_time`,
|
|
55
|
+
* `last_edited_time`, `created_by`, `last_edited_by`) are included under their
|
|
56
|
+
* bridge-native names.
|
|
57
|
+
*/
|
|
58
|
+
export const NOTION_PROPERTY_TYPES = [
|
|
59
|
+
"title",
|
|
60
|
+
"rich_text",
|
|
61
|
+
"number",
|
|
62
|
+
"checkbox",
|
|
63
|
+
"url",
|
|
64
|
+
"email",
|
|
65
|
+
"phone_number",
|
|
66
|
+
"select",
|
|
67
|
+
"multi_select",
|
|
68
|
+
"status",
|
|
69
|
+
"date",
|
|
70
|
+
"people",
|
|
71
|
+
"files",
|
|
72
|
+
"unique_id",
|
|
73
|
+
"relation",
|
|
74
|
+
"place",
|
|
75
|
+
"formula",
|
|
76
|
+
"rollup",
|
|
77
|
+
"button",
|
|
78
|
+
"verification",
|
|
79
|
+
"last_visited_time",
|
|
80
|
+
"location",
|
|
81
|
+
"created_time",
|
|
82
|
+
"last_edited_time",
|
|
83
|
+
"created_by",
|
|
84
|
+
"last_edited_by",
|
|
85
|
+
];
|
|
86
|
+
export const notionPropertyTypeSchema = v.picklist(NOTION_PROPERTY_TYPES);
|
|
87
|
+
/**
|
|
88
|
+
* Per-property schema as exposed by the host over the custom-block bridge.
|
|
89
|
+
* The `type` discriminator must be one of {@link NOTION_PROPERTY_TYPES}.
|
|
90
|
+
*/
|
|
91
|
+
export const notionPropertySchemaSchema = v.variant("type", [
|
|
92
|
+
v.object({ ...baseProp.entries, type: v.literal("title") }),
|
|
93
|
+
v.object({ ...baseProp.entries, type: v.literal("rich_text") }),
|
|
94
|
+
v.object({ ...baseProp.entries, type: v.literal("number") }),
|
|
95
|
+
v.object({ ...baseProp.entries, type: v.literal("checkbox") }),
|
|
96
|
+
v.object({ ...baseProp.entries, type: v.literal("url") }),
|
|
97
|
+
v.object({ ...baseProp.entries, type: v.literal("email") }),
|
|
98
|
+
v.object({ ...baseProp.entries, type: v.literal("phone_number") }),
|
|
99
|
+
v.object({
|
|
100
|
+
...baseProp.entries,
|
|
101
|
+
type: v.literal("select"),
|
|
102
|
+
options: v.array(notionPropertyOptionSchema),
|
|
103
|
+
}),
|
|
104
|
+
v.object({
|
|
105
|
+
...baseProp.entries,
|
|
106
|
+
type: v.literal("multi_select"),
|
|
107
|
+
options: v.array(notionPropertyOptionSchema),
|
|
108
|
+
}),
|
|
109
|
+
v.object({
|
|
110
|
+
...baseProp.entries,
|
|
111
|
+
type: v.literal("status"),
|
|
112
|
+
options: v.array(notionPropertyOptionSchema),
|
|
113
|
+
groups: v.array(notionStatusGroupSchema),
|
|
114
|
+
}),
|
|
115
|
+
v.object({ ...baseProp.entries, type: v.literal("date") }),
|
|
116
|
+
v.object({ ...baseProp.entries, type: v.literal("people") }),
|
|
117
|
+
v.object({ ...baseProp.entries, type: v.literal("files") }),
|
|
118
|
+
v.object({ ...baseProp.entries, type: v.literal("unique_id") }),
|
|
119
|
+
v.object({
|
|
120
|
+
...baseProp.entries,
|
|
121
|
+
type: v.literal("relation"),
|
|
122
|
+
data_source_id: v.optional(v.string()),
|
|
123
|
+
dual_property: v.optional(notionDualPropertySchema),
|
|
124
|
+
}),
|
|
125
|
+
v.object({ ...baseProp.entries, type: v.literal("place") }),
|
|
126
|
+
v.object({ ...baseProp.entries, type: v.literal("formula") }),
|
|
127
|
+
v.object({ ...baseProp.entries, type: v.literal("rollup") }),
|
|
128
|
+
// Internal-only types passed through under their bridge-native names.
|
|
129
|
+
v.object({ ...baseProp.entries, type: v.literal("button") }),
|
|
130
|
+
v.object({ ...baseProp.entries, type: v.literal("verification") }),
|
|
131
|
+
v.object({ ...baseProp.entries, type: v.literal("last_visited_time") }),
|
|
132
|
+
v.object({ ...baseProp.entries, type: v.literal("location") }),
|
|
133
|
+
// Synthetic built-ins. The host always emits one of each per data source.
|
|
134
|
+
v.object({ ...baseProp.entries, type: v.literal("created_time") }),
|
|
135
|
+
v.object({ ...baseProp.entries, type: v.literal("last_edited_time") }),
|
|
136
|
+
v.object({ ...baseProp.entries, type: v.literal("created_by") }),
|
|
137
|
+
v.object({ ...baseProp.entries, type: v.literal("last_edited_by") }),
|
|
138
|
+
]);
|
|
139
|
+
/**
|
|
140
|
+
* The four synthetic built-in property IDs the host always includes in every
|
|
141
|
+
* data source's `propertySchemasById` and every row's `propertiesById`.
|
|
142
|
+
*/
|
|
143
|
+
export const NOTION_BUILTIN_PROPERTY_IDS = [
|
|
144
|
+
"created_time",
|
|
145
|
+
"last_edited_time",
|
|
146
|
+
"created_by",
|
|
147
|
+
"last_edited_by",
|
|
148
|
+
];
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import * as v from "valibot";
|
|
2
|
+
import { notionPropertyTypeSchema } from "./dataSources/propertySchema.js";
|
|
3
|
+
/**
|
|
4
|
+
* User-authored manifest declaring the data sources the custom block expects.
|
|
5
|
+
* Lives at `custom_blocks.json` in the project root and is forwarded to the host with
|
|
6
|
+
* the bridge `ready` message so the host can pre-bind data sources, surface
|
|
7
|
+
* configuration UI, etc. The `notionCustomBlock` Vite plugin from
|
|
8
|
+
* `@notionhq/custom-blocks/vite` wires the JSON file into the dev server and
|
|
9
|
+
* the build output.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Decorative icon attached to a manifest data source. Mirrors the
|
|
13
|
+
* `emoji` / `external` icon variants the public Notion API uses, so the host
|
|
14
|
+
* can render a recognizable affordance next to the slot in setup UI.
|
|
15
|
+
*/
|
|
16
|
+
export const manifestIconSchema = v.variant("type", [
|
|
17
|
+
v.object({
|
|
18
|
+
type: v.literal("emoji"),
|
|
19
|
+
emoji: v.string(),
|
|
20
|
+
}),
|
|
21
|
+
v.object({
|
|
22
|
+
type: v.literal("external"),
|
|
23
|
+
url: v.string(),
|
|
24
|
+
}),
|
|
25
|
+
]);
|
|
26
|
+
export const manifestPropertySchema = v.object({
|
|
27
|
+
name: v.string(),
|
|
28
|
+
description: v.optional(v.string()),
|
|
29
|
+
type: notionPropertyTypeSchema,
|
|
30
|
+
});
|
|
31
|
+
export const manifestDataSourceSchema = v.object({
|
|
32
|
+
name: v.string(),
|
|
33
|
+
description: v.optional(v.string()),
|
|
34
|
+
icon: v.optional(manifestIconSchema),
|
|
35
|
+
properties: v.optional(v.record(v.string(), manifestPropertySchema), {}),
|
|
36
|
+
});
|
|
37
|
+
export const manifestSchema = v.object({
|
|
38
|
+
version: v.literal(1),
|
|
39
|
+
dataSources: v.record(v.string(), manifestDataSourceSchema),
|
|
40
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autoResize.d.ts","sourceRoot":"","sources":["../../../../../../../Users/nsarkar/work/custom-blocks/sdk/src/autoResize.ts"],"names":[],"mappings":"AAKA,wBAAgB,UAAU,CAAC,IAAI,EAAE;IAChC,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,CAAA;CACtC,GAAG,MAAM,IAAI,CA4Eb"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { customBlockHost } from "./bridge/sandboxClient.js";
|
|
2
|
+
/** Limits host resize messages to 10 per second while preserving the latest height. */
|
|
3
|
+
const AUTO_RESIZE_THROTTLE_MS = 100;
|
|
4
|
+
export function autoResize(args) {
|
|
5
|
+
const { target } = args;
|
|
6
|
+
if (target === null || target === undefined) {
|
|
7
|
+
return () => { };
|
|
8
|
+
}
|
|
9
|
+
// Use a leading/trailing throttle: send the first changed height immediately, then retain only
|
|
10
|
+
// the latest height observed and send it when the throttling period ends.
|
|
11
|
+
let lastHeightReportedToHost = -1;
|
|
12
|
+
let pendingHeight;
|
|
13
|
+
let throttleTimeout;
|
|
14
|
+
/** Sends a height immediately and records it as the deduplication baseline. */
|
|
15
|
+
const sendHeightToHost = (height) => {
|
|
16
|
+
lastHeightReportedToHost = height;
|
|
17
|
+
customBlockHost.postResize(height);
|
|
18
|
+
};
|
|
19
|
+
/** Sends the latest height queued during the throttling period, if one exists. */
|
|
20
|
+
const flushPendingHeight = () => {
|
|
21
|
+
if (throttleTimeout !== undefined) {
|
|
22
|
+
clearTimeout(throttleTimeout);
|
|
23
|
+
throttleTimeout = undefined;
|
|
24
|
+
}
|
|
25
|
+
if (pendingHeight === undefined) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const height = pendingHeight;
|
|
29
|
+
pendingHeight = undefined;
|
|
30
|
+
sendHeightToHost(height);
|
|
31
|
+
throttleTimeout = setTimeout(flushPendingHeight, AUTO_RESIZE_THROTTLE_MS);
|
|
32
|
+
};
|
|
33
|
+
/** Measures the target and either sends, queues, or deduplicates its height. */
|
|
34
|
+
const measureAndScheduleResize = () => {
|
|
35
|
+
const next = Math.ceil(target.getBoundingClientRect().height);
|
|
36
|
+
if (next === lastHeightReportedToHost) {
|
|
37
|
+
// The height has not changed since the last measurement. Do nothing.
|
|
38
|
+
pendingHeight = undefined;
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (throttleTimeout !== undefined) {
|
|
42
|
+
// The height has changed since the last measurement, but the throttling period has not
|
|
43
|
+
// ended. Queue the new height for later.
|
|
44
|
+
pendingHeight = next;
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
// The height has changed since the last measurement and the throttling period has ended.
|
|
48
|
+
// Send the new height immediately and start a new throttling period.
|
|
49
|
+
sendHeightToHost(next);
|
|
50
|
+
throttleTimeout = setTimeout(flushPendingHeight, AUTO_RESIZE_THROTTLE_MS);
|
|
51
|
+
};
|
|
52
|
+
// Measure the initial height and schedule the first throttling period.
|
|
53
|
+
measureAndScheduleResize();
|
|
54
|
+
// If the ResizeObserver API is not available, return a function that cleans up the throttling
|
|
55
|
+
// period started by the initial measurement.
|
|
56
|
+
if (typeof ResizeObserver === "undefined") {
|
|
57
|
+
return () => {
|
|
58
|
+
clearTimeout(throttleTimeout);
|
|
59
|
+
throttleTimeout = undefined;
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
// Observe the target and schedule subsequent measurements and throttling periods.
|
|
63
|
+
const observer = new ResizeObserver(measureAndScheduleResize);
|
|
64
|
+
observer.observe(target);
|
|
65
|
+
// Clean up the observer and the throttling period.
|
|
66
|
+
return () => {
|
|
67
|
+
observer.disconnect();
|
|
68
|
+
clearTimeout(throttleTimeout);
|
|
69
|
+
throttleTimeout = undefined;
|
|
70
|
+
};
|
|
71
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import type { CreatePageInput, CreatePageResult, GetPageResult, GetUserResult, ListUsersInput, ListUsersResult, NotionPageId, NotionUserId, UpdatePageInput, UpdatePageResult, UseDataSourceOptions } from "../types.js";
|
|
2
|
+
import type { NotionDataSource } from "./dataSources/dataSource.js";
|
|
3
|
+
import type { NotionDataSourcePageUpdateInput, NotionDataSourcePageUpdateResult } from "./dataSources/dataSourcePage.js";
|
|
4
|
+
import { type CustomBlockHostState } from "./hostState.js";
|
|
5
|
+
import type { ManifestLoadResult } from "./loadManifest.js";
|
|
6
|
+
import type { CustomBlockManifest } from "./manifest.js";
|
|
7
|
+
import { type InitMessage } from "./messages/init.js";
|
|
8
|
+
/**
|
|
9
|
+
* Used to ensure that the host and client are using the same version of the bridge protocol. A
|
|
10
|
+
* single host needs to support multiple custom blocks built with different versions of the bridge
|
|
11
|
+
* protocol. Increment this number any time a breaking change is made to the bridge protocol.
|
|
12
|
+
*/
|
|
13
|
+
export declare const CUSTOM_BLOCK_BRIDGE_PROTOCOL_VERSION = 2;
|
|
14
|
+
/**
|
|
15
|
+
* A single entry in the bridge message log. Kept intentionally plain so the log
|
|
16
|
+
* is copy-pasteable to a local coding agent without needing extra context.
|
|
17
|
+
*/
|
|
18
|
+
export type MessageLogEntry = {
|
|
19
|
+
timestamp: string;
|
|
20
|
+
direction: "sent" | "received";
|
|
21
|
+
data: unknown;
|
|
22
|
+
};
|
|
23
|
+
export declare class SandboxBridge {
|
|
24
|
+
private hostState;
|
|
25
|
+
private listeners;
|
|
26
|
+
private messageLog;
|
|
27
|
+
private messageLogListeners;
|
|
28
|
+
private nextRequestId;
|
|
29
|
+
private readonly pendingCreatePage;
|
|
30
|
+
private readonly pendingGetPage;
|
|
31
|
+
private readonly pendingGetUser;
|
|
32
|
+
private readonly pendingListUsers;
|
|
33
|
+
private readonly pendingUpdatePage;
|
|
34
|
+
private hasSentReady;
|
|
35
|
+
private latestDataSourceBindings;
|
|
36
|
+
private resolveInit;
|
|
37
|
+
private rejectInit;
|
|
38
|
+
private readonly initMessage;
|
|
39
|
+
private manifest;
|
|
40
|
+
constructor();
|
|
41
|
+
private static MAX_LOG_ENTRIES;
|
|
42
|
+
private logMessage;
|
|
43
|
+
getMessageLog(): readonly MessageLogEntry[];
|
|
44
|
+
subscribeToMessageLog(listener: () => void): () => boolean;
|
|
45
|
+
awaitInit(signal?: AbortSignal): Promise<InitMessage>;
|
|
46
|
+
sendReady(manifestResult: ManifestLoadResult): void;
|
|
47
|
+
private postToHost;
|
|
48
|
+
private notify;
|
|
49
|
+
private handleMessage;
|
|
50
|
+
subscribe(listener: () => void): () => boolean;
|
|
51
|
+
getHostState(): CustomBlockHostState;
|
|
52
|
+
/**
|
|
53
|
+
* The author-declared manifest loaded from `custom_blocks.json` and forwarded
|
|
54
|
+
* to the host in `ready`. `null` when it failed to load/parse and the host
|
|
55
|
+
* should reject init via `ready.status: "error"`. Static for the lifetime
|
|
56
|
+
* of the sandbox.
|
|
57
|
+
*/
|
|
58
|
+
getManifest(): CustomBlockManifest | null;
|
|
59
|
+
/**
|
|
60
|
+
* Apply an `init` payload as if it had arrived from the host. Lets callers
|
|
61
|
+
* seed the bridge directly (e.g. the React provider's standalone preview
|
|
62
|
+
* fallback) without going through `postMessage`. The bridge stays unaware
|
|
63
|
+
* of why it's being seeded.
|
|
64
|
+
*/
|
|
65
|
+
setMockState(message: InitMessage): void;
|
|
66
|
+
private applyInit;
|
|
67
|
+
queryDataSource(key: string, options?: UseDataSourceOptions): void;
|
|
68
|
+
private setDataSourceQueryError;
|
|
69
|
+
postResize(height: number): void;
|
|
70
|
+
createPage(input: CreatePageInput): Promise<CreatePageResult>;
|
|
71
|
+
getPage(pageId: NotionPageId): Promise<GetPageResult>;
|
|
72
|
+
getUser(userId: NotionUserId): Promise<GetUserResult>;
|
|
73
|
+
listUsers(input?: ListUsersInput): Promise<ListUsersResult>;
|
|
74
|
+
updatePage(input: UpdatePageInput): Promise<UpdatePageResult>;
|
|
75
|
+
/**
|
|
76
|
+
* Updates a page on a known data source, resolving any property keys against the data source's
|
|
77
|
+
* `propertyIdsByKey` before sending the bridge message. Used by the per-row `update` callback
|
|
78
|
+
* returned from {@link getDataSourceQueryView}.
|
|
79
|
+
*/
|
|
80
|
+
updateDataSourcePage(args: {
|
|
81
|
+
dataSource: NotionDataSource;
|
|
82
|
+
pageId: NotionPageId;
|
|
83
|
+
input: NotionDataSourcePageUpdateInput;
|
|
84
|
+
}): Promise<NotionDataSourcePageUpdateResult>;
|
|
85
|
+
/**
|
|
86
|
+
* Translates the public `CreatePageInput["parent"]` into the bridge-native
|
|
87
|
+
* `CreatePageMessageParent`. The `data_source_key` variant is resolved sandbox-side against
|
|
88
|
+
* the data source mapping the host delivered in `init` / `dataSourcesChanged`.
|
|
89
|
+
*/
|
|
90
|
+
private resolveCreatePageParent;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=SandboxBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SandboxBridge.d.ts","sourceRoot":"","sources":["../../../../../../../../Users/nsarkar/work/custom-blocks/sdk/src/bridge/SandboxBridge.ts"],"names":[],"mappings":"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"}
|