@notionhq/client 5.21.0 → 5.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +121 -10
- package/build/package.json +1 -1
- package/build/src/Client.d.ts +12 -5
- package/build/src/Client.d.ts.map +1 -1
- package/build/src/Client.js +37 -8
- package/build/src/Client.js.map +1 -1
- package/build/src/api-endpoints/async-tasks.d.ts +141 -0
- package/build/src/api-endpoints/async-tasks.d.ts.map +1 -0
- package/build/src/api-endpoints/async-tasks.js +16 -0
- package/build/src/api-endpoints/async-tasks.js.map +1 -0
- package/build/src/api-endpoints/blocks.d.ts +1 -1
- package/build/src/api-endpoints/blocks.d.ts.map +1 -1
- package/build/src/api-endpoints/blocks.js.map +1 -1
- package/build/src/api-endpoints/comments.d.ts +1 -1
- package/build/src/api-endpoints/comments.d.ts.map +1 -1
- package/build/src/api-endpoints/comments.js.map +1 -1
- package/build/src/api-endpoints/common.d.ts +3 -0
- package/build/src/api-endpoints/common.d.ts.map +1 -1
- package/build/src/api-endpoints/common.js.map +1 -1
- package/build/src/api-endpoints/custom-emojis.d.ts +1 -1
- package/build/src/api-endpoints/custom-emojis.d.ts.map +1 -1
- package/build/src/api-endpoints/custom-emojis.js.map +1 -1
- package/build/src/api-endpoints/data-sources.d.ts +2 -2
- package/build/src/api-endpoints/data-sources.d.ts.map +1 -1
- package/build/src/api-endpoints/data-sources.js.map +1 -1
- package/build/src/api-endpoints/file-uploads.d.ts +1 -1
- package/build/src/api-endpoints/file-uploads.d.ts.map +1 -1
- package/build/src/api-endpoints/file-uploads.js.map +1 -1
- package/build/src/api-endpoints/pages.d.ts +12 -4
- package/build/src/api-endpoints/pages.d.ts.map +1 -1
- package/build/src/api-endpoints/pages.js +2 -0
- package/build/src/api-endpoints/pages.js.map +1 -1
- package/build/src/api-endpoints/search.d.ts +3 -1
- package/build/src/api-endpoints/search.d.ts.map +1 -1
- package/build/src/api-endpoints/search.js.map +1 -1
- package/build/src/api-endpoints/users.d.ts +1 -1
- package/build/src/api-endpoints/users.d.ts.map +1 -1
- package/build/src/api-endpoints/users.js.map +1 -1
- package/build/src/api-endpoints/views.d.ts +2 -2
- package/build/src/api-endpoints/views.d.ts.map +1 -1
- package/build/src/api-endpoints/views.js.map +1 -1
- package/build/src/api-endpoints.d.ts +2 -0
- package/build/src/api-endpoints.d.ts.map +1 -1
- package/build/src/api-endpoints.js +2 -0
- package/build/src/api-endpoints.js.map +1 -1
- package/build/src/errors.d.ts +1 -0
- package/build/src/errors.d.ts.map +1 -1
- package/build/src/errors.js +3 -0
- package/build/src/errors.js.map +1 -1
- package/build/src/helpers.d.ts +84 -1
- package/build/src/helpers.d.ts.map +1 -1
- package/build/src/helpers.js +134 -0
- package/build/src/helpers.js.map +1 -1
- package/build/src/index.d.ts +5 -2
- package/build/src/index.d.ts.map +1 -1
- package/build/src/index.js +6 -1
- package/build/src/index.js.map +1 -1
- package/build/src/webhooks.d.ts +56 -0
- package/build/src/webhooks.d.ts.map +1 -0
- package/build/src/webhooks.js +124 -0
- package/build/src/webhooks.js.map +1 -0
- package/package.json +1 -1
package/build/src/helpers.js
CHANGED
|
@@ -4,6 +4,8 @@ exports.iteratePaginatedAPI = iteratePaginatedAPI;
|
|
|
4
4
|
exports.collectPaginatedAPI = collectPaginatedAPI;
|
|
5
5
|
exports.iterateDataSourceTemplates = iterateDataSourceTemplates;
|
|
6
6
|
exports.collectDataSourceTemplates = collectDataSourceTemplates;
|
|
7
|
+
exports.iterateAllDataSourceRows = iterateAllDataSourceRows;
|
|
8
|
+
exports.collectAllDataSourceRows = collectAllDataSourceRows;
|
|
7
9
|
exports.isFullBlock = isFullBlock;
|
|
8
10
|
exports.isFullPage = isFullPage;
|
|
9
11
|
exports.isFullDataSource = isFullDataSource;
|
|
@@ -123,6 +125,138 @@ async function collectDataSourceTemplates(client, args) {
|
|
|
123
125
|
}
|
|
124
126
|
return results;
|
|
125
127
|
}
|
|
128
|
+
/**
|
|
129
|
+
* Iterate over every row of a data source, including rows past the per-query
|
|
130
|
+
* result limit that `dataSources.query` enforces on large data sources.
|
|
131
|
+
*
|
|
132
|
+
* A single query (one filter and sort) returns at most a fixed number of rows
|
|
133
|
+
* (10,000 by default). Once that limit is reached, `has_more` becomes `false`
|
|
134
|
+
* and the response carries `request_status.type === "incomplete"`. Plain
|
|
135
|
+
* pagination such as {@link iteratePaginatedAPI} stops there and silently
|
|
136
|
+
* misses the rest of the data source.
|
|
137
|
+
*
|
|
138
|
+
* This helper works around the limit by partitioning the data source into
|
|
139
|
+
* created_time windows. It sorts by created_time ascending; whenever a window
|
|
140
|
+
* reaches the limit, it starts a fresh query from the last row's created_time.
|
|
141
|
+
* Each fresh query has a different filter, so it gets its own result budget.
|
|
142
|
+
* Rows that share a boundary timestamp are de-duplicated by id, so every row is
|
|
143
|
+
* yielded exactly once.
|
|
144
|
+
*
|
|
145
|
+
* created_time is used because it never changes. last_edited_time would shift
|
|
146
|
+
* rows between windows as they are edited, causing gaps or duplicates.
|
|
147
|
+
*
|
|
148
|
+
* Throws if a single created_time value holds more rows than the limit, since
|
|
149
|
+
* the window cannot be narrowed by time alone. Add a filter in that case so
|
|
150
|
+
* each window stays under the limit.
|
|
151
|
+
*
|
|
152
|
+
* Example (given a notion Client called `notion`):
|
|
153
|
+
*
|
|
154
|
+
* ```
|
|
155
|
+
* for await (const row of iterateAllDataSourceRows(notion, {
|
|
156
|
+
* data_source_id: dataSourceId,
|
|
157
|
+
* })) {
|
|
158
|
+
* // Do something with row.
|
|
159
|
+
* }
|
|
160
|
+
* ```
|
|
161
|
+
*
|
|
162
|
+
* @param client A Notion client instance.
|
|
163
|
+
* @param args Query arguments. `start_cursor` and `sorts` are managed by the
|
|
164
|
+
* helper; `filter` is combined with the created_time window bound.
|
|
165
|
+
*/
|
|
166
|
+
async function* iterateAllDataSourceRows(client, args) {
|
|
167
|
+
var _a, _b;
|
|
168
|
+
const seenRowIds = new Set();
|
|
169
|
+
let windowStart = undefined;
|
|
170
|
+
for (;;) {
|
|
171
|
+
let limitReached = false;
|
|
172
|
+
let lastCreatedTime = undefined;
|
|
173
|
+
let cursor = undefined;
|
|
174
|
+
do {
|
|
175
|
+
const response = await client.dataSources.query({
|
|
176
|
+
...args,
|
|
177
|
+
sorts: [{ timestamp: "created_time", direction: "ascending" }],
|
|
178
|
+
filter: createdTimeLowerBound(args.filter, windowStart),
|
|
179
|
+
start_cursor: cursor,
|
|
180
|
+
});
|
|
181
|
+
for (const row of response.results) {
|
|
182
|
+
// Wiki data sources can return child data-source rows alongside pages.
|
|
183
|
+
// Both carry created_time and either can be the window's boundary row,
|
|
184
|
+
// so advance on either; reading only pages would stall a window made up
|
|
185
|
+
// of data-source rows and throw spuriously.
|
|
186
|
+
if (isFullPageOrDataSource(row)) {
|
|
187
|
+
lastCreatedTime = row.created_time;
|
|
188
|
+
}
|
|
189
|
+
if (!seenRowIds.has(row.id)) {
|
|
190
|
+
seenRowIds.add(row.id);
|
|
191
|
+
yield row;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (((_a = response.request_status) === null || _a === void 0 ? void 0 : _a.type) === "incomplete") {
|
|
195
|
+
limitReached = true;
|
|
196
|
+
}
|
|
197
|
+
cursor = (_b = response.next_cursor) !== null && _b !== void 0 ? _b : undefined;
|
|
198
|
+
} while (cursor);
|
|
199
|
+
if (!limitReached) {
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
if (lastCreatedTime === undefined || lastCreatedTime === windowStart) {
|
|
203
|
+
throw new Error("iterateAllDataSourceRows cannot make progress: the per-query result " +
|
|
204
|
+
"limit was reached but the created_time window could not advance " +
|
|
205
|
+
`past ${String(lastCreatedTime)}. More rows share this timestamp ` +
|
|
206
|
+
"than the limit allows. Add a filter to narrow the query.");
|
|
207
|
+
}
|
|
208
|
+
windowStart = lastCreatedTime;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Collect every row of a data source into an in-memory array, including rows
|
|
213
|
+
* past the per-query result limit. See {@link iterateAllDataSourceRows} for how
|
|
214
|
+
* the limit is handled.
|
|
215
|
+
*
|
|
216
|
+
* Before using this, check that the full data source fits in memory. For very
|
|
217
|
+
* large data sources, prefer {@link iterateAllDataSourceRows} and process rows
|
|
218
|
+
* as they stream.
|
|
219
|
+
*
|
|
220
|
+
* Example (given a notion Client called `notion`):
|
|
221
|
+
*
|
|
222
|
+
* ```
|
|
223
|
+
* const rows = await collectAllDataSourceRows(notion, {
|
|
224
|
+
* data_source_id: dataSourceId,
|
|
225
|
+
* })
|
|
226
|
+
* // Do something with rows.
|
|
227
|
+
* ```
|
|
228
|
+
*
|
|
229
|
+
* @param client A Notion client instance.
|
|
230
|
+
* @param args Query arguments. See {@link iterateAllDataSourceRows}.
|
|
231
|
+
*/
|
|
232
|
+
async function collectAllDataSourceRows(client, args) {
|
|
233
|
+
const rows = [];
|
|
234
|
+
for await (const row of iterateAllDataSourceRows(client, args)) {
|
|
235
|
+
rows.push(row);
|
|
236
|
+
}
|
|
237
|
+
return rows;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Combine a caller-provided filter with the created_time lower bound used to
|
|
241
|
+
* advance the partition window. Returns the filter unchanged for the first
|
|
242
|
+
* window, which has no bound yet.
|
|
243
|
+
*/
|
|
244
|
+
function createdTimeLowerBound(filter, windowStart) {
|
|
245
|
+
if (windowStart === undefined) {
|
|
246
|
+
return filter;
|
|
247
|
+
}
|
|
248
|
+
const bound = {
|
|
249
|
+
timestamp: "created_time",
|
|
250
|
+
created_time: { on_or_after: windowStart },
|
|
251
|
+
};
|
|
252
|
+
if (filter === undefined) {
|
|
253
|
+
return bound;
|
|
254
|
+
}
|
|
255
|
+
if ("and" in filter) {
|
|
256
|
+
return { and: [...filter.and, bound] };
|
|
257
|
+
}
|
|
258
|
+
return { and: [filter, bound] };
|
|
259
|
+
}
|
|
126
260
|
/**
|
|
127
261
|
* @returns `true` if `response` is a full `BlockObjectResponse`.
|
|
128
262
|
*/
|
package/build/src/helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BlockObjectResponse,\n CommentObjectResponse,\n DatabaseObjectResponse,\n DataSourceObjectResponse,\n DataSourceViewObjectResponse,\n EquationRichTextItemResponse,\n ListDataSourceTemplatesResponse,\n MentionRichTextItemResponse,\n PageObjectResponse,\n PartialBlockObjectResponse,\n PartialCommentObjectResponse,\n PartialDatabaseObjectResponse,\n PartialDataSourceObjectResponse,\n PartialDataSourceViewObjectResponse,\n PartialPageObjectResponse,\n PartialUserObjectResponse,\n RichTextItemResponse,\n RichTextItemResponseCommon,\n TextRichTextItemResponse,\n UserObjectResponse,\n} from \"./api-endpoints\"\nimport type Client from \"./Client\"\n\ntype PaginatedArgs = {\n start_cursor?: string\n}\n\ntype PaginatedList<T> = {\n object: \"list\"\n results: T[]\n next_cursor: string | null\n has_more: boolean\n}\n\n/**\n * Returns an async iterator over the results of any paginated Notion API.\n *\n * Example (given a notion Client called `notion`):\n *\n * ```\n * for await (const block of iteratePaginatedAPI(notion.blocks.children.list, {\n * block_id: parentBlockId,\n * })) {\n * // Do something with block.\n * }\n * ```\n *\n * @param listFn A bound function on the Notion client that represents a conforming paginated\n * API. Example: `notion.blocks.children.list`.\n * @param firstPageArgs Arguments that should be passed to the API on the first and subsequent\n * calls to the API. Any necessary `next_cursor` will be automatically populated by\n * this function. Example: `{ block_id: \"<my block id>\" }`\n */\nexport async function* iteratePaginatedAPI<Args extends PaginatedArgs, Item>(\n listFn: (args: Args) => Promise<PaginatedList<Item>>,\n firstPageArgs: Args\n): AsyncIterableIterator<Item> {\n let nextCursor: string | null | undefined = firstPageArgs.start_cursor\n do {\n const response: PaginatedList<Item> = await listFn({\n ...firstPageArgs,\n start_cursor: nextCursor,\n })\n yield* response.results\n nextCursor = response.next_cursor\n } while (nextCursor)\n}\n\n/**\n * Collect all of the results of paginating an API into an in-memory array.\n *\n * Example (given a notion Client called `notion`):\n *\n * ```\n * const blocks = await collectPaginatedAPI(notion.blocks.children.list, {\n * block_id: parentBlockId,\n * })\n * // Do something with blocks.\n * ```\n *\n * @param listFn A bound function on the Notion client that represents a conforming paginated\n * API. Example: `notion.blocks.children.list`.\n * @param firstPageArgs Arguments that should be passed to the API on the first and subsequent\n * calls to the API. Any necessary `next_cursor` will be automatically populated by\n * this function. Example: `{ block_id: \"<my block id>\" }`\n */\nexport async function collectPaginatedAPI<Args extends PaginatedArgs, Item>(\n listFn: (args: Args) => Promise<PaginatedList<Item>>,\n firstPageArgs: Args\n): Promise<Item[]> {\n const results: Item[] = []\n for await (const item of iteratePaginatedAPI(listFn, firstPageArgs)) {\n results.push(item)\n }\n return results\n}\n\ntype DataSourceTemplate = ListDataSourceTemplatesResponse[\"templates\"][number]\n\ntype ListDataSourceTemplatesArgs = PaginatedArgs & {\n data_source_id: string\n name?: string\n page_size?: number\n}\n\n/**\n * Returns an async iterator over data source templates.\n *\n * Example (given a notion Client called `notion`):\n *\n * ```\n * for await (const template of iterateDataSourceTemplates(notion, {\n * data_source_id: dataSourceId,\n * })) {\n * console.log(template.name, template.is_default)\n * }\n * ```\n *\n * @param client A Notion client instance.\n * @param args Arguments including the data_source_id and optional start_cursor.\n */\nexport async function* iterateDataSourceTemplates(\n client: Client,\n args: ListDataSourceTemplatesArgs\n): AsyncIterableIterator<DataSourceTemplate> {\n let nextCursor: string | null | undefined = args.start_cursor\n do {\n const response: ListDataSourceTemplatesResponse =\n await client.dataSources.listTemplates({\n ...args,\n start_cursor: nextCursor,\n })\n yield* response.templates\n nextCursor = response.next_cursor\n } while (nextCursor)\n}\n\n/**\n * Collect all data source templates into an in-memory array.\n *\n * Example (given a notion Client called `notion`):\n *\n * ```\n * const templates = await collectDataSourceTemplates(notion, {\n * data_source_id: dataSourceId,\n * })\n * // Do something with templates.\n * ```\n *\n * @param client A Notion client instance.\n * @param args Arguments including the data_source_id and optional start_cursor.\n */\nexport async function collectDataSourceTemplates(\n client: Client,\n args: ListDataSourceTemplatesArgs\n): Promise<DataSourceTemplate[]> {\n const results: DataSourceTemplate[] = []\n for await (const template of iterateDataSourceTemplates(client, args)) {\n results.push(template)\n }\n return results\n}\n\ntype ObjectResponse =\n | PageObjectResponse\n | PartialPageObjectResponse\n | DataSourceObjectResponse\n | PartialDataSourceObjectResponse\n | DatabaseObjectResponse\n | PartialDatabaseObjectResponse\n | BlockObjectResponse\n | PartialBlockObjectResponse\n\n/**\n * @returns `true` if `response` is a full `BlockObjectResponse`.\n */\nexport function isFullBlock(\n response: ObjectResponse\n): response is BlockObjectResponse {\n return response.object === \"block\" && \"type\" in response\n}\n\n/**\n * @returns `true` if `response` is a full `PageObjectResponse`.\n */\nexport function isFullPage(\n response: ObjectResponse\n): response is PageObjectResponse {\n return response.object === \"page\" && \"url\" in response\n}\n\n/**\n * @returns `true` if `response` is a full `DataSourceObjectResponse`.\n */\nexport function isFullDataSource(\n response: ObjectResponse\n): response is DataSourceObjectResponse {\n return response.object === \"data_source\"\n}\n\n/**\n * @returns `true` if `response` is a full `DatabaseObjectResponse`.\n */\nexport function isFullDatabase(\n response: ObjectResponse\n): response is DatabaseObjectResponse {\n return response.object === \"database\"\n}\n\n/**\n * @returns `true` if `response` is a full `DataSourceObjectResponse` or a full\n * `PageObjectResponse`.\n *\n * Can be used on the results of the list response from `queryDataSource` or\n * `search` APIs.\n */\nexport function isFullPageOrDataSource(\n response: ObjectResponse\n): response is DataSourceObjectResponse | PageObjectResponse {\n if (response.object === \"data_source\") {\n return isFullDataSource(response)\n } else {\n return isFullPage(response)\n }\n}\n\n/**\n * @returns `true` if `response` is a full `UserObjectResponse`.\n */\nexport function isFullUser(\n response: UserObjectResponse | PartialUserObjectResponse\n): response is UserObjectResponse {\n return \"type\" in response\n}\n\n/**\n * @returns `true` if `response` is a full `CommentObjectResponse`.\n */\nexport function isFullComment(\n response: CommentObjectResponse | PartialCommentObjectResponse\n): response is CommentObjectResponse {\n return \"created_by\" in response\n}\n\n/**\n * @returns `true` if `response` is a full `DataSourceViewObjectResponse`.\n */\nexport function isFullView(\n response: DataSourceViewObjectResponse | PartialDataSourceViewObjectResponse\n): response is DataSourceViewObjectResponse {\n return \"type\" in response\n}\n\n/**\n * @returns `true` if `richText` is a `TextRichTextItemResponse`.\n */\nexport function isTextRichTextItemResponse(\n richText: RichTextItemResponse\n): richText is RichTextItemResponseCommon & TextRichTextItemResponse {\n return richText.type === \"text\"\n}\n\n/**\n * @returns `true` if `richText` is an `EquationRichTextItemResponse`.\n */\nexport function isEquationRichTextItemResponse(\n richText: RichTextItemResponse\n): richText is RichTextItemResponseCommon & EquationRichTextItemResponse {\n return richText.type === \"equation\"\n}\n\n/**\n * @returns `true` if `richText` is an `MentionRichTextItemResponse`.\n */\nexport function isMentionRichTextItemResponse(\n richText: RichTextItemResponse\n): richText is RichTextItemResponseCommon & MentionRichTextItemResponse {\n return richText.type === \"mention\"\n}\n\n/**\n * Extracts a Notion ID from a Notion URL or returns the input if it's already a valid ID.\n *\n * Prioritizes path IDs over query parameters to avoid extracting view IDs instead of database IDs.\n *\n * @param urlOrId A Notion URL or ID string\n * @returns The extracted UUID in standard format (with hyphens) or null if invalid\n *\n * @example\n * ```typescript\n * // Database URL with view ID - extracts database ID, not view ID\n * extractNotionId('https://notion.so/workspace/DB-abc123def456789012345678901234ab?v=viewid123')\n * // Returns: 'abc123de-f456-7890-1234-5678901234ab' (database ID)\n *\n * // Already formatted UUID\n * extractNotionId('12345678-1234-1234-1234-123456789abc')\n * // Returns: '12345678-1234-1234-1234-123456789abc'\n * ```\n */\nexport function extractNotionId(urlOrId: string): string | null {\n if (!urlOrId || typeof urlOrId !== \"string\") {\n return null\n }\n\n const trimmed = urlOrId.trim()\n\n // Check if it's already a properly formatted UUID\n const uuidRegex =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n if (uuidRegex.test(trimmed)) {\n return trimmed.toLowerCase()\n }\n\n // Check if it's a compact UUID (32 chars, no hyphens)\n const compactUuidRegex = /^[0-9a-f]{32}$/i\n if (compactUuidRegex.test(trimmed)) {\n return formatUuid(trimmed)\n }\n\n // Extract from URL - prioritize path over query parameters\n // This prevents extracting view IDs when database IDs are in the path\n const pathMatch = trimmed.match(/\\/[^/?#]*-([0-9a-f]{32})(?:[/?#]|$)/i)\n if (pathMatch && pathMatch[1]) {\n return formatUuid(pathMatch[1])\n }\n\n // Fallback to query parameters if no path ID found\n const queryMatch = trimmed.match(\n /[?&](?:p|page_id|database_id)=([0-9a-f]{32})/i\n )\n if (queryMatch && queryMatch[1]) {\n return formatUuid(queryMatch[1])\n }\n\n // Last resort: any 32-char hex string in the URL\n const anyMatch = trimmed.match(/([0-9a-f]{32})/i)\n if (anyMatch && anyMatch[1]) {\n return formatUuid(anyMatch[1])\n }\n\n return null\n}\n\n/**\n * Formats a 32-character hex string into a standard UUID format.\n * @param compactId 32-character hex string without hyphens\n * @returns UUID with hyphens in standard format\n */\nfunction formatUuid(compactId: string): string {\n const clean = compactId.toLowerCase()\n return `${clean.slice(0, 8)}-${clean.slice(8, 12)}-${clean.slice(\n 12,\n 16\n )}-${clean.slice(16, 20)}-${clean.slice(20, 32)}`\n}\n\n/**\n * Extracts a database ID from a Notion database URL.\n * Convenience wrapper around `extractNotionId`.\n */\nexport function extractDatabaseId(databaseUrl: string): string | null {\n return extractNotionId(databaseUrl)\n}\n\n/**\n * Extracts a page ID from a Notion page URL.\n * Convenience wrapper around `extractNotionId`.\n */\nexport function extractPageId(pageUrl: string): string | null {\n return extractNotionId(pageUrl)\n}\n\n/**\n * Extracts a block ID from a Notion URL with a block fragment.\n * Looks for #block-<id> or #<id> patterns.\n */\nexport function extractBlockId(urlWithBlock: string): string | null {\n if (!urlWithBlock || typeof urlWithBlock !== \"string\") {\n return null\n }\n\n // Look for block fragment in URL (#block-32chars or just #32chars)\n const blockMatch = urlWithBlock.match(/#(?:block-)?([0-9a-f]{32})/i)\n if (blockMatch && blockMatch[1]) {\n return formatUuid(blockMatch[1])\n }\n\n return null\n}\n"]}
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BlockObjectResponse,\n CommentObjectResponse,\n DatabaseObjectResponse,\n DataSourceObjectResponse,\n DataSourceViewObjectResponse,\n EquationRichTextItemResponse,\n GroupFilterOperatorArray,\n ListDataSourceTemplatesResponse,\n MentionRichTextItemResponse,\n PageObjectResponse,\n PartialBlockObjectResponse,\n PartialCommentObjectResponse,\n PartialDatabaseObjectResponse,\n PartialDataSourceObjectResponse,\n PartialDataSourceViewObjectResponse,\n PartialPageObjectResponse,\n PartialUserObjectResponse,\n PropertyFilter,\n QueryDataSourceParameters,\n QueryDataSourceResponse,\n RichTextItemResponse,\n RichTextItemResponseCommon,\n TextRichTextItemResponse,\n TimestampFilter,\n UserObjectResponse,\n} from \"./api-endpoints\"\nimport type Client from \"./Client\"\n\ntype PaginatedArgs = {\n start_cursor?: string\n}\n\ntype PaginatedList<T> = {\n object: \"list\"\n results: T[]\n next_cursor: string | null\n has_more: boolean\n}\n\n/**\n * Returns an async iterator over the results of any paginated Notion API.\n *\n * Example (given a notion Client called `notion`):\n *\n * ```\n * for await (const block of iteratePaginatedAPI(notion.blocks.children.list, {\n * block_id: parentBlockId,\n * })) {\n * // Do something with block.\n * }\n * ```\n *\n * @param listFn A bound function on the Notion client that represents a conforming paginated\n * API. Example: `notion.blocks.children.list`.\n * @param firstPageArgs Arguments that should be passed to the API on the first and subsequent\n * calls to the API. Any necessary `next_cursor` will be automatically populated by\n * this function. Example: `{ block_id: \"<my block id>\" }`\n */\nexport async function* iteratePaginatedAPI<Args extends PaginatedArgs, Item>(\n listFn: (args: Args) => Promise<PaginatedList<Item>>,\n firstPageArgs: Args\n): AsyncIterableIterator<Item> {\n let nextCursor: string | null | undefined = firstPageArgs.start_cursor\n do {\n const response: PaginatedList<Item> = await listFn({\n ...firstPageArgs,\n start_cursor: nextCursor,\n })\n yield* response.results\n nextCursor = response.next_cursor\n } while (nextCursor)\n}\n\n/**\n * Collect all of the results of paginating an API into an in-memory array.\n *\n * Example (given a notion Client called `notion`):\n *\n * ```\n * const blocks = await collectPaginatedAPI(notion.blocks.children.list, {\n * block_id: parentBlockId,\n * })\n * // Do something with blocks.\n * ```\n *\n * @param listFn A bound function on the Notion client that represents a conforming paginated\n * API. Example: `notion.blocks.children.list`.\n * @param firstPageArgs Arguments that should be passed to the API on the first and subsequent\n * calls to the API. Any necessary `next_cursor` will be automatically populated by\n * this function. Example: `{ block_id: \"<my block id>\" }`\n */\nexport async function collectPaginatedAPI<Args extends PaginatedArgs, Item>(\n listFn: (args: Args) => Promise<PaginatedList<Item>>,\n firstPageArgs: Args\n): Promise<Item[]> {\n const results: Item[] = []\n for await (const item of iteratePaginatedAPI(listFn, firstPageArgs)) {\n results.push(item)\n }\n return results\n}\n\ntype DataSourceTemplate = ListDataSourceTemplatesResponse[\"templates\"][number]\n\ntype ListDataSourceTemplatesArgs = PaginatedArgs & {\n data_source_id: string\n name?: string\n page_size?: number\n}\n\n/**\n * Returns an async iterator over data source templates.\n *\n * Example (given a notion Client called `notion`):\n *\n * ```\n * for await (const template of iterateDataSourceTemplates(notion, {\n * data_source_id: dataSourceId,\n * })) {\n * console.log(template.name, template.is_default)\n * }\n * ```\n *\n * @param client A Notion client instance.\n * @param args Arguments including the data_source_id and optional start_cursor.\n */\nexport async function* iterateDataSourceTemplates(\n client: Client,\n args: ListDataSourceTemplatesArgs\n): AsyncIterableIterator<DataSourceTemplate> {\n let nextCursor: string | null | undefined = args.start_cursor\n do {\n const response: ListDataSourceTemplatesResponse =\n await client.dataSources.listTemplates({\n ...args,\n start_cursor: nextCursor,\n })\n yield* response.templates\n nextCursor = response.next_cursor\n } while (nextCursor)\n}\n\n/**\n * Collect all data source templates into an in-memory array.\n *\n * Example (given a notion Client called `notion`):\n *\n * ```\n * const templates = await collectDataSourceTemplates(notion, {\n * data_source_id: dataSourceId,\n * })\n * // Do something with templates.\n * ```\n *\n * @param client A Notion client instance.\n * @param args Arguments including the data_source_id and optional start_cursor.\n */\nexport async function collectDataSourceTemplates(\n client: Client,\n args: ListDataSourceTemplatesArgs\n): Promise<DataSourceTemplate[]> {\n const results: DataSourceTemplate[] = []\n for await (const template of iterateDataSourceTemplates(client, args)) {\n results.push(template)\n }\n return results\n}\n\ntype DataSourceRow = QueryDataSourceResponse[\"results\"][number]\n\n/**\n * A filter the full-query helpers can combine with a created_time window bound.\n *\n * A top-level `or` filter is intentionally excluded: the helpers add a\n * created_time lower bound with `and`, and Notion only supports two levels of\n * filter nesting, so an `or` at the root leaves no room for the bound. Express\n * such queries as an `and` group, or run the helper once per `or` branch and\n * merge the results.\n */\nexport type FullDataSourceQueryFilter =\n | PropertyFilter\n | TimestampFilter\n | { and: GroupFilterOperatorArray }\n\n/**\n * Arguments for the full-query helpers. The same as `dataSources.query`, minus\n * the fields the helper controls: `start_cursor` (pagination is automatic) and\n * `sorts` (the helper sorts by created_time to partition). `filter` is narrowed\n * to {@link FullDataSourceQueryFilter}.\n */\nexport type FullDataSourceQueryArgs = Omit<\n QueryDataSourceParameters,\n \"start_cursor\" | \"sorts\" | \"filter\"\n> & {\n filter?: FullDataSourceQueryFilter\n}\n\n/**\n * Iterate over every row of a data source, including rows past the per-query\n * result limit that `dataSources.query` enforces on large data sources.\n *\n * A single query (one filter and sort) returns at most a fixed number of rows\n * (10,000 by default). Once that limit is reached, `has_more` becomes `false`\n * and the response carries `request_status.type === \"incomplete\"`. Plain\n * pagination such as {@link iteratePaginatedAPI} stops there and silently\n * misses the rest of the data source.\n *\n * This helper works around the limit by partitioning the data source into\n * created_time windows. It sorts by created_time ascending; whenever a window\n * reaches the limit, it starts a fresh query from the last row's created_time.\n * Each fresh query has a different filter, so it gets its own result budget.\n * Rows that share a boundary timestamp are de-duplicated by id, so every row is\n * yielded exactly once.\n *\n * created_time is used because it never changes. last_edited_time would shift\n * rows between windows as they are edited, causing gaps or duplicates.\n *\n * Throws if a single created_time value holds more rows than the limit, since\n * the window cannot be narrowed by time alone. Add a filter in that case so\n * each window stays under the limit.\n *\n * Example (given a notion Client called `notion`):\n *\n * ```\n * for await (const row of iterateAllDataSourceRows(notion, {\n * data_source_id: dataSourceId,\n * })) {\n * // Do something with row.\n * }\n * ```\n *\n * @param client A Notion client instance.\n * @param args Query arguments. `start_cursor` and `sorts` are managed by the\n * helper; `filter` is combined with the created_time window bound.\n */\nexport async function* iterateAllDataSourceRows(\n client: Client,\n args: FullDataSourceQueryArgs\n): AsyncIterableIterator<DataSourceRow> {\n const seenRowIds = new Set<string>()\n let windowStart: string | undefined = undefined\n\n for (;;) {\n let limitReached = false\n let lastCreatedTime: string | undefined = undefined\n let cursor: string | undefined = undefined\n\n do {\n const response = await client.dataSources.query({\n ...args,\n sorts: [{ timestamp: \"created_time\", direction: \"ascending\" }],\n filter: createdTimeLowerBound(args.filter, windowStart),\n start_cursor: cursor,\n })\n for (const row of response.results) {\n // Wiki data sources can return child data-source rows alongside pages.\n // Both carry created_time and either can be the window's boundary row,\n // so advance on either; reading only pages would stall a window made up\n // of data-source rows and throw spuriously.\n if (isFullPageOrDataSource(row)) {\n lastCreatedTime = row.created_time\n }\n if (!seenRowIds.has(row.id)) {\n seenRowIds.add(row.id)\n yield row\n }\n }\n if (response.request_status?.type === \"incomplete\") {\n limitReached = true\n }\n cursor = response.next_cursor ?? undefined\n } while (cursor)\n\n if (!limitReached) {\n return\n }\n if (lastCreatedTime === undefined || lastCreatedTime === windowStart) {\n throw new Error(\n \"iterateAllDataSourceRows cannot make progress: the per-query result \" +\n \"limit was reached but the created_time window could not advance \" +\n `past ${String(lastCreatedTime)}. More rows share this timestamp ` +\n \"than the limit allows. Add a filter to narrow the query.\"\n )\n }\n windowStart = lastCreatedTime\n }\n}\n\n/**\n * Collect every row of a data source into an in-memory array, including rows\n * past the per-query result limit. See {@link iterateAllDataSourceRows} for how\n * the limit is handled.\n *\n * Before using this, check that the full data source fits in memory. For very\n * large data sources, prefer {@link iterateAllDataSourceRows} and process rows\n * as they stream.\n *\n * Example (given a notion Client called `notion`):\n *\n * ```\n * const rows = await collectAllDataSourceRows(notion, {\n * data_source_id: dataSourceId,\n * })\n * // Do something with rows.\n * ```\n *\n * @param client A Notion client instance.\n * @param args Query arguments. See {@link iterateAllDataSourceRows}.\n */\nexport async function collectAllDataSourceRows(\n client: Client,\n args: FullDataSourceQueryArgs\n): Promise<DataSourceRow[]> {\n const rows: DataSourceRow[] = []\n for await (const row of iterateAllDataSourceRows(client, args)) {\n rows.push(row)\n }\n return rows\n}\n\n/**\n * Combine a caller-provided filter with the created_time lower bound used to\n * advance the partition window. Returns the filter unchanged for the first\n * window, which has no bound yet.\n */\nfunction createdTimeLowerBound(\n filter: FullDataSourceQueryFilter | undefined,\n windowStart: string | undefined\n): FullDataSourceQueryFilter | undefined {\n if (windowStart === undefined) {\n return filter\n }\n const bound: TimestampFilter = {\n timestamp: \"created_time\",\n created_time: { on_or_after: windowStart },\n }\n if (filter === undefined) {\n return bound\n }\n if (\"and\" in filter) {\n return { and: [...filter.and, bound] }\n }\n return { and: [filter, bound] }\n}\n\ntype ObjectResponse =\n | PageObjectResponse\n | PartialPageObjectResponse\n | DataSourceObjectResponse\n | PartialDataSourceObjectResponse\n | DatabaseObjectResponse\n | PartialDatabaseObjectResponse\n | BlockObjectResponse\n | PartialBlockObjectResponse\n\n/**\n * @returns `true` if `response` is a full `BlockObjectResponse`.\n */\nexport function isFullBlock(\n response: ObjectResponse\n): response is BlockObjectResponse {\n return response.object === \"block\" && \"type\" in response\n}\n\n/**\n * @returns `true` if `response` is a full `PageObjectResponse`.\n */\nexport function isFullPage(\n response: ObjectResponse\n): response is PageObjectResponse {\n return response.object === \"page\" && \"url\" in response\n}\n\n/**\n * @returns `true` if `response` is a full `DataSourceObjectResponse`.\n */\nexport function isFullDataSource(\n response: ObjectResponse\n): response is DataSourceObjectResponse {\n return response.object === \"data_source\"\n}\n\n/**\n * @returns `true` if `response` is a full `DatabaseObjectResponse`.\n */\nexport function isFullDatabase(\n response: ObjectResponse\n): response is DatabaseObjectResponse {\n return response.object === \"database\"\n}\n\n/**\n * @returns `true` if `response` is a full `DataSourceObjectResponse` or a full\n * `PageObjectResponse`.\n *\n * Can be used on the results of the list response from `queryDataSource` or\n * `search` APIs.\n */\nexport function isFullPageOrDataSource(\n response: ObjectResponse\n): response is DataSourceObjectResponse | PageObjectResponse {\n if (response.object === \"data_source\") {\n return isFullDataSource(response)\n } else {\n return isFullPage(response)\n }\n}\n\n/**\n * @returns `true` if `response` is a full `UserObjectResponse`.\n */\nexport function isFullUser(\n response: UserObjectResponse | PartialUserObjectResponse\n): response is UserObjectResponse {\n return \"type\" in response\n}\n\n/**\n * @returns `true` if `response` is a full `CommentObjectResponse`.\n */\nexport function isFullComment(\n response: CommentObjectResponse | PartialCommentObjectResponse\n): response is CommentObjectResponse {\n return \"created_by\" in response\n}\n\n/**\n * @returns `true` if `response` is a full `DataSourceViewObjectResponse`.\n */\nexport function isFullView(\n response: DataSourceViewObjectResponse | PartialDataSourceViewObjectResponse\n): response is DataSourceViewObjectResponse {\n return \"type\" in response\n}\n\n/**\n * @returns `true` if `richText` is a `TextRichTextItemResponse`.\n */\nexport function isTextRichTextItemResponse(\n richText: RichTextItemResponse\n): richText is RichTextItemResponseCommon & TextRichTextItemResponse {\n return richText.type === \"text\"\n}\n\n/**\n * @returns `true` if `richText` is an `EquationRichTextItemResponse`.\n */\nexport function isEquationRichTextItemResponse(\n richText: RichTextItemResponse\n): richText is RichTextItemResponseCommon & EquationRichTextItemResponse {\n return richText.type === \"equation\"\n}\n\n/**\n * @returns `true` if `richText` is an `MentionRichTextItemResponse`.\n */\nexport function isMentionRichTextItemResponse(\n richText: RichTextItemResponse\n): richText is RichTextItemResponseCommon & MentionRichTextItemResponse {\n return richText.type === \"mention\"\n}\n\n/**\n * Extracts a Notion ID from a Notion URL or returns the input if it's already a valid ID.\n *\n * Prioritizes path IDs over query parameters to avoid extracting view IDs instead of database IDs.\n *\n * @param urlOrId A Notion URL or ID string\n * @returns The extracted UUID in standard format (with hyphens) or null if invalid\n *\n * @example\n * ```typescript\n * // Database URL with view ID - extracts database ID, not view ID\n * extractNotionId('https://notion.so/workspace/DB-abc123def456789012345678901234ab?v=viewid123')\n * // Returns: 'abc123de-f456-7890-1234-5678901234ab' (database ID)\n *\n * // Already formatted UUID\n * extractNotionId('12345678-1234-1234-1234-123456789abc')\n * // Returns: '12345678-1234-1234-1234-123456789abc'\n * ```\n */\nexport function extractNotionId(urlOrId: string): string | null {\n if (!urlOrId || typeof urlOrId !== \"string\") {\n return null\n }\n\n const trimmed = urlOrId.trim()\n\n // Check if it's already a properly formatted UUID\n const uuidRegex =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n if (uuidRegex.test(trimmed)) {\n return trimmed.toLowerCase()\n }\n\n // Check if it's a compact UUID (32 chars, no hyphens)\n const compactUuidRegex = /^[0-9a-f]{32}$/i\n if (compactUuidRegex.test(trimmed)) {\n return formatUuid(trimmed)\n }\n\n // Extract from URL - prioritize path over query parameters\n // This prevents extracting view IDs when database IDs are in the path\n const pathMatch = trimmed.match(/\\/[^/?#]*-([0-9a-f]{32})(?:[/?#]|$)/i)\n if (pathMatch && pathMatch[1]) {\n return formatUuid(pathMatch[1])\n }\n\n // Fallback to query parameters if no path ID found\n const queryMatch = trimmed.match(\n /[?&](?:p|page_id|database_id)=([0-9a-f]{32})/i\n )\n if (queryMatch && queryMatch[1]) {\n return formatUuid(queryMatch[1])\n }\n\n // Last resort: any 32-char hex string in the URL\n const anyMatch = trimmed.match(/([0-9a-f]{32})/i)\n if (anyMatch && anyMatch[1]) {\n return formatUuid(anyMatch[1])\n }\n\n return null\n}\n\n/**\n * Formats a 32-character hex string into a standard UUID format.\n * @param compactId 32-character hex string without hyphens\n * @returns UUID with hyphens in standard format\n */\nfunction formatUuid(compactId: string): string {\n const clean = compactId.toLowerCase()\n return `${clean.slice(0, 8)}-${clean.slice(8, 12)}-${clean.slice(\n 12,\n 16\n )}-${clean.slice(16, 20)}-${clean.slice(20, 32)}`\n}\n\n/**\n * Extracts a database ID from a Notion database URL.\n * Convenience wrapper around `extractNotionId`.\n */\nexport function extractDatabaseId(databaseUrl: string): string | null {\n return extractNotionId(databaseUrl)\n}\n\n/**\n * Extracts a page ID from a Notion page URL.\n * Convenience wrapper around `extractNotionId`.\n */\nexport function extractPageId(pageUrl: string): string | null {\n return extractNotionId(pageUrl)\n}\n\n/**\n * Extracts a block ID from a Notion URL with a block fragment.\n * Looks for #block-<id> or #<id> patterns.\n */\nexport function extractBlockId(urlWithBlock: string): string | null {\n if (!urlWithBlock || typeof urlWithBlock !== \"string\") {\n return null\n }\n\n // Look for block fragment in URL (#block-32chars or just #32chars)\n const blockMatch = urlWithBlock.match(/#(?:block-)?([0-9a-f]{32})/i)\n if (blockMatch && blockMatch[1]) {\n return formatUuid(blockMatch[1])\n }\n\n return null\n}\n"]}
|
package/build/src/index.d.ts
CHANGED
|
@@ -6,13 +6,16 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @packageDocumentation
|
|
8
8
|
*/
|
|
9
|
-
export type { AppendBlockChildrenParameters, AppendBlockChildrenResponse, AudioBlockObjectResponse, BlockObjectRequest, BlockObjectResponse, BookmarkBlockObjectResponse, BotUserObjectResponse, BreadcrumbBlockObjectResponse, BulletedListItemBlockObjectResponse, ButtonPropertyItemObjectResponse, CalloutBlockObjectResponse, CheckboxPropertyItemObjectResponse, ChildDatabaseBlockObjectResponse, ChildPageBlockObjectResponse, CodeBlockObjectResponse, ColumnBlockObjectResponse, ColumnListBlockObjectResponse, CommentObjectResponse, CompleteFileUploadParameters, CompleteFileUploadResponse, CreateCommentParameters, CreateCommentResponse, CreateDatabaseParameters, CreateDatabaseResponse, CreateDataSourceParameters, CreateDataSourceResponse, CreateViewParameters, CreateViewResponse, CreateViewQueryParameters, CreateViewQueryResponse, DashboardRowResponse, DashboardWidgetResponse, CreatedByPropertyItemObjectResponse, CreatedTimePropertyItemObjectResponse, CreateFileUploadParameters, CreateFileUploadResponse, CreatePageParameters, CreatePageResponse, DatabaseObjectResponse, DataSourceObjectResponse, DataSourceViewObjectResponse, DatePropertyItemObjectResponse, DeleteBlockParameters, DeleteBlockResponse, DeleteCommentParameters, DeleteCommentResponse, DeletedViewQueryResponse, DeleteViewParameters, DeleteViewResponse, DeleteViewQueryParameters, DeleteViewQueryResponse, DividerBlockObjectResponse, EmailPropertyItemObjectResponse, EmbedBlockObjectResponse, EquationBlockObjectResponse, EquationRichTextItemResponse, FileBlockObjectResponse, FilesPropertyItemObjectResponse, FileUploadObjectResponse, FormulaPropertyItemObjectResponse, GetBlockParameters, GetBlockResponse, GetCommentParameters, GetCommentResponse, GetDatabaseParameters, GetDatabaseResponse, GetDataSourceParameters, GetDataSourceResponse, GetFileUploadParameters, GetFileUploadResponse, GetPageParameters, GetPagePropertyParameters, GetPagePropertyResponse, GetPageResponse, GetSelfParameters, GetSelfResponse, GetUserParameters, GetUserResponse, GetViewParameters, GetViewResponse, GetViewQueryResultsParameters, GetViewQueryResultsResponse, GroupObjectResponse, Heading1BlockObjectResponse, Heading2BlockObjectResponse, Heading3BlockObjectResponse, ImageBlockObjectResponse, LastEditedByPropertyItemObjectResponse, LastEditedTimePropertyItemObjectResponse, LinkPreviewBlockObjectResponse, LinkToPageBlockObjectResponse, ListBlockChildrenParameters, ListBlockChildrenResponse, ListCommentsParameters, ListCommentsResponse, ListCustomEmojisParameters, ListCustomEmojisResponse, CustomEmojiResponse, ListDatabaseViewsParameters, ListDatabaseViewsResponse, ListFileUploadsParameters, ListFileUploadsResponse, ListUsersParameters, ListUsersResponse, MeetingNotesBlockObjectResponse, MentionRichTextItemResponse, MovePageParameters, MovePageResponse, MultiSelectPropertyItemObjectResponse, NumberedListItemBlockObjectResponse, NumberPropertyItemObjectResponse, OauthIntrospectParameters, OauthIntrospectResponse, OauthRevokeParameters, OauthRevokeResponse, OauthTokenParameters, OauthTokenResponse, PageObjectResponse, ParagraphBlockObjectResponse, PartialBlockObjectResponse, PartialCommentObjectResponse, PartialDatabaseObjectResponse, PartialDataSourceObjectResponse, PartialDataSourceViewObjectResponse, PartialPageObjectResponse, PartialUserObjectResponse, PdfBlockObjectResponse, PeoplePropertyItemObjectResponse, PersonUserObjectResponse, PhoneNumberPropertyItemObjectResponse, PropertyItemListResponse, PropertyItemObjectResponse, QueryDataSourceParameters, QueryDataSourceResponse, QuoteBlockObjectResponse, RelationPropertyItemObjectResponse, RichTextItemResponse, RichTextPropertyItemObjectResponse, RollupPropertyItemObjectResponse, SearchParameters, SearchResponse, SelectPropertyItemObjectResponse, SendFileUploadParameters, SendFileUploadResponse, StatusPropertyItemObjectResponse, SyncedBlockBlockObjectResponse, TableBlockObjectResponse, TableOfContentsBlockObjectResponse, TableRowBlockObjectResponse, TemplateBlockObjectResponse, TextRichTextItemResponse, TitlePropertyItemObjectResponse, ToDoBlockObjectResponse, ToggleBlockObjectResponse, TranscriptionBlockObjectResponse, UniqueIdPropertyItemObjectResponse, UnsupportedBlockObjectResponse, UpdateBlockParameters, UpdateBlockResponse, UpdateCommentParameters, UpdateCommentResponse, UpdateDatabaseParameters, UpdateDatabaseResponse, UpdateDataSourceParameters, UpdateDataSourceResponse, UpdatePageParameters, UpdatePageResponse, UpdateViewParameters, UpdateViewResponse, UrlPropertyItemObjectResponse, UserObjectResponse, ViewQueryResponse, VerificationPropertyItemObjectResponse, VideoBlockObjectResponse, BaseWebhookPayload, CommentCreatedWebhookPayload, CommentDeletedWebhookPayload, CommentUpdatedWebhookPayload, DataSourceContentUpdatedWebhookPayload, DataSourceCreatedWebhookPayload, DataSourceDeletedWebhookPayload, DataSourceMovedWebhookPayload, DataSourceSchemaUpdatedWebhookPayload, DataSourceUndeletedWebhookPayload, DatabaseContentUpdatedWebhookPayload, DatabaseCreatedWebhookPayload, DatabaseDeletedWebhookPayload, DatabaseMovedWebhookPayload, DatabaseSchemaUpdatedWebhookPayload, DatabaseUndeletedWebhookPayload, FileUploadCompletedWebhookPayload, FileUploadCreatedWebhookPayload, FileUploadExpiredWebhookPayload, FileUploadUploadFailedWebhookPayload, PageContentUpdatedWebhookPayload, PageCreatedWebhookPayload, PageDeletedWebhookPayload, PageLockedWebhookPayload, PageMovedWebhookPayload, PagePropertiesUpdatedWebhookPayload, PageTranscriptionBlockTranscriptDeletedWebhookPayload, PageUndeletedWebhookPayload, PageUnlockedWebhookPayload, ViewCreatedWebhookPayload, ViewDeletedWebhookPayload, ViewUpdatedWebhookPayload, } from "./api-endpoints";
|
|
9
|
+
export type { AppendBlockChildrenParameters, AppendBlockChildrenResponse, AudioBlockObjectResponse, BlockObjectRequest, BlockObjectResponse, BookmarkBlockObjectResponse, BotUserObjectResponse, BreadcrumbBlockObjectResponse, BulletedListItemBlockObjectResponse, ButtonPropertyItemObjectResponse, CalloutBlockObjectResponse, CheckboxPropertyItemObjectResponse, ChildDatabaseBlockObjectResponse, ChildPageBlockObjectResponse, CodeBlockObjectResponse, ColumnBlockObjectResponse, ColumnListBlockObjectResponse, CommentObjectResponse, CompleteFileUploadParameters, CompleteFileUploadResponse, CreateCommentParameters, CreateCommentResponse, CreateDatabaseParameters, CreateDatabaseResponse, CreateDataSourceParameters, CreateDataSourceResponse, CreateViewParameters, CreateViewResponse, CreateViewQueryParameters, CreateViewQueryResponse, DashboardRowResponse, DashboardWidgetResponse, CreatedByPropertyItemObjectResponse, CreatedTimePropertyItemObjectResponse, CreateFileUploadParameters, CreateFileUploadResponse, CreatePageParameters, CreatePageResponse, DatabaseObjectResponse, DataSourceObjectResponse, DataSourceViewObjectResponse, DatePropertyItemObjectResponse, DeleteBlockParameters, DeleteBlockResponse, DeleteCommentParameters, DeleteCommentResponse, DeletedViewQueryResponse, DeleteViewParameters, DeleteViewResponse, DeleteViewQueryParameters, DeleteViewQueryResponse, DividerBlockObjectResponse, EmailPropertyItemObjectResponse, EmbedBlockObjectResponse, EquationBlockObjectResponse, EquationRichTextItemResponse, FileBlockObjectResponse, FilesPropertyItemObjectResponse, FileUploadObjectResponse, FormulaPropertyItemObjectResponse, GetAsyncTaskParameters, GetAsyncTaskResponse, GetBlockParameters, GetBlockResponse, GetCommentParameters, GetCommentResponse, GetDatabaseParameters, GetDatabaseResponse, GetDataSourceParameters, GetDataSourceResponse, GetFileUploadParameters, GetFileUploadResponse, GetPageParameters, GetPagePropertyParameters, GetPagePropertyResponse, GetPageResponse, GetSelfParameters, GetSelfResponse, GetUserParameters, GetUserResponse, GetViewParameters, GetViewResponse, GetViewQueryResultsParameters, GetViewQueryResultsResponse, GroupObjectResponse, Heading1BlockObjectResponse, Heading2BlockObjectResponse, Heading3BlockObjectResponse, ImageBlockObjectResponse, LastEditedByPropertyItemObjectResponse, LastEditedTimePropertyItemObjectResponse, LinkPreviewBlockObjectResponse, LinkToPageBlockObjectResponse, ListBlockChildrenParameters, ListBlockChildrenResponse, ListCommentsParameters, ListCommentsResponse, ListCustomEmojisParameters, ListCustomEmojisResponse, CustomEmojiResponse, ListDatabaseViewsParameters, ListDatabaseViewsResponse, ListFileUploadsParameters, ListFileUploadsResponse, ListUsersParameters, ListUsersResponse, MeetingNotesBlockObjectResponse, MentionRichTextItemResponse, MovePageParameters, MovePageResponse, MultiSelectPropertyItemObjectResponse, NumberedListItemBlockObjectResponse, NumberPropertyItemObjectResponse, OauthIntrospectParameters, OauthIntrospectResponse, OauthRevokeParameters, OauthRevokeResponse, OauthTokenParameters, OauthTokenResponse, PageObjectResponse, ParagraphBlockObjectResponse, PartialBlockObjectResponse, PartialCommentObjectResponse, PartialDatabaseObjectResponse, PartialDataSourceObjectResponse, PartialDataSourceViewObjectResponse, PartialPageObjectResponse, PartialUserObjectResponse, PdfBlockObjectResponse, PeoplePropertyItemObjectResponse, PersonUserObjectResponse, PhoneNumberPropertyItemObjectResponse, PropertyItemListResponse, PropertyItemObjectResponse, PublicApiAsyncTaskStatusResultJsonValue, QueryDataSourceParameters, QueryDataSourceResponse, QuoteBlockObjectResponse, RelationPropertyItemObjectResponse, RichTextItemResponse, RichTextPropertyItemObjectResponse, RollupPropertyItemObjectResponse, SearchParameters, SearchResponse, SelectPropertyItemObjectResponse, SendFileUploadParameters, SendFileUploadResponse, StatusPropertyItemObjectResponse, SyncedBlockBlockObjectResponse, TableBlockObjectResponse, TableOfContentsBlockObjectResponse, TableRowBlockObjectResponse, TemplateBlockObjectResponse, TextRichTextItemResponse, TitlePropertyItemObjectResponse, ToDoBlockObjectResponse, ToggleBlockObjectResponse, TranscriptionBlockObjectResponse, UniqueIdPropertyItemObjectResponse, UnsupportedBlockObjectResponse, UpdateBlockParameters, UpdateBlockResponse, UpdateCommentParameters, UpdateCommentResponse, UpdateDatabaseParameters, UpdateDatabaseResponse, UpdateDataSourceParameters, UpdateDataSourceResponse, UpdatePageParameters, UpdatePageResponse, UpdateViewParameters, UpdateViewResponse, UrlPropertyItemObjectResponse, UserObjectResponse, ViewQueryResponse, VerificationPropertyItemObjectResponse, VideoBlockObjectResponse, BaseWebhookPayload, CommentCreatedWebhookPayload, CommentDeletedWebhookPayload, CommentUpdatedWebhookPayload, DataSourceContentUpdatedWebhookPayload, DataSourceCreatedWebhookPayload, DataSourceDeletedWebhookPayload, DataSourceMovedWebhookPayload, DataSourceSchemaUpdatedWebhookPayload, DataSourceUndeletedWebhookPayload, DatabaseContentUpdatedWebhookPayload, DatabaseCreatedWebhookPayload, DatabaseDeletedWebhookPayload, DatabaseMovedWebhookPayload, DatabaseSchemaUpdatedWebhookPayload, DatabaseUndeletedWebhookPayload, FileUploadCompletedWebhookPayload, FileUploadCreatedWebhookPayload, FileUploadExpiredWebhookPayload, FileUploadUploadFailedWebhookPayload, PageContentUpdatedWebhookPayload, PageCreatedWebhookPayload, PageDeletedWebhookPayload, PageLockedWebhookPayload, PageMovedWebhookPayload, PagePropertiesUpdatedWebhookPayload, PageTranscriptionBlockTranscriptDeletedWebhookPayload, PageUndeletedWebhookPayload, PageUnlockedWebhookPayload, ViewCreatedWebhookPayload, ViewDeletedWebhookPayload, ViewUpdatedWebhookPayload, } from "./api-endpoints";
|
|
10
10
|
export { default as Client } from "./Client";
|
|
11
11
|
export { LogLevel, Logger } from "./logging";
|
|
12
12
|
export { NotionErrorCode, APIErrorCode, ClientErrorCode, NotionClientError, APIResponseError, UnknownHTTPResponseError, RequestTimeoutError, InvalidPathParameterError, isNotionClientError, isHTTPResponseError, } from "./errors";
|
|
13
13
|
export type { RetryOptions } from "./Client";
|
|
14
14
|
export { DEFAULT_BASE_URL, DEFAULT_TIMEOUT_MS, DEFAULT_MAX_RETRIES, DEFAULT_INITIAL_RETRY_DELAY_MS, DEFAULT_MAX_RETRY_DELAY_MS, MIN_VIEW_COLUMN_WIDTH, } from "./constants";
|
|
15
|
-
export { collectPaginatedAPI, iteratePaginatedAPI, collectDataSourceTemplates, iterateDataSourceTemplates, isFullBlock, isFullDataSource, isFullDatabase, isFullPage, isFullUser, isFullComment, isFullView, isFullPageOrDataSource, extractNotionId, extractDatabaseId, extractPageId, extractBlockId, } from "./helpers";
|
|
15
|
+
export { collectPaginatedAPI, iteratePaginatedAPI, collectDataSourceTemplates, iterateDataSourceTemplates, iterateAllDataSourceRows, collectAllDataSourceRows, isFullBlock, isFullDataSource, isFullDatabase, isFullPage, isFullUser, isFullComment, isFullView, isFullPageOrDataSource, extractNotionId, extractDatabaseId, extractPageId, extractBlockId, } from "./helpers";
|
|
16
|
+
export type { FullDataSourceQueryArgs, FullDataSourceQueryFilter, } from "./helpers";
|
|
17
|
+
export { verifyWebhookSignature, signWebhookPayload } from "./webhooks";
|
|
18
|
+
export type { VerifyWebhookSignatureArgs } from "./webhooks";
|
|
16
19
|
export type { QueryMeetingNotesResponse } from "./api-endpoints/meeting-notes";
|
|
17
20
|
export type { QueryMeetingNotesParameters, MeetingNotesCombinatorFilter, MeetingNotesFilterNode, MeetingNotesPropertyFilter, MeetingNotesPropertyName, MeetingNotesSort, } from "./meeting-notes";
|
|
18
21
|
export { meetingNotesFilterableProperties } from "./meeting-notes";
|
package/build/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/build/src/index.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* @packageDocumentation
|
|
9
9
|
*/
|
|
10
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
-
exports.meetingNotesFilterableProperties = exports.extractBlockId = exports.extractPageId = exports.extractDatabaseId = exports.extractNotionId = exports.isFullPageOrDataSource = exports.isFullView = exports.isFullComment = exports.isFullUser = exports.isFullPage = exports.isFullDatabase = exports.isFullDataSource = exports.isFullBlock = exports.iterateDataSourceTemplates = exports.collectDataSourceTemplates = exports.iteratePaginatedAPI = exports.collectPaginatedAPI = exports.MIN_VIEW_COLUMN_WIDTH = exports.DEFAULT_MAX_RETRY_DELAY_MS = exports.DEFAULT_INITIAL_RETRY_DELAY_MS = exports.DEFAULT_MAX_RETRIES = exports.DEFAULT_TIMEOUT_MS = exports.DEFAULT_BASE_URL = exports.isHTTPResponseError = exports.isNotionClientError = exports.InvalidPathParameterError = exports.RequestTimeoutError = exports.UnknownHTTPResponseError = exports.APIResponseError = exports.ClientErrorCode = exports.APIErrorCode = exports.LogLevel = exports.Client = void 0;
|
|
11
|
+
exports.meetingNotesFilterableProperties = exports.signWebhookPayload = exports.verifyWebhookSignature = exports.extractBlockId = exports.extractPageId = exports.extractDatabaseId = exports.extractNotionId = exports.isFullPageOrDataSource = exports.isFullView = exports.isFullComment = exports.isFullUser = exports.isFullPage = exports.isFullDatabase = exports.isFullDataSource = exports.isFullBlock = exports.collectAllDataSourceRows = exports.iterateAllDataSourceRows = exports.iterateDataSourceTemplates = exports.collectDataSourceTemplates = exports.iteratePaginatedAPI = exports.collectPaginatedAPI = exports.MIN_VIEW_COLUMN_WIDTH = exports.DEFAULT_MAX_RETRY_DELAY_MS = exports.DEFAULT_INITIAL_RETRY_DELAY_MS = exports.DEFAULT_MAX_RETRIES = exports.DEFAULT_TIMEOUT_MS = exports.DEFAULT_BASE_URL = exports.isHTTPResponseError = exports.isNotionClientError = exports.InvalidPathParameterError = exports.RequestTimeoutError = exports.UnknownHTTPResponseError = exports.APIResponseError = exports.ClientErrorCode = exports.APIErrorCode = exports.LogLevel = exports.Client = void 0;
|
|
12
12
|
var Client_1 = require("./Client");
|
|
13
13
|
Object.defineProperty(exports, "Client", { enumerable: true, get: function () { return Client_1.default; } });
|
|
14
14
|
var logging_1 = require("./logging");
|
|
@@ -35,6 +35,8 @@ Object.defineProperty(exports, "collectPaginatedAPI", { enumerable: true, get: f
|
|
|
35
35
|
Object.defineProperty(exports, "iteratePaginatedAPI", { enumerable: true, get: function () { return helpers_1.iteratePaginatedAPI; } });
|
|
36
36
|
Object.defineProperty(exports, "collectDataSourceTemplates", { enumerable: true, get: function () { return helpers_1.collectDataSourceTemplates; } });
|
|
37
37
|
Object.defineProperty(exports, "iterateDataSourceTemplates", { enumerable: true, get: function () { return helpers_1.iterateDataSourceTemplates; } });
|
|
38
|
+
Object.defineProperty(exports, "iterateAllDataSourceRows", { enumerable: true, get: function () { return helpers_1.iterateAllDataSourceRows; } });
|
|
39
|
+
Object.defineProperty(exports, "collectAllDataSourceRows", { enumerable: true, get: function () { return helpers_1.collectAllDataSourceRows; } });
|
|
38
40
|
Object.defineProperty(exports, "isFullBlock", { enumerable: true, get: function () { return helpers_1.isFullBlock; } });
|
|
39
41
|
Object.defineProperty(exports, "isFullDataSource", { enumerable: true, get: function () { return helpers_1.isFullDataSource; } });
|
|
40
42
|
Object.defineProperty(exports, "isFullDatabase", { enumerable: true, get: function () { return helpers_1.isFullDatabase; } });
|
|
@@ -47,6 +49,9 @@ Object.defineProperty(exports, "extractNotionId", { enumerable: true, get: funct
|
|
|
47
49
|
Object.defineProperty(exports, "extractDatabaseId", { enumerable: true, get: function () { return helpers_1.extractDatabaseId; } });
|
|
48
50
|
Object.defineProperty(exports, "extractPageId", { enumerable: true, get: function () { return helpers_1.extractPageId; } });
|
|
49
51
|
Object.defineProperty(exports, "extractBlockId", { enumerable: true, get: function () { return helpers_1.extractBlockId; } });
|
|
52
|
+
var webhooks_1 = require("./webhooks");
|
|
53
|
+
Object.defineProperty(exports, "verifyWebhookSignature", { enumerable: true, get: function () { return webhooks_1.verifyWebhookSignature; } });
|
|
54
|
+
Object.defineProperty(exports, "signWebhookPayload", { enumerable: true, get: function () { return webhooks_1.signWebhookPayload; } });
|
|
50
55
|
var meeting_notes_1 = require("./meeting-notes");
|
|
51
56
|
Object.defineProperty(exports, "meetingNotesFilterableProperties", { enumerable: true, get: function () { return meeting_notes_1.meetingNotesFilterableProperties; } });
|
|
52
57
|
//# sourceMappingURL=index.js.map
|
package/build/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAsNH,mCAA4C;AAAnC,gGAAA,OAAO,OAAU;AAC1B,qCAA4C;AAAnC,mGAAA,QAAQ,OAAA;AACjB,mCAciB;AAXf,sGAAA,YAAY,OAAA;AACZ,yGAAA,eAAe,OAAA;AAGf,0GAAA,gBAAgB,OAAA;AAChB,kHAAA,wBAAwB,OAAA;AACxB,6GAAA,mBAAmB,OAAA;AACnB,mHAAA,yBAAyB,OAAA;AACzB,gBAAgB;AAChB,6GAAA,mBAAmB,OAAA;AACnB,6GAAA,mBAAmB,OAAA;AAGrB,yCAOoB;AANlB,6GAAA,gBAAgB,OAAA;AAChB,+GAAA,kBAAkB,OAAA;AAClB,gHAAA,mBAAmB,OAAA;AACnB,2HAAA,8BAA8B,OAAA;AAC9B,uHAAA,0BAA0B,OAAA;AAC1B,kHAAA,qBAAqB,OAAA;AAEvB,qCAmBkB;AAlBhB,8GAAA,mBAAmB,OAAA;AACnB,8GAAA,mBAAmB,OAAA;AACnB,qHAAA,0BAA0B,OAAA;AAC1B,qHAAA,0BAA0B,OAAA;AAC1B,mHAAA,wBAAwB,OAAA;AACxB,mHAAA,wBAAwB,OAAA;AACxB,sGAAA,WAAW,OAAA;AACX,2GAAA,gBAAgB,OAAA;AAChB,yGAAA,cAAc,OAAA;AACd,qGAAA,UAAU,OAAA;AACV,qGAAA,UAAU,OAAA;AACV,wGAAA,aAAa,OAAA;AACb,qGAAA,UAAU,OAAA;AACV,iHAAA,sBAAsB,OAAA;AACtB,0GAAA,eAAe,OAAA;AACf,4GAAA,iBAAiB,OAAA;AACjB,wGAAA,aAAa,OAAA;AACb,yGAAA,cAAc,OAAA;AAMhB,uCAAuE;AAA9D,kHAAA,sBAAsB,OAAA;AAAE,8GAAA,kBAAkB,OAAA;AAWnD,iDAAkE;AAAzD,iIAAA,gCAAgC,OAAA","sourcesContent":["/**\n * index.ts\n *\n * This file is the entry point for the Notion SDK.\n * It exports the Client class and all the API endpoints.\n *\n * @packageDocumentation\n */\n\nexport type {\n AppendBlockChildrenParameters,\n AppendBlockChildrenResponse,\n AudioBlockObjectResponse,\n BlockObjectRequest,\n BlockObjectResponse,\n BookmarkBlockObjectResponse,\n BotUserObjectResponse,\n BreadcrumbBlockObjectResponse,\n BulletedListItemBlockObjectResponse,\n ButtonPropertyItemObjectResponse,\n CalloutBlockObjectResponse,\n CheckboxPropertyItemObjectResponse,\n ChildDatabaseBlockObjectResponse,\n ChildPageBlockObjectResponse,\n CodeBlockObjectResponse,\n ColumnBlockObjectResponse,\n ColumnListBlockObjectResponse,\n CommentObjectResponse,\n CompleteFileUploadParameters,\n CompleteFileUploadResponse,\n CreateCommentParameters,\n CreateCommentResponse,\n CreateDatabaseParameters,\n CreateDatabaseResponse,\n CreateDataSourceParameters,\n CreateDataSourceResponse,\n CreateViewParameters,\n CreateViewResponse,\n CreateViewQueryParameters,\n CreateViewQueryResponse,\n DashboardRowResponse,\n DashboardWidgetResponse,\n CreatedByPropertyItemObjectResponse,\n CreatedTimePropertyItemObjectResponse,\n CreateFileUploadParameters,\n CreateFileUploadResponse,\n CreatePageParameters,\n CreatePageResponse,\n DatabaseObjectResponse,\n DataSourceObjectResponse,\n DataSourceViewObjectResponse,\n DatePropertyItemObjectResponse,\n DeleteBlockParameters,\n DeleteBlockResponse,\n DeleteCommentParameters,\n DeleteCommentResponse,\n DeletedViewQueryResponse,\n DeleteViewParameters,\n DeleteViewResponse,\n DeleteViewQueryParameters,\n DeleteViewQueryResponse,\n DividerBlockObjectResponse,\n EmailPropertyItemObjectResponse,\n EmbedBlockObjectResponse,\n EquationBlockObjectResponse,\n EquationRichTextItemResponse,\n FileBlockObjectResponse,\n FilesPropertyItemObjectResponse,\n FileUploadObjectResponse,\n FormulaPropertyItemObjectResponse,\n GetAsyncTaskParameters,\n GetAsyncTaskResponse,\n GetBlockParameters,\n GetBlockResponse,\n GetCommentParameters,\n GetCommentResponse,\n GetDatabaseParameters,\n GetDatabaseResponse,\n GetDataSourceParameters,\n GetDataSourceResponse,\n GetFileUploadParameters,\n GetFileUploadResponse,\n GetPageParameters,\n GetPagePropertyParameters,\n GetPagePropertyResponse,\n GetPageResponse,\n GetSelfParameters,\n GetSelfResponse,\n GetUserParameters,\n GetUserResponse,\n GetViewParameters,\n GetViewResponse,\n GetViewQueryResultsParameters,\n GetViewQueryResultsResponse,\n GroupObjectResponse,\n Heading1BlockObjectResponse,\n Heading2BlockObjectResponse,\n Heading3BlockObjectResponse,\n ImageBlockObjectResponse,\n LastEditedByPropertyItemObjectResponse,\n LastEditedTimePropertyItemObjectResponse,\n LinkPreviewBlockObjectResponse,\n LinkToPageBlockObjectResponse,\n ListBlockChildrenParameters,\n ListBlockChildrenResponse,\n ListCommentsParameters,\n ListCommentsResponse,\n ListCustomEmojisParameters,\n ListCustomEmojisResponse,\n CustomEmojiResponse,\n ListDatabaseViewsParameters,\n ListDatabaseViewsResponse,\n ListFileUploadsParameters,\n ListFileUploadsResponse,\n ListUsersParameters,\n ListUsersResponse,\n MeetingNotesBlockObjectResponse,\n MentionRichTextItemResponse,\n MovePageParameters,\n MovePageResponse,\n MultiSelectPropertyItemObjectResponse,\n NumberedListItemBlockObjectResponse,\n NumberPropertyItemObjectResponse,\n OauthIntrospectParameters,\n OauthIntrospectResponse,\n OauthRevokeParameters,\n OauthRevokeResponse,\n OauthTokenParameters,\n OauthTokenResponse,\n PageObjectResponse,\n ParagraphBlockObjectResponse,\n PartialBlockObjectResponse,\n PartialCommentObjectResponse,\n PartialDatabaseObjectResponse,\n PartialDataSourceObjectResponse,\n PartialDataSourceViewObjectResponse,\n PartialPageObjectResponse,\n PartialUserObjectResponse,\n PdfBlockObjectResponse,\n PeoplePropertyItemObjectResponse,\n PersonUserObjectResponse,\n PhoneNumberPropertyItemObjectResponse,\n PropertyItemListResponse,\n PropertyItemObjectResponse,\n PublicApiAsyncTaskStatusResultJsonValue,\n QueryDataSourceParameters,\n QueryDataSourceResponse,\n QuoteBlockObjectResponse,\n RelationPropertyItemObjectResponse,\n RichTextItemResponse,\n RichTextPropertyItemObjectResponse,\n RollupPropertyItemObjectResponse,\n SearchParameters,\n SearchResponse,\n SelectPropertyItemObjectResponse,\n SendFileUploadParameters,\n SendFileUploadResponse,\n StatusPropertyItemObjectResponse,\n SyncedBlockBlockObjectResponse,\n TableBlockObjectResponse,\n TableOfContentsBlockObjectResponse,\n TableRowBlockObjectResponse,\n TemplateBlockObjectResponse,\n TextRichTextItemResponse,\n TitlePropertyItemObjectResponse,\n ToDoBlockObjectResponse,\n ToggleBlockObjectResponse,\n TranscriptionBlockObjectResponse,\n UniqueIdPropertyItemObjectResponse,\n UnsupportedBlockObjectResponse,\n UpdateBlockParameters,\n UpdateBlockResponse,\n UpdateCommentParameters,\n UpdateCommentResponse,\n UpdateDatabaseParameters,\n UpdateDatabaseResponse,\n UpdateDataSourceParameters,\n UpdateDataSourceResponse,\n UpdatePageParameters,\n UpdatePageResponse,\n UpdateViewParameters,\n UpdateViewResponse,\n UrlPropertyItemObjectResponse,\n UserObjectResponse,\n ViewQueryResponse,\n VerificationPropertyItemObjectResponse,\n VideoBlockObjectResponse,\n // Webhook payload types\n BaseWebhookPayload,\n CommentCreatedWebhookPayload,\n CommentDeletedWebhookPayload,\n CommentUpdatedWebhookPayload,\n DataSourceContentUpdatedWebhookPayload,\n DataSourceCreatedWebhookPayload,\n DataSourceDeletedWebhookPayload,\n DataSourceMovedWebhookPayload,\n DataSourceSchemaUpdatedWebhookPayload,\n DataSourceUndeletedWebhookPayload,\n DatabaseContentUpdatedWebhookPayload,\n DatabaseCreatedWebhookPayload,\n DatabaseDeletedWebhookPayload,\n DatabaseMovedWebhookPayload,\n DatabaseSchemaUpdatedWebhookPayload,\n DatabaseUndeletedWebhookPayload,\n FileUploadCompletedWebhookPayload,\n FileUploadCreatedWebhookPayload,\n FileUploadExpiredWebhookPayload,\n FileUploadUploadFailedWebhookPayload,\n PageContentUpdatedWebhookPayload,\n PageCreatedWebhookPayload,\n PageDeletedWebhookPayload,\n PageLockedWebhookPayload,\n PageMovedWebhookPayload,\n PagePropertiesUpdatedWebhookPayload,\n PageTranscriptionBlockTranscriptDeletedWebhookPayload,\n PageUndeletedWebhookPayload,\n PageUnlockedWebhookPayload,\n ViewCreatedWebhookPayload,\n ViewDeletedWebhookPayload,\n ViewUpdatedWebhookPayload,\n} from \"./api-endpoints\"\nexport { default as Client } from \"./Client\"\nexport { LogLevel, Logger } from \"./logging\"\nexport {\n // Error codes\n NotionErrorCode,\n APIErrorCode,\n ClientErrorCode,\n // Error types\n NotionClientError,\n APIResponseError,\n UnknownHTTPResponseError,\n RequestTimeoutError,\n InvalidPathParameterError,\n // Error helpers\n isNotionClientError,\n isHTTPResponseError,\n} from \"./errors\"\nexport type { RetryOptions } from \"./Client\"\nexport {\n DEFAULT_BASE_URL,\n DEFAULT_TIMEOUT_MS,\n DEFAULT_MAX_RETRIES,\n DEFAULT_INITIAL_RETRY_DELAY_MS,\n DEFAULT_MAX_RETRY_DELAY_MS,\n MIN_VIEW_COLUMN_WIDTH,\n} from \"./constants\"\nexport {\n collectPaginatedAPI,\n iteratePaginatedAPI,\n collectDataSourceTemplates,\n iterateDataSourceTemplates,\n iterateAllDataSourceRows,\n collectAllDataSourceRows,\n isFullBlock,\n isFullDataSource,\n isFullDatabase,\n isFullPage,\n isFullUser,\n isFullComment,\n isFullView,\n isFullPageOrDataSource,\n extractNotionId,\n extractDatabaseId,\n extractPageId,\n extractBlockId,\n} from \"./helpers\"\nexport type {\n FullDataSourceQueryArgs,\n FullDataSourceQueryFilter,\n} from \"./helpers\"\nexport { verifyWebhookSignature, signWebhookPayload } from \"./webhooks\"\nexport type { VerifyWebhookSignatureArgs } from \"./webhooks\"\nexport type { QueryMeetingNotesResponse } from \"./api-endpoints/meeting-notes\"\nexport type {\n QueryMeetingNotesParameters,\n MeetingNotesCombinatorFilter,\n MeetingNotesFilterNode,\n MeetingNotesPropertyFilter,\n MeetingNotesPropertyName,\n MeetingNotesSort,\n} from \"./meeting-notes\"\nexport { meetingNotesFilterableProperties } from \"./meeting-notes\"\n"]}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helpers for receiving and verifying Notion webhook deliveries.
|
|
3
|
+
*
|
|
4
|
+
* Notion signs each webhook request with HMAC-SHA256 over the raw HTTP
|
|
5
|
+
* body using the subscription's verification token as the key, and sends
|
|
6
|
+
* the resulting hex digest in the `X-Notion-Signature` header as
|
|
7
|
+
* `sha256=<hex>`. To verify a delivery, callers must pass the body
|
|
8
|
+
* **exactly as it arrived over the wire** — any JSON re-serialization
|
|
9
|
+
* will change the bytes and invalidate the signature.
|
|
10
|
+
*
|
|
11
|
+
* The helpers prefer the Web Crypto API (`globalThis.crypto.subtle`)
|
|
12
|
+
* when present (browsers, edge runtimes, Node.js >= 18.19) and
|
|
13
|
+
* transparently fall back to `node:crypto`'s `webcrypto.subtle` on older
|
|
14
|
+
* Node.js 18 builds where `globalThis.crypto` is not yet enabled by
|
|
15
|
+
* default. They work without configuration in Node.js, Bun, Deno,
|
|
16
|
+
* Vercel Edge Functions, Cloudflare Workers, and modern browsers.
|
|
17
|
+
*/
|
|
18
|
+
export type VerifyWebhookSignatureArgs = {
|
|
19
|
+
/**
|
|
20
|
+
* The raw HTTP request body — exactly as received, before any parsing.
|
|
21
|
+
* Pass a string for text bodies or a Uint8Array/Buffer for binary-safe
|
|
22
|
+
* access. Re-serialized JSON will not verify.
|
|
23
|
+
*/
|
|
24
|
+
body: string | Uint8Array;
|
|
25
|
+
/**
|
|
26
|
+
* The value of the `X-Notion-Signature` request header. Verification
|
|
27
|
+
* fails (returns false) if this is missing or malformed.
|
|
28
|
+
*/
|
|
29
|
+
signature: string | null | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* The verification token configured for this webhook subscription
|
|
32
|
+
* (returned by Notion when the subscription was created and surfaced
|
|
33
|
+
* during the initial handshake).
|
|
34
|
+
*/
|
|
35
|
+
verificationToken: string;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Verify that a webhook delivery came from Notion and has not been
|
|
39
|
+
* tampered with.
|
|
40
|
+
*
|
|
41
|
+
* Performs a constant-time comparison; returns `true` only if the
|
|
42
|
+
* supplied `signature` matches HMAC-SHA256 of `body` keyed by
|
|
43
|
+
* `verificationToken`. Returns `false` (rather than throwing) for any
|
|
44
|
+
* malformed input so the caller can respond with a single 401/403 path.
|
|
45
|
+
*/
|
|
46
|
+
export declare function verifyWebhookSignature(args: VerifyWebhookSignatureArgs): Promise<boolean>;
|
|
47
|
+
/**
|
|
48
|
+
* Compute the value Notion would send in `X-Notion-Signature` for a
|
|
49
|
+
* given body and verification token. Useful for unit-testing webhook
|
|
50
|
+
* handlers without standing up a real subscription.
|
|
51
|
+
*/
|
|
52
|
+
export declare function signWebhookPayload(args: {
|
|
53
|
+
body: string | Uint8Array;
|
|
54
|
+
verificationToken: string;
|
|
55
|
+
}): Promise<string>;
|
|
56
|
+
//# sourceMappingURL=webhooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../src/webhooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,MAAM,MAAM,0BAA0B,GAAG;IACvC;;;;OAIG;IACH,IAAI,EAAE,MAAM,GAAG,UAAU,CAAA;IACzB;;;OAGG;IACH,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IACpC;;;;OAIG;IACH,iBAAiB,EAAE,MAAM,CAAA;CAC1B,CAAA;AAED;;;;;;;;GAQG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,0BAA0B,GAC/B,OAAO,CAAC,OAAO,CAAC,CAYlB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,IAAI,EAAE,MAAM,GAAG,UAAU,CAAA;IACzB,iBAAiB,EAAE,MAAM,CAAA;CAC1B,GAAG,OAAO,CAAC,MAAM,CAAC,CAGlB"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Helpers for receiving and verifying Notion webhook deliveries.
|
|
4
|
+
*
|
|
5
|
+
* Notion signs each webhook request with HMAC-SHA256 over the raw HTTP
|
|
6
|
+
* body using the subscription's verification token as the key, and sends
|
|
7
|
+
* the resulting hex digest in the `X-Notion-Signature` header as
|
|
8
|
+
* `sha256=<hex>`. To verify a delivery, callers must pass the body
|
|
9
|
+
* **exactly as it arrived over the wire** — any JSON re-serialization
|
|
10
|
+
* will change the bytes and invalidate the signature.
|
|
11
|
+
*
|
|
12
|
+
* The helpers prefer the Web Crypto API (`globalThis.crypto.subtle`)
|
|
13
|
+
* when present (browsers, edge runtimes, Node.js >= 18.19) and
|
|
14
|
+
* transparently fall back to `node:crypto`'s `webcrypto.subtle` on older
|
|
15
|
+
* Node.js 18 builds where `globalThis.crypto` is not yet enabled by
|
|
16
|
+
* default. They work without configuration in Node.js, Bun, Deno,
|
|
17
|
+
* Vercel Edge Functions, Cloudflare Workers, and modern browsers.
|
|
18
|
+
*/
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.verifyWebhookSignature = verifyWebhookSignature;
|
|
21
|
+
exports.signWebhookPayload = signWebhookPayload;
|
|
22
|
+
const SIGNATURE_PREFIX = "sha256=";
|
|
23
|
+
const SHA256_HEX_LENGTH = 64;
|
|
24
|
+
/**
|
|
25
|
+
* Verify that a webhook delivery came from Notion and has not been
|
|
26
|
+
* tampered with.
|
|
27
|
+
*
|
|
28
|
+
* Performs a constant-time comparison; returns `true` only if the
|
|
29
|
+
* supplied `signature` matches HMAC-SHA256 of `body` keyed by
|
|
30
|
+
* `verificationToken`. Returns `false` (rather than throwing) for any
|
|
31
|
+
* malformed input so the caller can respond with a single 401/403 path.
|
|
32
|
+
*/
|
|
33
|
+
async function verifyWebhookSignature(args) {
|
|
34
|
+
const { body, signature, verificationToken } = args;
|
|
35
|
+
if (typeof signature !== "string")
|
|
36
|
+
return false;
|
|
37
|
+
if (!signature.startsWith(SIGNATURE_PREFIX))
|
|
38
|
+
return false;
|
|
39
|
+
const providedHex = signature.slice(SIGNATURE_PREFIX.length).toLowerCase();
|
|
40
|
+
if (providedHex.length !== SHA256_HEX_LENGTH)
|
|
41
|
+
return false;
|
|
42
|
+
if (!/^[0-9a-f]+$/.test(providedHex))
|
|
43
|
+
return false;
|
|
44
|
+
const computedHex = await computeHmacSha256Hex(verificationToken, body);
|
|
45
|
+
return timingSafeEqualHex(providedHex, computedHex);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Compute the value Notion would send in `X-Notion-Signature` for a
|
|
49
|
+
* given body and verification token. Useful for unit-testing webhook
|
|
50
|
+
* handlers without standing up a real subscription.
|
|
51
|
+
*/
|
|
52
|
+
async function signWebhookPayload(args) {
|
|
53
|
+
const hex = await computeHmacSha256Hex(args.verificationToken, args.body);
|
|
54
|
+
return `${SIGNATURE_PREFIX}${hex}`;
|
|
55
|
+
}
|
|
56
|
+
async function computeHmacSha256Hex(key, body) {
|
|
57
|
+
const subtle = await getSubtle();
|
|
58
|
+
const encoder = new TextEncoder();
|
|
59
|
+
const keyBytes = encoder.encode(key);
|
|
60
|
+
// Copy any Uint8Array input into a fresh ArrayBuffer-backed view so
|
|
61
|
+
// subtle.sign (which forbids SharedArrayBuffer-backed views) is
|
|
62
|
+
// satisfied regardless of where the caller's buffer came from.
|
|
63
|
+
const bodyBytes = typeof body === "string" ? encoder.encode(body) : Uint8Array.from(body);
|
|
64
|
+
const cryptoKey = await subtle.importKey("raw", keyBytes, { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
|
|
65
|
+
const signatureBuffer = await subtle.sign("HMAC", cryptoKey, bodyBytes);
|
|
66
|
+
return bytesToHex(new Uint8Array(signatureBuffer));
|
|
67
|
+
}
|
|
68
|
+
let cachedSubtle;
|
|
69
|
+
async function getSubtle() {
|
|
70
|
+
var _a, _b;
|
|
71
|
+
if (cachedSubtle)
|
|
72
|
+
return cachedSubtle;
|
|
73
|
+
// Preferred path: every modern runtime exposes Web Crypto on the
|
|
74
|
+
// global object. This includes browsers, Vercel Edge, Cloudflare
|
|
75
|
+
// Workers, Deno, Bun, and Node.js >= 18.19 (which backported the
|
|
76
|
+
// change from Node.js 19).
|
|
77
|
+
const fromGlobal = (_a = globalThis
|
|
78
|
+
.crypto) === null || _a === void 0 ? void 0 : _a.subtle;
|
|
79
|
+
if (fromGlobal) {
|
|
80
|
+
cachedSubtle = fromGlobal;
|
|
81
|
+
return cachedSubtle;
|
|
82
|
+
}
|
|
83
|
+
// Fallback for Node.js 18.0–18.18, which ships Web Crypto via
|
|
84
|
+
// `node:crypto` but does not expose it on `globalThis` by default.
|
|
85
|
+
// Using `require` (rather than a static `import`) keeps the
|
|
86
|
+
// node:crypto reference off the dependency graph of browser bundlers
|
|
87
|
+
// that would otherwise fail to resolve it.
|
|
88
|
+
try {
|
|
89
|
+
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
90
|
+
const nodeCrypto = require("crypto");
|
|
91
|
+
/* eslint-enable @typescript-eslint/no-var-requires */
|
|
92
|
+
if ((_b = nodeCrypto.webcrypto) === null || _b === void 0 ? void 0 : _b.subtle) {
|
|
93
|
+
cachedSubtle = nodeCrypto.webcrypto.subtle;
|
|
94
|
+
return cachedSubtle;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// node:crypto unavailable (e.g. a browser bundle that stubbed it).
|
|
99
|
+
// Fall through to the error below.
|
|
100
|
+
}
|
|
101
|
+
throw new Error("verifyWebhookSignature requires Web Crypto support " +
|
|
102
|
+
"(globalThis.crypto.subtle or node:crypto.webcrypto). Upgrade to " +
|
|
103
|
+
"a runtime that provides one of them.");
|
|
104
|
+
}
|
|
105
|
+
function bytesToHex(bytes) {
|
|
106
|
+
let hex = "";
|
|
107
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
108
|
+
hex += bytes[i].toString(16).padStart(2, "0");
|
|
109
|
+
}
|
|
110
|
+
return hex;
|
|
111
|
+
}
|
|
112
|
+
// Constant-time string comparison. The inputs are already known to be
|
|
113
|
+
// the same length (callers enforce SHA256_HEX_LENGTH), so this purely
|
|
114
|
+
// avoids early-exit on the first differing character.
|
|
115
|
+
function timingSafeEqualHex(a, b) {
|
|
116
|
+
if (a.length !== b.length)
|
|
117
|
+
return false;
|
|
118
|
+
let diff = 0;
|
|
119
|
+
for (let i = 0; i < a.length; i++) {
|
|
120
|
+
diff |= a.charCodeAt(i) ^ b.charCodeAt(i);
|
|
121
|
+
}
|
|
122
|
+
return diff === 0;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=webhooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/webhooks.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Helpers for receiving and verifying Notion webhook deliveries.\n *\n * Notion signs each webhook request with HMAC-SHA256 over the raw HTTP\n * body using the subscription's verification token as the key, and sends\n * the resulting hex digest in the `X-Notion-Signature` header as\n * `sha256=<hex>`. To verify a delivery, callers must pass the body\n * **exactly as it arrived over the wire** — any JSON re-serialization\n * will change the bytes and invalidate the signature.\n *\n * The helpers prefer the Web Crypto API (`globalThis.crypto.subtle`)\n * when present (browsers, edge runtimes, Node.js >= 18.19) and\n * transparently fall back to `node:crypto`'s `webcrypto.subtle` on older\n * Node.js 18 builds where `globalThis.crypto` is not yet enabled by\n * default. They work without configuration in Node.js, Bun, Deno,\n * Vercel Edge Functions, Cloudflare Workers, and modern browsers.\n */\n\nconst SIGNATURE_PREFIX = \"sha256=\"\nconst SHA256_HEX_LENGTH = 64\n\nexport type VerifyWebhookSignatureArgs = {\n /**\n * The raw HTTP request body — exactly as received, before any parsing.\n * Pass a string for text bodies or a Uint8Array/Buffer for binary-safe\n * access. Re-serialized JSON will not verify.\n */\n body: string | Uint8Array\n /**\n * The value of the `X-Notion-Signature` request header. Verification\n * fails (returns false) if this is missing or malformed.\n */\n signature: string | null | undefined\n /**\n * The verification token configured for this webhook subscription\n * (returned by Notion when the subscription was created and surfaced\n * during the initial handshake).\n */\n verificationToken: string\n}\n\n/**\n * Verify that a webhook delivery came from Notion and has not been\n * tampered with.\n *\n * Performs a constant-time comparison; returns `true` only if the\n * supplied `signature` matches HMAC-SHA256 of `body` keyed by\n * `verificationToken`. Returns `false` (rather than throwing) for any\n * malformed input so the caller can respond with a single 401/403 path.\n */\nexport async function verifyWebhookSignature(\n args: VerifyWebhookSignatureArgs\n): Promise<boolean> {\n const { body, signature, verificationToken } = args\n\n if (typeof signature !== \"string\") return false\n if (!signature.startsWith(SIGNATURE_PREFIX)) return false\n\n const providedHex = signature.slice(SIGNATURE_PREFIX.length).toLowerCase()\n if (providedHex.length !== SHA256_HEX_LENGTH) return false\n if (!/^[0-9a-f]+$/.test(providedHex)) return false\n\n const computedHex = await computeHmacSha256Hex(verificationToken, body)\n return timingSafeEqualHex(providedHex, computedHex)\n}\n\n/**\n * Compute the value Notion would send in `X-Notion-Signature` for a\n * given body and verification token. Useful for unit-testing webhook\n * handlers without standing up a real subscription.\n */\nexport async function signWebhookPayload(args: {\n body: string | Uint8Array\n verificationToken: string\n}): Promise<string> {\n const hex = await computeHmacSha256Hex(args.verificationToken, args.body)\n return `${SIGNATURE_PREFIX}${hex}`\n}\n\nasync function computeHmacSha256Hex(\n key: string,\n body: string | Uint8Array\n): Promise<string> {\n const subtle = await getSubtle()\n\n const encoder = new TextEncoder()\n const keyBytes = encoder.encode(key)\n // Copy any Uint8Array input into a fresh ArrayBuffer-backed view so\n // subtle.sign (which forbids SharedArrayBuffer-backed views) is\n // satisfied regardless of where the caller's buffer came from.\n const bodyBytes =\n typeof body === \"string\" ? encoder.encode(body) : Uint8Array.from(body)\n\n const cryptoKey = await subtle.importKey(\n \"raw\",\n keyBytes,\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"]\n )\n const signatureBuffer = await subtle.sign(\"HMAC\", cryptoKey, bodyBytes)\n return bytesToHex(new Uint8Array(signatureBuffer))\n}\n\nlet cachedSubtle: SubtleCrypto | undefined\n\nasync function getSubtle(): Promise<SubtleCrypto> {\n if (cachedSubtle) return cachedSubtle\n\n // Preferred path: every modern runtime exposes Web Crypto on the\n // global object. This includes browsers, Vercel Edge, Cloudflare\n // Workers, Deno, Bun, and Node.js >= 18.19 (which backported the\n // change from Node.js 19).\n const fromGlobal = (globalThis as { crypto?: { subtle?: SubtleCrypto } })\n .crypto?.subtle\n if (fromGlobal) {\n cachedSubtle = fromGlobal\n return cachedSubtle\n }\n\n // Fallback for Node.js 18.0–18.18, which ships Web Crypto via\n // `node:crypto` but does not expose it on `globalThis` by default.\n // Using `require` (rather than a static `import`) keeps the\n // node:crypto reference off the dependency graph of browser bundlers\n // that would otherwise fail to resolve it.\n try {\n /* eslint-disable @typescript-eslint/no-var-requires */\n const nodeCrypto = require(\"crypto\") as {\n webcrypto?: { subtle?: SubtleCrypto }\n }\n /* eslint-enable @typescript-eslint/no-var-requires */\n if (nodeCrypto.webcrypto?.subtle) {\n cachedSubtle = nodeCrypto.webcrypto.subtle\n return cachedSubtle\n }\n } catch {\n // node:crypto unavailable (e.g. a browser bundle that stubbed it).\n // Fall through to the error below.\n }\n\n throw new Error(\n \"verifyWebhookSignature requires Web Crypto support \" +\n \"(globalThis.crypto.subtle or node:crypto.webcrypto). Upgrade to \" +\n \"a runtime that provides one of them.\"\n )\n}\n\nfunction bytesToHex(bytes: Uint8Array): string {\n let hex = \"\"\n for (let i = 0; i < bytes.length; i++) {\n hex += (bytes[i] as number).toString(16).padStart(2, \"0\")\n }\n return hex\n}\n\n// Constant-time string comparison. The inputs are already known to be\n// the same length (callers enforce SHA256_HEX_LENGTH), so this purely\n// avoids early-exit on the first differing character.\nfunction timingSafeEqualHex(a: string, b: string): boolean {\n if (a.length !== b.length) return false\n let diff = 0\n for (let i = 0; i < a.length; i++) {\n diff |= a.charCodeAt(i) ^ b.charCodeAt(i)\n }\n return diff === 0\n}\n"]}
|