Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 9 additions & 8 deletions src/operations/blocks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import {
type AppendBlockChildren,
type UpdateBlockBody,
} from "../utils/notion-types.js";
import { notionId } from "../schema/id.js";

const VERBOSE = z.boolean().optional();

Expand All @@ -21,7 +22,7 @@ const VERBOSE = z.boolean().optional();

const AppendBlocksParams = z
.object({
block_id: z.string().describe("Parent page ID or block ID to append into."),
block_id: notionId().describe("Parent page ID or block ID to append into."),
markdown: z.string().optional().describe("Content to append, as markdown. Parsed server-side."),
children: z.array(z.unknown()).optional().describe("Structured Notion blocks. Mutually exclusive with markdown."),
after: z.string().optional().describe("Append immediately after this block ID (legacy ordering)."),
Expand Down Expand Up @@ -108,7 +109,7 @@ register({
// ──────────────────────────────────────────────────────────────────────────

const GetBlockParams = z.object({
block_id: z.string().describe("Block ID to retrieve."),
block_id: notionId().describe("Block ID to retrieve."),
verbose: VERBOSE,
});

Expand All @@ -135,7 +136,7 @@ register({
// ──────────────────────────────────────────────────────────────────────────

const GetBlockChildrenParams = z.object({
block_id: z.string().describe("Page ID or block ID. For a page, returns its top-level blocks."),
block_id: notionId().describe("Page ID or block ID. For a page, returns its top-level blocks."),
start_cursor: z.string().optional(),
page_size: z.number().min(1).max(100).optional(),
verbose: VERBOSE,
Expand Down Expand Up @@ -205,7 +206,7 @@ function inferDataType(input: unknown): unknown {

const UpdateBlockParams = z
.object({
block_id: z.string(),
block_id: notionId(),
markdown: z
.string()
.optional()
Expand Down Expand Up @@ -270,7 +271,7 @@ register({
// delete_block
// ──────────────────────────────────────────────────────────────────────────

const DeleteBlockParams = z.object({ block_id: z.string(), verbose: VERBOSE });
const DeleteBlockParams = z.object({ block_id: notionId(), verbose: VERBOSE });

register({
name: "delete_block",
Expand All @@ -296,19 +297,19 @@ register({
const MixedOp = z.discriminatedUnion("op", [
z.object({
op: z.literal("append"),
block_id: z.string(),
block_id: notionId(),
markdown: z.string().optional(),
children: z.array(z.unknown()).optional(),
}),
z.object({
op: z.literal("update"),
block_id: z.string(),
block_id: notionId(),
markdown: z.string().optional(),
data: z.preprocess(inferDataType, TEXT_BLOCK_REQUEST_SCHEMA).optional(),
}),
z.object({
op: z.literal("delete"),
block_id: z.string(),
block_id: notionId(),
}),
]);

Expand Down
13 changes: 7 additions & 6 deletions src/operations/comments.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { slimComment, slimList } from "../utils/slim.js";
import { asSdk, type CreateCommentBody, type UpdateCommentBody } from "../utils/notion-types.js";
import { paginateAll } from "../utils/paginate.js";
import type { OperationResult } from "./types.js";
import { notionId } from "../schema/id.js";

const VERBOSE = z.boolean().optional();

Expand All @@ -18,7 +19,7 @@ function plainTextRich(text: string) {
// ──────────────────────────────────────────────────────────────────────────

const ListCommentsParams = z.object({
block_id: z.string().describe("Page or block ID to list comments from."),
block_id: notionId().describe("Page or block ID to list comments from."),
start_cursor: z.string().optional(),
page_size: z.number().min(1).max(100).optional(),
paginate: z
Expand Down Expand Up @@ -82,7 +83,7 @@ register({

const AddPageCommentParams = z
.object({
page_id: z.string(),
page_id: notionId(),
text: z.string().optional().describe("Plain-text comment body."),
markdown: z.string().optional().describe("Comment body as markdown. Mutually exclusive with text."),
verbose: VERBOSE,
Expand Down Expand Up @@ -121,7 +122,7 @@ register({

const AddDiscussionCommentParams = z
.object({
discussion_id: z.string(),
discussion_id: notionId(),
text: z.string().optional(),
markdown: z.string().optional().describe("Comment body as markdown. Mutually exclusive with text."),
verbose: VERBOSE,
Expand Down Expand Up @@ -153,7 +154,7 @@ register({
// ──────────────────────────────────────────────────────────────────────────

const GetCommentParams = z.object({
comment_id: z.string(),
comment_id: notionId(),
verbose: VERBOSE,
});

Expand All @@ -178,7 +179,7 @@ register({

const UpdateCommentParams = z
.object({
comment_id: z.string(),
comment_id: notionId(),
rich_text: z.array(z.unknown()).optional(),
markdown: z.string().optional(),
verbose: VERBOSE,
Expand Down Expand Up @@ -210,7 +211,7 @@ register({
// ──────────────────────────────────────────────────────────────────────────

const DeleteCommentParams = z.object({
comment_id: z.string(),
comment_id: notionId(),
});

register({
Expand Down
9 changes: 5 additions & 4 deletions src/operations/data-sources.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@ import { tryHandler } from "../utils/handler.js";
import { slimDataSource } from "../utils/slim.js";
import { DATABASE_PROPERTY_SCHEMA } from "../schema/database.js";
import { asSdk, type UpdateDataSourceBody } from "../utils/notion-types.js";
import { notionId } from "../schema/id.js";

const VERBOSE = z.boolean().optional();

const ListDataSourcesParams = z.object({
database_id: z.string().describe("Database ID to list data sources for."),
database_id: notionId().describe("Database ID to list data sources for."),
verbose: VERBOSE,
});

Expand Down Expand Up @@ -39,7 +40,7 @@ register({
});

const GetDataSourceParams = z.object({
data_source_id: z.string(),
data_source_id: notionId(),
verbose: VERBOSE,
});

Expand All @@ -60,7 +61,7 @@ register({
});

const ListDataSourceTemplatesParams = z.object({
data_source_id: z.string().describe("Data source ID to list templates for."),
data_source_id: notionId().describe("Data source ID to list templates for."),
name: z.string().optional().describe("Case-insensitive substring filter on template name."),
start_cursor: z.string().optional(),
page_size: z.number().int().min(1).max(100).optional(),
Expand Down Expand Up @@ -90,7 +91,7 @@ register({
});

const UpdateDataSourceParams = z.object({
data_source_id: z.string(),
data_source_id: notionId(),
title: z.array(z.unknown()).optional().describe("Rich text array for the data source title."),
properties: z.record(z.string(), DATABASE_PROPERTY_SCHEMA).optional(),
icon: z.unknown().optional(),
Expand Down
3 changes: 2 additions & 1 deletion src/operations/databases.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import {
type QueryDataSourceBody,
type UpdateDatabaseBody,
} from "../utils/notion-types.js";
import { notionId } from "../schema/id.js";

const VERBOSE = z.boolean().optional();

Expand Down Expand Up @@ -332,7 +333,7 @@ function hoistParent(rows: readonly RowWithParent[]): {
// ──────────────────────────────────────────────────────────────────────────

const UpdateDatabaseParams = z.object({
database_id: z.string(),
database_id: notionId(),
title: z.string().optional(),
title_rich: z.array(TEXT_RICH_TEXT_ITEM_REQUEST_SCHEMA).optional(),
description: z.array(TEXT_RICH_TEXT_ITEM_REQUEST_SCHEMA).optional(),
Expand Down
3 changes: 2 additions & 1 deletion src/operations/files.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import type {
CreateFileUploadBody,
SendFileUploadBody,
} from "../utils/notion-types.js";
import { notionId } from "../schema/id.js";

// Notion's documented per-part ceiling for multi-part uploads.
const MAX_PART_BYTES = 5 * 1024 * 1024;
Expand Down Expand Up @@ -325,7 +326,7 @@ register({
// ──────────────────────────────────────────────────────────────────────────

const GetFileUploadParams = z.object({
file_upload_id: z.string(),
file_upload_id: notionId(),
verbose: VERBOSE,
});

Expand Down
19 changes: 10 additions & 9 deletions src/operations/pages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import {
URL_PROPERTY_VALUE_SCHEMA,
VERIFICATION_PROPERTY_VALUE_SCHEMA,
} from "../schema/page-properties.js";
import { notionId } from "../schema/id.js";

const VERBOSE = z.boolean().optional();

Expand Down Expand Up @@ -78,7 +79,7 @@ const CreatePageParams = z
template: z
.object({
type: z.enum(["default", "none", "template_id"]).describe("`template_id` to apply a specific template, `default` for the data source's default template, `none` for no template."),
template_id: z.string().optional().describe("Required when type is 'template_id'. Discover IDs via list_data_source_templates."),
template_id: notionId().optional().describe("Required when type is 'template_id'. Discover IDs via list_data_source_templates."),
timezone: z.string().optional().describe("IANA tz (e.g. 'Asia/Hong_Kong') controlling @now/@today resolution inside the template."),
})
.optional()
Expand Down Expand Up @@ -167,7 +168,7 @@ register({
// ──────────────────────────────────────────────────────────────────────────

const SetPageTitleParams = z.object({
page_id: z.string(),
page_id: notionId(),
title: z.string(),
verbose: VERBOSE,
});
Expand Down Expand Up @@ -222,7 +223,7 @@ function wrapTitleShorthand(input: unknown): unknown {
const SetPagePropertyParams = z.preprocess(
wrapTitleShorthand,
z.object({
page_id: z.string(),
page_id: notionId(),
name: z.string().describe("Property name (case-sensitive). Use `title` for the title property; you may pass value as a plain string in that case."),
value: PROPERTY_VALUE_SCHEMA.describe(
"Property value object matching the property type, e.g. {checkbox: true}, {select: {name: 'Open'}}. For `name: 'title'` a plain string is accepted as a shorthand."
Expand Down Expand Up @@ -281,7 +282,7 @@ function wrapTitleShorthandInProperties(input: unknown): unknown {
const SetPagePropertiesParams = z.preprocess(
wrapTitleShorthandInProperties,
z.object({
page_id: z.string(),
page_id: notionId(),
properties: z
.record(z.string(), PROPERTY_VALUE_SCHEMA)
.describe(
Expand Down Expand Up @@ -331,7 +332,7 @@ register({
// archive_page / restore_page
// ──────────────────────────────────────────────────────────────────────────

const PageIdParams = z.object({ page_id: z.string(), verbose: VERBOSE });
const PageIdParams = z.object({ page_id: notionId(), verbose: VERBOSE });

const archivePageHandler = tryHandler(async ({ page_id, verbose }: z.infer<typeof PageIdParams>) => {
const notion = await getClient();
Expand Down Expand Up @@ -458,7 +459,7 @@ register({
// ──────────────────────────────────────────────────────────────────────────

const GetPageParams = z.object({
page_id: z.string(),
page_id: notionId(),
include_properties: z
.boolean()
.optional()
Expand Down Expand Up @@ -492,7 +493,7 @@ register({
// ──────────────────────────────────────────────────────────────────────────

const MovePageParams = z.object({
page_id: z.string(),
page_id: notionId(),
parent: PARENT_SCHEMA.describe("New parent (page_id or data_source_id). Same shape as create_page's `parent`."),
verbose: VERBOSE,
});
Expand Down Expand Up @@ -541,7 +542,7 @@ register({
// ──────────────────────────────────────────────────────────────────────────

const GetPageMarkdownParams = z.object({
page_id: z.string(),
page_id: notionId(),
});

register({
Expand All @@ -564,7 +565,7 @@ register({
// ──────────────────────────────────────────────────────────────────────────

const UpdatePageMarkdownParams = z.object({
page_id: z.string(),
page_id: notionId(),
markdown: z.string().describe("Markdown content. Replaces the existing body by default; with insert_content it is inserted instead."),
insert_content: z
.object({
Expand Down
3 changes: 2 additions & 1 deletion src/operations/users.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { tryHandler } from "../utils/handler.js";
import { slimUser, slimList } from "../utils/slim.js";
import { paginateAll } from "../utils/paginate.js";
import type { OperationResult } from "./types.js";
import { notionId } from "../schema/id.js";

const VERBOSE = z.boolean().optional();

Expand Down Expand Up @@ -81,7 +82,7 @@ register({
// get_user
// ──────────────────────────────────────────────────────────────────────────

const GetUserParams = z.object({ user_id: z.string(), verbose: VERBOSE });
const GetUserParams = z.object({ user_id: notionId(), verbose: VERBOSE });

register({
name: "get_user",
Expand Down
15 changes: 8 additions & 7 deletions src/operations/views.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
type GetViewQueryResultsBody,
type DeleteViewQueryBody,
} from "../utils/notion-types.js";
import { notionId } from "../schema/id.js";

const VERBOSE = z.boolean().optional();
// Hydration fans out one pages.retrieve / views.retrieve per id. The dispatch
Expand Down Expand Up @@ -149,7 +150,7 @@ function compileViewFilter(
// ──────────────────────────────────────────────────────────────────────────

const GetViewParams = z.object({
view_id: z.string().describe("View ID to retrieve."),
view_id: notionId().describe("View ID to retrieve."),
verbose: VERBOSE,
});

Expand All @@ -175,8 +176,8 @@ register({

const ListViewsParams = z
.object({
database_id: z.string().optional().describe("List views under this database."),
data_source_id: z.string().optional().describe("List views under this data source."),
database_id: notionId().optional().describe("List views under this database."),
data_source_id: notionId().optional().describe("List views under this data source."),
start_cursor: z.string().optional(),
page_size: z.number().min(1).max(100).optional(),
hydrate: z
Expand Down Expand Up @@ -232,7 +233,7 @@ const DEFAULT_ITEM_LIMIT = 1000;
const MAX_ITEM_LIMIT = 1000;

const QueryViewParams = z.object({
view_id: z.string().describe("View ID. Executes the view's stored filters/sorts server-side."),
view_id: notionId().describe("View ID. Executes the view's stored filters/sorts server-side."),
page_size: z.number().min(1).max(MAX_PAGE_SIZE).optional(),
paginate: z.boolean().optional().describe("Walk all result pages, up to page_limit rows."),
page_limit: z
Expand Down Expand Up @@ -367,7 +368,7 @@ register({
// ──────────────────────────────────────────────────────────────────────────

const CreateViewParams = z.object({
data_source_id: z.string().optional(),
data_source_id: notionId().optional(),
database_id: z
.string()
.optional()
Expand Down Expand Up @@ -449,7 +450,7 @@ register({
// ──────────────────────────────────────────────────────────────────────────

const UpdateViewParams = z.object({
view_id: z.string(),
view_id: notionId(),
name: z.string().optional(),
where: WHERE_SCHEMA.optional().describe(
"Replace the view filter (typed DSL). Mutually exclusive with `filter`."
Expand Down Expand Up @@ -495,7 +496,7 @@ register({
// delete_view
// ──────────────────────────────────────────────────────────────────────────

const DeleteViewParams = z.object({ view_id: z.string() });
const DeleteViewParams = z.object({ view_id: notionId() });

register({
name: "delete_view",
Expand Down
Loading
Loading