import { notionRequest, resolveDataSourceId, type JsonRecord } from './request.ts' import { inputRecord, optionalArray, optionalRecord, optionalString, requiredRecord } from './validation.ts' type CreatePageResponse = { id?: string url?: string [key: string]: unknown } /** * Preview or create a Notion page under a parent page or data source. * * Database rows need a data source parent: pass * `parent: { data_source_id: '...' }`, or `parent: { database_id: '...' }` to * auto-resolve the database's single data source. */ export default async function createPage(params: Record) { const input = inputRecord(params) const account = optionalString(input, 'account') const integration = optionalString(input, 'integration') const parent = { ...requiredRecord(input, 'parent') } if (typeof parent.database_id === 'string' && parent.data_source_id === undefined) { parent.data_source_id = await resolveDataSourceId(parent.database_id, { account, integration }) delete parent.database_id if (parent.type === 'database_id') parent.type = 'data_source_id' } const payload: JsonRecord = { parent, properties: requiredRecord(input, 'properties'), children: optionalArray(input, 'children'), icon: optionalRecord(input, 'icon'), cover: optionalRecord(input, 'cover'), } if (input.dryRun === true) { return { dryRun: true, method: 'POST', path: '/pages', payload } } if (input.confirm !== true) { throw new Error('Creating a Notion page requires confirm: true after explicit user approval of the parent and content. Use dryRun: true to preview.') } const result = await notionRequest('/pages', { method: 'POST', body: payload, account, integration, }) return { ok: true, id: result.id ?? null, url: result.url ?? null, } }