@slogvo/notion-client 0.2.2 → 0.2.4
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/build/index.js.map +1 -1
- package/package.json +3 -3
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/notion-api.ts"],"sourcesContent":["// import { promises as fs } from 'fs'\n//import ky, { type Options as OfetchOptions } from 'ky'\n\nimport type * as notion from '@slogvo/notion-types'\nimport {\n getBlockCollectionId,\n getPageContentBlockIds,\n parsePageId,\n uuidToId\n} from '@slogvo/notion-utils'\nimport { type FetchOptions as OfetchOptions, ofetch } from 'ofetch'\nimport pMap from 'p-map'\n\nimport type * as types from './types'\n\n/**\n * Main Notion API client.\n */\nexport class NotionAPI {\n private readonly _apiBaseUrl: string\n private readonly _authToken?: string\n private readonly _officialApiToken?: string\n private readonly _activeUser?: string\n private readonly _userTimeZone: string\n private readonly _ofetchOptions?: OfetchOptions\n\n constructor({\n apiBaseUrl = 'https://www.notion.so/api/v3',\n authToken,\n officialApiToken,\n activeUser,\n userTimeZone = 'America/New_York',\n ofetchOptions\n }: {\n apiBaseUrl?: string\n /** Browser token_v2 cookie for unofficial API */\n authToken?: string\n /** Official Notion Integration token (ntn_xxx) for private pages */\n officialApiToken?: string\n userLocale?: string\n userTimeZone?: string\n activeUser?: string\n ofetchOptions?: OfetchOptions\n } = {}) {\n this._apiBaseUrl = apiBaseUrl\n this._authToken = authToken\n this._officialApiToken = officialApiToken\n this._activeUser = activeUser\n this._userTimeZone = userTimeZone\n this._ofetchOptions = ofetchOptions\n }\n\n public async getPage(\n pageId: string,\n {\n concurrency = 3,\n fetchMissingBlocks = true,\n fetchCollections = true,\n signFileUrls = true,\n chunkLimit = 100,\n chunkNumber = 0,\n throwOnCollectionErrors = false,\n collectionReducerLimit = 999,\n fetchRelationPages = false,\n useOfficialApi,\n ofetchOptions\n }: {\n concurrency?: number\n fetchMissingBlocks?: boolean\n fetchCollections?: boolean\n signFileUrls?: boolean\n chunkLimit?: number\n chunkNumber?: number\n throwOnCollectionErrors?: boolean\n collectionReducerLimit?: number\n fetchRelationPages?: boolean\n /** Force using Official Notion API (requires officialApiToken) */\n useOfficialApi?: boolean\n ofetchOptions?: OfetchOptions\n } = {}\n ): Promise<notion.ExtendedRecordMap> {\n // Auto-detect: use official API if token provided and no unofficial auth\n const shouldUseOfficialApi =\n useOfficialApi ?? (!!this._officialApiToken && !this._authToken)\n\n if (shouldUseOfficialApi) {\n if (!this._officialApiToken) {\n throw new Error(\n 'Official API token required. Pass officialApiToken to constructor.'\n )\n }\n return this.getPageWithOfficialApi(pageId, { concurrency, ofetchOptions })\n }\n\n const page = await this.getPageRaw(pageId, {\n chunkLimit,\n chunkNumber,\n ofetchOptions\n })\n const recordMap = page?.recordMap as notion.ExtendedRecordMap\n\n if (!recordMap?.block) {\n throw new Error(`Notion page not found \"${uuidToId(pageId)}\"`)\n }\n\n // ensure that all top-level maps exist\n recordMap.collection = recordMap.collection ?? {}\n recordMap.collection_view = recordMap.collection_view ?? {}\n recordMap.notion_user = recordMap.notion_user ?? {}\n\n // additional mappings added for convenience\n // note: these are not native notion objects\n recordMap.collection_query = {}\n recordMap.signed_urls = {}\n\n if (fetchMissingBlocks) {\n while (true) {\n // fetch any missing content blocks\n const pendingBlockIds = getPageContentBlockIds(recordMap).filter(\n id => !recordMap.block[id]\n )\n\n if (!pendingBlockIds.length) {\n break\n }\n\n const newBlocks = await this.getBlocks(\n pendingBlockIds,\n ofetchOptions\n ).then(res => res.recordMap.block)\n\n recordMap.block = { ...recordMap.block, ...newBlocks }\n }\n }\n\n const contentBlockIds = getPageContentBlockIds(recordMap)\n\n // Optionally fetch all data for embedded collections and their associated views.\n // NOTE: We're eagerly fetching *all* data for each collection and all of its views.\n // This is really convenient in order to ensure that all data needed for a given\n // Notion page is readily available for use cases involving server-side rendering\n // and edge caching.\n if (fetchCollections) {\n const allCollectionInstances: Array<{\n collectionId: string\n collectionViewId: string\n spaceId?: string\n }> = contentBlockIds.flatMap(blockId => {\n const block = recordMap.block[blockId]?.value\n const collectionId =\n block &&\n (block.type === 'collection_view' ||\n block.type === 'collection_view_page') &&\n getBlockCollectionId(block, recordMap)\n\n if (collectionId) {\n const spaceId = block?.space_id\n return block.view_ids?.map(collectionViewId => ({\n collectionId,\n collectionViewId,\n spaceId\n }))\n } else {\n return []\n }\n })\n\n // fetch data for all collection view instances\n await pMap(\n allCollectionInstances,\n async collectionInstance => {\n const { collectionId, collectionViewId, spaceId } = collectionInstance\n const collectionView =\n recordMap.collection_view[collectionViewId]?.value\n\n try {\n const collectionData = await this.getCollectionData(\n collectionId,\n collectionViewId,\n collectionView,\n {\n limit: collectionReducerLimit,\n spaceId,\n ofetchOptions\n }\n )\n\n // await fs.writeFile(\n // `${collectionId}-${collectionViewId}.json`,\n // JSON.stringify(collectionData.result, null, 2)\n // )\n\n recordMap.block = {\n ...recordMap.block,\n ...collectionData.recordMap.block\n }\n\n recordMap.collection = {\n ...recordMap.collection,\n ...collectionData.recordMap.collection\n }\n\n recordMap.collection_view = {\n ...recordMap.collection_view,\n ...collectionData.recordMap.collection_view\n }\n\n recordMap.notion_user = {\n ...recordMap.notion_user,\n ...collectionData.recordMap.notion_user\n }\n\n recordMap.collection_query![collectionId] = {\n ...recordMap.collection_query![collectionId],\n [collectionViewId]: (collectionData.result as any)?.reducerResults\n }\n } catch (err: any) {\n // It's possible for public pages to link to private collections,\n // in which case Notion returns a 400 error. This may be that or it\n // may be something else.\n console.warn(\n 'NotionAPI collectionQuery error',\n { pageId, collectionId, collectionViewId },\n err.message\n )\n\n if (throwOnCollectionErrors) {\n throw err\n // throw new Error(\n // `NotionAPI error fetching collectionQuery for page \"${pageId}\" collection \"${collectionId}\" view \"${collectionViewId}\": ${err.message}`,\n // {\n // cause: err\n // }\n // )\n } else {\n console.error(err)\n }\n }\n },\n {\n concurrency\n }\n )\n }\n\n // Optionally fetch signed URLs for any embedded files.\n // NOTE: Similar to collection data, we default to eagerly fetching signed URL info\n // because it is preferable for many use cases as opposed to making these API calls\n // lazily from the client-side.\n if (signFileUrls) {\n await this.addSignedUrls({ recordMap, contentBlockIds, ofetchOptions })\n }\n\n if (fetchRelationPages) {\n const newBlocks = await this.fetchRelationPages(recordMap, ofetchOptions)\n recordMap.block = { ...recordMap.block, ...newBlocks }\n }\n\n return recordMap\n }\n\n fetchRelationPages = async (\n recordMap: notion.ExtendedRecordMap,\n ofetchOptions: OfetchOptions | undefined\n ): Promise<notion.BlockMap> => {\n const maxIterations = 10\n\n for (let i = 0; i < maxIterations; ++i) {\n const relationPageIdsThisIteration = new Set<string>()\n\n for (const blockId of Object.keys(recordMap.block)) {\n const blockValue = recordMap.block[blockId]?.value\n if (\n blockValue?.parent_table === 'collection' &&\n blockValue?.parent_id\n ) {\n const collection = recordMap.collection[blockValue.parent_id]?.value\n if (collection?.schema) {\n const ids = this.extractRelationPageIdsFromBlock(\n blockValue,\n collection.schema\n )\n for (const id of ids) relationPageIdsThisIteration.add(id)\n }\n }\n }\n\n const missingRelationPageIds = Array.from(\n relationPageIdsThisIteration\n ).filter(id => !recordMap.block[id]?.value)\n\n if (!missingRelationPageIds.length) break\n\n try {\n const newBlocks = await this.getBlocks(\n missingRelationPageIds,\n ofetchOptions\n ).then(res => res.recordMap.block)\n recordMap.block = { ...recordMap.block, ...newBlocks }\n } catch (err: any) {\n console.warn(\n 'NotionAPI getBlocks error during fetchRelationPages:',\n err\n )\n // consider break or delay/retry here\n }\n }\n\n return recordMap.block\n }\n\n extractRelationPageIdsFromBlock = (\n blockValue: any,\n collectionSchema: any\n ): Set<string> => {\n const pageIds = new Set<string>()\n\n for (const propertyId of Object.keys(blockValue.properties || {})) {\n const schema = collectionSchema[propertyId]\n if (schema?.type === 'relation') {\n const decorations = blockValue.properties[propertyId]\n if (Array.isArray(decorations)) {\n for (const decoration of decorations) {\n if (\n Array.isArray(decoration) &&\n decoration.length > 1 &&\n decoration[0] === '‣'\n ) {\n const pagePointer = decoration[1]?.[0]\n if (\n Array.isArray(pagePointer) &&\n pagePointer.length > 1 &&\n pagePointer[0] === 'p'\n ) {\n pageIds.add(pagePointer[1])\n }\n }\n }\n }\n }\n }\n return pageIds\n }\n\n public async addSignedUrls({\n recordMap,\n contentBlockIds,\n ofetchOptions = {}\n }: {\n recordMap: notion.ExtendedRecordMap\n contentBlockIds?: string[]\n ofetchOptions?: OfetchOptions\n }) {\n recordMap.signed_urls = {}\n\n if (!contentBlockIds) {\n contentBlockIds = getPageContentBlockIds(recordMap)\n }\n\n const allFileInstances = contentBlockIds.flatMap(blockId => {\n const block = recordMap.block[blockId]?.value\n\n if (\n block &&\n (block.type === 'pdf' ||\n block.type === 'audio' ||\n (block.type === 'image' && block.file_ids?.length) ||\n block.type === 'video' ||\n block.type === 'file' ||\n block.type === 'page')\n ) {\n const source =\n block.type === 'page'\n ? block.format?.page_cover\n : block.properties?.source?.[0]?.[0]\n // console.log(block, source)\n\n if (source) {\n if (\n source.includes('secure.notion-static.com') ||\n source.includes('prod-files-secure') ||\n source.includes('attachment:')\n ) {\n return {\n permissionRecord: {\n table: 'block',\n id: block.id\n },\n url: source\n }\n }\n\n return []\n }\n }\n\n return []\n })\n\n if (allFileInstances.length > 0) {\n try {\n const { signedUrls } = await this.getSignedFileUrls(\n allFileInstances,\n ofetchOptions\n )\n\n if (signedUrls.length === allFileInstances.length) {\n for (const [i, file] of allFileInstances.entries()) {\n const signedUrl = signedUrls[i]\n if (!signedUrl) continue\n\n const blockId = file.permissionRecord.id\n if (!blockId) continue\n\n recordMap.signed_urls[blockId] = signedUrl\n }\n }\n } catch (err) {\n console.warn('NotionAPI getSignedfileUrls error', err)\n }\n }\n }\n\n public async getPageRaw(\n pageId: string,\n {\n ofetchOptions,\n chunkLimit = 100,\n chunkNumber = 0\n }: {\n chunkLimit?: number\n chunkNumber?: number\n ofetchOptions?: OfetchOptions\n } = {}\n ) {\n const parsedPageId = parsePageId(pageId)\n\n if (!parsedPageId) {\n throw new Error(`invalid notion pageId \"${pageId}\"`)\n }\n\n const body = {\n pageId: parsedPageId,\n limit: chunkLimit,\n chunkNumber,\n cursor: { stack: [] },\n verticalColumns: false\n }\n\n return this.fetch<notion.PageChunk>({\n endpoint: 'loadPageChunk',\n body,\n ofetchOptions\n })\n }\n\n public async getCollectionData(\n collectionId: string,\n collectionViewId: string,\n collectionView?: any,\n {\n limit = 999,\n searchQuery = '',\n userTimeZone = this._userTimeZone,\n loadContentCover = true,\n spaceId,\n ofetchOptions\n }: {\n type?: notion.CollectionViewType\n limit?: number\n searchQuery?: string\n userTimeZone?: string\n userLocale?: string\n loadContentCover?: boolean\n spaceId?: string\n ofetchOptions?: OfetchOptions\n } = {}\n ) {\n const type = collectionView?.type\n const isBoardType = type === 'board'\n const groupBy = isBoardType\n ? collectionView?.format?.board_columns_by\n : collectionView?.format?.collection_group_by\n\n let filters = []\n if (collectionView?.format?.property_filters) {\n filters = collectionView.format?.property_filters.map(\n (filterObj: any) => {\n //get the inner filter\n return {\n filter: filterObj?.filter?.filter,\n property: filterObj?.filter?.property\n }\n }\n )\n }\n\n // Fixes formula filters from not working\n if (collectionView?.query2?.filter?.filters) {\n filters.push(...collectionView.query2.filter.filters)\n }\n\n let loader: any = {\n type: 'reducer',\n reducers: {\n collection_group_results: {\n type: 'results',\n limit,\n loadContentCover\n }\n },\n sort: [],\n ...collectionView?.query2,\n filter: {\n filters,\n operator: 'and'\n },\n searchQuery,\n userTimeZone\n }\n\n if (groupBy) {\n const groups =\n collectionView?.format?.board_columns ||\n collectionView?.format?.collection_groups ||\n []\n const iterators = [isBoardType ? 'board' : 'group_aggregation', 'results']\n const operators = {\n checkbox: 'checkbox_is',\n url: 'string_starts_with',\n text: 'string_starts_with',\n select: 'enum_is',\n multi_select: 'enum_contains',\n created_time: 'date_is_within',\n undefined: 'is_empty'\n }\n\n const reducersQuery: Record<string, any> = {}\n for (const group of groups) {\n const {\n property,\n value: { value, type }\n } = group\n\n for (const iterator of iterators) {\n const iteratorProps =\n iterator === 'results'\n ? {\n type: iterator,\n limit\n }\n : {\n type: 'aggregation',\n aggregation: {\n aggregator: 'count'\n }\n }\n\n const isUncategorizedValue = value === undefined\n const isDateValue = value?.range\n // TODO: review dates reducers\n const queryLabel = isUncategorizedValue\n ? 'uncategorized'\n : isDateValue\n ? value.range?.start_date || value.range?.end_date\n : value?.value || value\n\n const queryValue =\n !isUncategorizedValue && (isDateValue || value?.value || value)\n\n reducersQuery[`${iterator}:${type}:${queryLabel}`] = {\n ...iteratorProps,\n filter: {\n operator: 'and',\n filters: [\n {\n property,\n filter: {\n operator: !isUncategorizedValue\n ? operators[type as keyof typeof operators]\n : 'is_empty',\n ...(!isUncategorizedValue && {\n value: {\n type: 'exact',\n value: queryValue\n }\n })\n }\n }\n ]\n }\n }\n }\n }\n\n const reducerLabel = isBoardType ? 'board_columns' : `${type}_groups`\n loader = {\n type: 'reducer',\n reducers: {\n [reducerLabel]: {\n type: 'groups',\n version: 'v2',\n groupBy,\n ...(collectionView?.query2?.filter && {\n filter: collectionView?.query2?.filter\n }),\n groupSortPreference: groups.map((group: any) => ({\n property: group?.property,\n value: {\n type: group?.value?.type,\n value: group?.value?.value\n }\n })),\n limit\n },\n ...reducersQuery\n },\n ...collectionView?.query2,\n searchQuery,\n userTimeZone,\n //TODO: add filters here\n filter: {\n filters,\n operator: 'and'\n }\n }\n }\n\n // if (isBoardType) {\n // console.log(\n // JSON.stringify(\n // {\n // collectionId,\n // collectionViewId,\n // loader,\n // groupBy: groupBy || 'NONE',\n // collectionViewQuery: collectionView.query2 || 'NONE'\n // },\n // null,\n // 2\n // )\n // )\n // }\n\n const headers: any = {}\n if (spaceId) {\n headers['x-notion-space-id'] = spaceId\n }\n\n return this.fetch<notion.CollectionInstance>({\n endpoint: 'queryCollection',\n body: {\n collection: {\n id: collectionId\n },\n collectionView: {\n id: collectionViewId\n },\n source: {\n type: 'collection',\n id: collectionId\n },\n loader\n },\n headers,\n ofetchOptions: {\n timeout: 60_000,\n ...ofetchOptions,\n params: {\n // TODO: spread ofetchOptions?.searchParams\n src: 'initial_load'\n }\n }\n })\n }\n\n public async getUsers(userIds: string[], ofetchOptions?: OfetchOptions) {\n return this.fetch<notion.RecordValues<notion.User>>({\n endpoint: 'getRecordValues',\n body: {\n requests: userIds.map(id => ({ id, table: 'notion_user' }))\n },\n ofetchOptions\n })\n }\n\n public async getBlocks(blockIds: string[], ofetchOptions?: OfetchOptions) {\n return this.fetch<notion.PageChunk>({\n endpoint: 'syncRecordValuesMain',\n body: {\n requests: blockIds.map(blockId => ({\n // TODO: when to use table 'space' vs 'block'?\n table: 'block',\n id: blockId,\n version: -1\n }))\n },\n ofetchOptions\n })\n }\n\n public async getSignedFileUrls(\n urls: types.SignedUrlRequest[],\n ofetchOptions?: OfetchOptions\n ) {\n return this.fetch<types.SignedUrlResponse>({\n endpoint: 'getSignedFileUrls',\n body: {\n urls\n },\n ofetchOptions\n })\n }\n\n public async search(\n params: notion.SearchParams,\n ofetchOptions?: OfetchOptions\n ) {\n const body = {\n type: 'BlocksInAncestor',\n source: 'quick_find_public',\n ancestorId: parsePageId(params.ancestorId),\n sort: {\n field: 'relevance'\n },\n limit: params.limit || 20,\n query: params.query,\n filters: {\n isDeletedOnly: false,\n isNavigableOnly: false,\n excludeTemplates: true,\n requireEditPermissions: false,\n includePublicPagesWithoutExplicitAccess: true,\n ancestors: [],\n createdBy: [],\n editedBy: [],\n lastEditedTime: {},\n createdTime: {},\n ...params.filters\n }\n }\n\n return this.fetch<notion.SearchResults>({\n endpoint: 'search',\n body,\n ofetchOptions\n })\n }\n\n public async fetch<T>({\n endpoint,\n body,\n ofetchOptions,\n headers: clientHeaders\n }: {\n endpoint: string\n body: object\n ofetchOptions?: OfetchOptions\n headers?: any\n }): Promise<T> {\n const headers: any = {\n ...clientHeaders,\n ...this._ofetchOptions?.headers,\n ...ofetchOptions?.headers,\n 'Content-Type': 'application/json'\n }\n\n if (this._authToken) {\n headers.cookie = `token_v2=${this._authToken}`\n }\n\n if (this._activeUser) {\n headers['x-notion-active-user-header'] = this._activeUser\n }\n\n const url = `${this._apiBaseUrl}/${endpoint}`\n\n /* const res = await ky.post(url, {\n mode: 'no-cors',\n ...this._ofetchOptions,\n ...ofetchOptions,\n json: body,\n headers\n }) */\n\n // TODO: we're awaiting the first fetch and then separately awaiting\n // `res.json()` because there seems to be some weird error which repros\n // sporadically when loading collections where the body is already used.\n // No idea why, but from my testing, separating these into two separate\n // steps seems to fix the issue locally for me...\n // console.log(endpoint, { bodyUsed: res.bodyUsed })\n\n /* return res.json<T>() */\n const res = ofetch(url, {\n method: 'POST',\n mode: 'no-cors',\n ...this._ofetchOptions,\n ...ofetchOptions,\n body,\n headers\n })\n return res\n }\n\n /**\n * Fetch page content using Official Notion API (for private/integration pages).\n * Converts Official API block format to ExtendedRecordMap for NotionRenderer compatibility.\n */\n public async getPageWithOfficialApi(\n pageId: string,\n {\n concurrency = 3,\n ofetchOptions\n }: {\n concurrency?: number\n ofetchOptions?: OfetchOptions\n } = {}\n ): Promise<notion.ExtendedRecordMap> {\n const parsedPageId = parsePageId(pageId)\n if (!parsedPageId) {\n throw new Error(`invalid notion pageId \"${pageId}\"`)\n }\n\n // Initialize empty record map\n const recordMap: notion.ExtendedRecordMap = {\n block: {},\n collection: {},\n collection_view: {},\n collection_query: {},\n notion_user: {},\n signed_urls: {}\n }\n\n // Fetch page properties first\n const pageData = await this.fetchOfficialApi<any>({\n endpoint: `pages/${parsedPageId}`,\n method: 'GET',\n ofetchOptions\n })\n\n // Create root block from page data\n const rootBlock = this.convertPageToBlock(pageData, parsedPageId)\n recordMap.block[parsedPageId] = { value: rootBlock, role: 'reader' }\n\n // Fetch all child blocks recursively\n await this.fetchBlockChildrenRecursive(\n parsedPageId,\n recordMap,\n concurrency,\n 0,\n ofetchOptions\n )\n\n return recordMap\n }\n\n /**\n * Recursively fetch block children using Official API\n */\n private async fetchBlockChildrenRecursive(\n blockId: string,\n recordMap: notion.ExtendedRecordMap,\n concurrency: number,\n depth: number,\n ofetchOptions?: OfetchOptions\n ): Promise<void> {\n if (depth > 5) return // Prevent infinite recursion\n\n let cursor: string | undefined\n\n do {\n const params = new URLSearchParams({ page_size: '100' })\n if (cursor) params.set('start_cursor', cursor)\n\n const response = await this.fetchOfficialApi<{\n results: any[]\n has_more: boolean\n next_cursor: string | null\n }>({\n endpoint: `blocks/${blockId}/children?${params.toString()}`,\n method: 'GET',\n ofetchOptions\n })\n\n // Process each block\n const childIds: string[] = []\n for (const block of response.results) {\n const convertedBlock = this.convertOfficialBlock(block)\n recordMap.block[block.id] = { value: convertedBlock, role: 'reader' }\n childIds.push(block.id)\n\n // Track children for parent block\n if (recordMap.block[blockId]?.value) {\n const parent = recordMap.block[blockId].value as any\n if (!parent.content) parent.content = []\n parent.content.push(block.id)\n }\n }\n\n // Recursively fetch children for blocks that have them\n await pMap(\n response.results.filter((b) => b.has_children),\n async (block) => {\n await this.fetchBlockChildrenRecursive(\n block.id,\n recordMap,\n concurrency,\n depth + 1,\n ofetchOptions\n )\n },\n { concurrency }\n )\n\n cursor = response.has_more ? (response.next_cursor ?? undefined) : undefined\n } while (cursor)\n }\n\n /**\n * Convert Official API page to block format\n */\n private convertPageToBlock(page: any, pageId: string): notion.Block {\n const title = this.extractTitleFromProperties(page.properties)\n\n return {\n id: pageId,\n type: 'page',\n version: 1,\n created_time: new Date(page.created_time).getTime(),\n last_edited_time: new Date(page.last_edited_time).getTime(),\n parent_id: page.parent?.page_id || page.parent?.database_id || '',\n parent_table: page.parent?.type === 'database_id' ? 'collection' : 'space',\n alive: true,\n properties: {\n title: title ? [[title]] : []\n },\n format: {\n page_icon: page.icon?.emoji || page.icon?.external?.url,\n page_cover: page.cover?.external?.url || page.cover?.file?.url\n },\n content: []\n } as unknown as notion.Block\n }\n\n /**\n * Convert Official API block to unofficial format\n */\n private convertOfficialBlock(block: any): notion.Block {\n const baseBlock = {\n id: block.id,\n version: 1,\n created_time: new Date(block.created_time).getTime(),\n last_edited_time: new Date(block.last_edited_time).getTime(),\n parent_id: block.parent?.page_id || block.parent?.block_id || '',\n parent_table: 'block' as const,\n alive: true,\n content: block.has_children ? [] : undefined\n }\n\n const blockData = block[block.type]\n\n switch (block.type) {\n case 'paragraph':\n return {\n ...baseBlock,\n type: 'text',\n properties: {\n title: this.convertRichText(blockData?.rich_text)\n }\n } as unknown as notion.Block\n\n case 'heading_1':\n return {\n ...baseBlock,\n type: 'header',\n properties: {\n title: this.convertRichText(blockData?.rich_text)\n }\n } as unknown as notion.Block\n\n case 'heading_2':\n return {\n ...baseBlock,\n type: 'sub_header',\n properties: {\n title: this.convertRichText(blockData?.rich_text)\n }\n } as unknown as notion.Block\n\n case 'heading_3':\n return {\n ...baseBlock,\n type: 'sub_sub_header',\n properties: {\n title: this.convertRichText(blockData?.rich_text)\n }\n } as unknown as notion.Block\n\n case 'bulleted_list_item':\n return {\n ...baseBlock,\n type: 'bulleted_list',\n properties: {\n title: this.convertRichText(blockData?.rich_text)\n }\n } as unknown as notion.Block\n\n case 'numbered_list_item':\n return {\n ...baseBlock,\n type: 'numbered_list',\n properties: {\n title: this.convertRichText(blockData?.rich_text)\n }\n } as unknown as notion.Block\n\n case 'quote':\n return {\n ...baseBlock,\n type: 'quote',\n properties: {\n title: this.convertRichText(blockData?.rich_text)\n }\n } as unknown as notion.Block\n\n case 'code':\n return {\n ...baseBlock,\n type: 'code',\n properties: {\n title: this.convertRichText(blockData?.rich_text),\n language: [[blockData?.language || 'plain text']]\n }\n } as unknown as notion.Block\n\n case 'callout':\n return {\n ...baseBlock,\n type: 'callout',\n properties: {\n title: this.convertRichText(blockData?.rich_text)\n },\n format: {\n page_icon: blockData?.icon?.emoji\n }\n } as unknown as notion.Block\n\n case 'divider':\n return {\n ...baseBlock,\n type: 'divider'\n } as unknown as notion.Block\n\n case 'image':\n const imgUrl = blockData?.file?.url || blockData?.external?.url\n return {\n ...baseBlock,\n type: 'image',\n properties: {\n source: imgUrl ? [[imgUrl]] : [],\n caption: this.convertRichText(blockData?.caption)\n },\n format: {\n display_source: imgUrl\n }\n } as unknown as notion.Block\n\n case 'video':\n const videoUrl = blockData?.file?.url || blockData?.external?.url\n return {\n ...baseBlock,\n type: 'video',\n properties: {\n source: videoUrl ? [[videoUrl]] : []\n },\n format: {\n display_source: videoUrl\n }\n } as unknown as notion.Block\n\n case 'toggle':\n return {\n ...baseBlock,\n type: 'toggle',\n properties: {\n title: this.convertRichText(blockData?.rich_text)\n }\n } as unknown as notion.Block\n\n case 'to_do':\n return {\n ...baseBlock,\n type: 'to_do',\n properties: {\n title: this.convertRichText(blockData?.rich_text),\n checked: blockData?.checked ? [['Yes']] : [['No']]\n }\n } as unknown as notion.Block\n\n default:\n return {\n ...baseBlock,\n type: block.type\n } as unknown as notion.Block\n }\n }\n\n /**\n * Convert Official API rich_text to unofficial format\n */\n private convertRichText(richText: any[]): notion.Decoration[] {\n if (!richText || !Array.isArray(richText)) return []\n\n return richText.map((item) => {\n const decorations: any[] = []\n\n if (item.annotations?.bold) decorations.push(['b'])\n if (item.annotations?.italic) decorations.push(['i'])\n if (item.annotations?.strikethrough) decorations.push(['s'])\n if (item.annotations?.underline) decorations.push(['_'])\n if (item.annotations?.code) decorations.push(['c'])\n if (item.href) decorations.push(['a', item.href])\n\n if (decorations.length === 0) {\n return [item.plain_text || '']\n }\n\n return [item.plain_text || '', decorations]\n }) as notion.Decoration[]\n }\n\n /**\n * Extract title from Official API page properties\n */\n private extractTitleFromProperties(properties: any): string {\n if (!properties) return ''\n\n for (const key of Object.keys(properties)) {\n const prop = properties[key]\n if (prop.type === 'title' && prop.title?.length > 0) {\n return prop.title.map((t: any) => t.plain_text || '').join('')\n }\n }\n return ''\n }\n\n /**\n * Fetch from Official Notion API\n */\n private async fetchOfficialApi<T>({\n endpoint,\n method = 'GET',\n body,\n ofetchOptions\n }: {\n endpoint: string\n method?: 'GET' | 'POST'\n body?: object\n ofetchOptions?: OfetchOptions\n }): Promise<T> {\n const url = `https://api.notion.com/v1/${endpoint}`\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this._officialApiToken}`,\n 'Notion-Version': '2022-06-28',\n 'Content-Type': 'application/json'\n }\n\n return ofetch(url, {\n method,\n body: method === 'POST' ? body : undefined,\n headers,\n responseType: 'json'\n }) as Promise<T>\n }\n}\n"],"mappings":"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","names":["_a","_b","type"]}
|
|
1
|
+
{"version":3,"sources":["../src/notion-api.ts"],"sourcesContent":["// import { promises as fs } from 'fs'\n//import ky, { type Options as OfetchOptions } from 'ky'\n\nimport type * as notion from '@slogvo/notion-types'\nimport {\n getBlockCollectionId,\n getPageContentBlockIds,\n parsePageId,\n uuidToId\n} from '@slogvo/notion-utils'\nimport { type FetchOptions as OfetchOptions, ofetch } from 'ofetch'\nimport pMap from 'p-map'\n\nimport type * as types from './types'\n\n/**\n * Main Notion API client.\n */\nexport class NotionAPI {\n private readonly _apiBaseUrl: string\n private readonly _authToken?: string\n private readonly _officialApiToken?: string\n private readonly _activeUser?: string\n private readonly _userTimeZone: string\n private readonly _ofetchOptions?: OfetchOptions\n\n constructor({\n apiBaseUrl = 'https://www.notion.so/api/v3',\n authToken,\n officialApiToken,\n activeUser,\n userTimeZone = 'America/New_York',\n ofetchOptions\n }: {\n apiBaseUrl?: string\n /** Browser token_v2 cookie for unofficial API */\n authToken?: string\n /** Official Notion Integration token (ntn_xxx) for private pages */\n officialApiToken?: string\n userLocale?: string\n userTimeZone?: string\n activeUser?: string\n ofetchOptions?: OfetchOptions\n } = {}) {\n this._apiBaseUrl = apiBaseUrl\n this._authToken = authToken\n this._officialApiToken = officialApiToken\n this._activeUser = activeUser\n this._userTimeZone = userTimeZone\n this._ofetchOptions = ofetchOptions\n }\n\n public async getPage(\n pageId: string,\n {\n concurrency = 3,\n fetchMissingBlocks = true,\n fetchCollections = true,\n signFileUrls = true,\n chunkLimit = 100,\n chunkNumber = 0,\n throwOnCollectionErrors = false,\n collectionReducerLimit = 999,\n fetchRelationPages = false,\n useOfficialApi,\n ofetchOptions\n }: {\n concurrency?: number\n fetchMissingBlocks?: boolean\n fetchCollections?: boolean\n signFileUrls?: boolean\n chunkLimit?: number\n chunkNumber?: number\n throwOnCollectionErrors?: boolean\n collectionReducerLimit?: number\n fetchRelationPages?: boolean\n /** Force using Official Notion API (requires officialApiToken) */\n useOfficialApi?: boolean\n ofetchOptions?: OfetchOptions\n } = {}\n ): Promise<notion.ExtendedRecordMap> {\n // Auto-detect: use official API if token provided and no unofficial auth\n const shouldUseOfficialApi =\n useOfficialApi ?? (!!this._officialApiToken && !this._authToken)\n\n if (shouldUseOfficialApi) {\n if (!this._officialApiToken) {\n throw new Error(\n 'Official API token required. Pass officialApiToken to constructor.'\n )\n }\n return this.getPageWithOfficialApi(pageId, { concurrency, ofetchOptions })\n }\n\n const page = await this.getPageRaw(pageId, {\n chunkLimit,\n chunkNumber,\n ofetchOptions\n })\n const recordMap = page?.recordMap as notion.ExtendedRecordMap\n\n if (!recordMap?.block) {\n throw new Error(`Notion page not found \"${uuidToId(pageId)}\"`)\n }\n\n // ensure that all top-level maps exist\n recordMap.collection = recordMap.collection ?? {}\n recordMap.collection_view = recordMap.collection_view ?? {}\n recordMap.notion_user = recordMap.notion_user ?? {}\n\n // additional mappings added for convenience\n // note: these are not native notion objects\n recordMap.collection_query = {}\n recordMap.signed_urls = {}\n\n if (fetchMissingBlocks) {\n while (true) {\n // fetch any missing content blocks\n const pendingBlockIds = getPageContentBlockIds(recordMap).filter(\n id => !recordMap.block[id]\n )\n\n if (!pendingBlockIds.length) {\n break\n }\n\n const newBlocks = await this.getBlocks(\n pendingBlockIds,\n ofetchOptions\n ).then(res => res.recordMap.block)\n\n recordMap.block = { ...recordMap.block, ...newBlocks }\n }\n }\n\n const contentBlockIds = getPageContentBlockIds(recordMap)\n\n // Optionally fetch all data for embedded collections and their associated views.\n // NOTE: We're eagerly fetching *all* data for each collection and all of its views.\n // This is really convenient in order to ensure that all data needed for a given\n // Notion page is readily available for use cases involving server-side rendering\n // and edge caching.\n if (fetchCollections) {\n const allCollectionInstances: Array<{\n collectionId: string\n collectionViewId: string\n spaceId?: string\n }> = contentBlockIds.flatMap(blockId => {\n const block = recordMap.block[blockId]?.value\n const collectionId =\n block &&\n (block.type === 'collection_view' ||\n block.type === 'collection_view_page') &&\n getBlockCollectionId(block, recordMap)\n\n if (collectionId) {\n const spaceId = block?.space_id\n return block.view_ids?.map(collectionViewId => ({\n collectionId,\n collectionViewId,\n spaceId\n }))\n } else {\n return []\n }\n })\n\n // fetch data for all collection view instances\n await pMap(\n allCollectionInstances,\n async collectionInstance => {\n const { collectionId, collectionViewId, spaceId } = collectionInstance\n const collectionView =\n recordMap.collection_view[collectionViewId]?.value\n\n try {\n const collectionData = await this.getCollectionData(\n collectionId,\n collectionViewId,\n collectionView,\n {\n limit: collectionReducerLimit,\n spaceId,\n ofetchOptions\n }\n )\n\n // await fs.writeFile(\n // `${collectionId}-${collectionViewId}.json`,\n // JSON.stringify(collectionData.result, null, 2)\n // )\n\n recordMap.block = {\n ...recordMap.block,\n ...collectionData.recordMap.block\n }\n\n recordMap.collection = {\n ...recordMap.collection,\n ...collectionData.recordMap.collection\n }\n\n recordMap.collection_view = {\n ...recordMap.collection_view,\n ...collectionData.recordMap.collection_view\n }\n\n recordMap.notion_user = {\n ...recordMap.notion_user,\n ...collectionData.recordMap.notion_user\n }\n\n recordMap.collection_query![collectionId] = {\n ...recordMap.collection_query![collectionId],\n [collectionViewId]: (collectionData.result as any)?.reducerResults\n }\n } catch (err: any) {\n // It's possible for public pages to link to private collections,\n // in which case Notion returns a 400 error. This may be that or it\n // may be something else.\n console.warn(\n 'NotionAPI collectionQuery error',\n { pageId, collectionId, collectionViewId },\n err.message\n )\n\n if (throwOnCollectionErrors) {\n throw err\n // throw new Error(\n // `NotionAPI error fetching collectionQuery for page \"${pageId}\" collection \"${collectionId}\" view \"${collectionViewId}\": ${err.message}`,\n // {\n // cause: err\n // }\n // )\n } else {\n console.error(err)\n }\n }\n },\n {\n concurrency\n }\n )\n }\n\n // Optionally fetch signed URLs for any embedded files.\n // NOTE: Similar to collection data, we default to eagerly fetching signed URL info\n // because it is preferable for many use cases as opposed to making these API calls\n // lazily from the client-side.\n if (signFileUrls) {\n await this.addSignedUrls({ recordMap, contentBlockIds, ofetchOptions })\n }\n\n if (fetchRelationPages) {\n const newBlocks = await this.fetchRelationPages(recordMap, ofetchOptions)\n recordMap.block = { ...recordMap.block, ...newBlocks }\n }\n\n return recordMap\n }\n\n fetchRelationPages = async (\n recordMap: notion.ExtendedRecordMap,\n ofetchOptions: OfetchOptions | undefined\n ): Promise<notion.BlockMap> => {\n const maxIterations = 10\n\n for (let i = 0; i < maxIterations; ++i) {\n const relationPageIdsThisIteration = new Set<string>()\n\n for (const blockId of Object.keys(recordMap.block)) {\n const blockValue = recordMap.block[blockId]?.value\n if (\n blockValue?.parent_table === 'collection' &&\n blockValue?.parent_id\n ) {\n const collection = recordMap.collection[blockValue.parent_id]?.value\n if (collection?.schema) {\n const ids = this.extractRelationPageIdsFromBlock(\n blockValue,\n collection.schema\n )\n for (const id of ids) relationPageIdsThisIteration.add(id)\n }\n }\n }\n\n const missingRelationPageIds = Array.from(\n relationPageIdsThisIteration\n ).filter(id => !recordMap.block[id]?.value)\n\n if (!missingRelationPageIds.length) break\n\n try {\n const newBlocks = await this.getBlocks(\n missingRelationPageIds,\n ofetchOptions\n ).then(res => res.recordMap.block)\n recordMap.block = { ...recordMap.block, ...newBlocks }\n } catch (err: any) {\n console.warn(\n 'NotionAPI getBlocks error during fetchRelationPages:',\n err\n )\n // consider break or delay/retry here\n }\n }\n\n return recordMap.block\n }\n\n extractRelationPageIdsFromBlock = (\n blockValue: any,\n collectionSchema: any\n ): Set<string> => {\n const pageIds = new Set<string>()\n\n for (const propertyId of Object.keys(blockValue.properties || {})) {\n const schema = collectionSchema[propertyId]\n if (schema?.type === 'relation') {\n const decorations = blockValue.properties[propertyId]\n if (Array.isArray(decorations)) {\n for (const decoration of decorations) {\n if (\n Array.isArray(decoration) &&\n decoration.length > 1 &&\n decoration[0] === '‣'\n ) {\n const pagePointer = decoration[1]?.[0]\n if (\n Array.isArray(pagePointer) &&\n pagePointer.length > 1 &&\n pagePointer[0] === 'p'\n ) {\n pageIds.add(pagePointer[1])\n }\n }\n }\n }\n }\n }\n return pageIds\n }\n\n public async addSignedUrls({\n recordMap,\n contentBlockIds,\n ofetchOptions = {}\n }: {\n recordMap: notion.ExtendedRecordMap\n contentBlockIds?: string[]\n ofetchOptions?: OfetchOptions\n }) {\n recordMap.signed_urls = {}\n\n if (!contentBlockIds) {\n contentBlockIds = getPageContentBlockIds(recordMap)\n }\n\n const allFileInstances = contentBlockIds.flatMap(blockId => {\n const block = recordMap.block[blockId]?.value\n\n if (\n block &&\n (block.type === 'pdf' ||\n block.type === 'audio' ||\n (block.type === 'image' && block.file_ids?.length) ||\n block.type === 'video' ||\n block.type === 'file' ||\n block.type === 'page')\n ) {\n const source =\n block.type === 'page'\n ? block.format?.page_cover\n : block.properties?.source?.[0]?.[0]\n // console.log(block, source)\n\n if (source) {\n if (\n source.includes('secure.notion-static.com') ||\n source.includes('prod-files-secure') ||\n source.includes('attachment:')\n ) {\n return {\n permissionRecord: {\n table: 'block',\n id: block.id\n },\n url: source\n }\n }\n\n return []\n }\n }\n\n return []\n })\n\n if (allFileInstances.length > 0) {\n try {\n const { signedUrls } = await this.getSignedFileUrls(\n allFileInstances,\n ofetchOptions\n )\n\n if (signedUrls.length === allFileInstances.length) {\n for (const [i, file] of allFileInstances.entries()) {\n const signedUrl = signedUrls[i]\n if (!signedUrl) continue\n\n const blockId = file.permissionRecord.id\n if (!blockId) continue\n\n recordMap.signed_urls[blockId] = signedUrl\n }\n }\n } catch (err) {\n console.warn('NotionAPI getSignedfileUrls error', err)\n }\n }\n }\n\n public async getPageRaw(\n pageId: string,\n {\n ofetchOptions,\n chunkLimit = 100,\n chunkNumber = 0\n }: {\n chunkLimit?: number\n chunkNumber?: number\n ofetchOptions?: OfetchOptions\n } = {}\n ) {\n const parsedPageId = parsePageId(pageId)\n\n if (!parsedPageId) {\n throw new Error(`invalid notion pageId \"${pageId}\"`)\n }\n\n const body = {\n pageId: parsedPageId,\n limit: chunkLimit,\n chunkNumber,\n cursor: { stack: [] },\n verticalColumns: false\n }\n\n return this.fetch<notion.PageChunk>({\n endpoint: 'loadPageChunk',\n body,\n ofetchOptions\n })\n }\n\n public async getCollectionData(\n collectionId: string,\n collectionViewId: string,\n collectionView?: any,\n {\n limit = 999,\n searchQuery = '',\n userTimeZone = this._userTimeZone,\n loadContentCover = true,\n spaceId,\n ofetchOptions\n }: {\n type?: notion.CollectionViewType\n limit?: number\n searchQuery?: string\n userTimeZone?: string\n userLocale?: string\n loadContentCover?: boolean\n spaceId?: string\n ofetchOptions?: OfetchOptions\n } = {}\n ) {\n const type = collectionView?.type\n const isBoardType = type === 'board'\n const groupBy = isBoardType\n ? collectionView?.format?.board_columns_by\n : collectionView?.format?.collection_group_by\n\n let filters = []\n if (collectionView?.format?.property_filters) {\n filters = collectionView.format?.property_filters.map(\n (filterObj: any) => {\n //get the inner filter\n return {\n filter: filterObj?.filter?.filter,\n property: filterObj?.filter?.property\n }\n }\n )\n }\n\n // Fixes formula filters from not working\n if (collectionView?.query2?.filter?.filters) {\n filters.push(...collectionView.query2.filter.filters)\n }\n\n let loader: any = {\n type: 'reducer',\n reducers: {\n collection_group_results: {\n type: 'results',\n limit,\n loadContentCover\n }\n },\n sort: [],\n ...collectionView?.query2,\n filter: {\n filters,\n operator: 'and'\n },\n searchQuery,\n userTimeZone\n }\n\n if (groupBy) {\n const groups =\n collectionView?.format?.board_columns ||\n collectionView?.format?.collection_groups ||\n []\n const iterators = [isBoardType ? 'board' : 'group_aggregation', 'results']\n const operators = {\n checkbox: 'checkbox_is',\n url: 'string_starts_with',\n text: 'string_starts_with',\n select: 'enum_is',\n multi_select: 'enum_contains',\n created_time: 'date_is_within',\n undefined: 'is_empty'\n }\n\n const reducersQuery: Record<string, any> = {}\n for (const group of groups) {\n const {\n property,\n value: { value, type }\n } = group\n\n for (const iterator of iterators) {\n const iteratorProps =\n iterator === 'results'\n ? {\n type: iterator,\n limit\n }\n : {\n type: 'aggregation',\n aggregation: {\n aggregator: 'count'\n }\n }\n\n const isUncategorizedValue = value === undefined\n const isDateValue = value?.range\n // TODO: review dates reducers\n const queryLabel = isUncategorizedValue\n ? 'uncategorized'\n : isDateValue\n ? value.range?.start_date || value.range?.end_date\n : value?.value || value\n\n const queryValue =\n !isUncategorizedValue && (isDateValue || value?.value || value)\n\n reducersQuery[`${iterator}:${type}:${queryLabel}`] = {\n ...iteratorProps,\n filter: {\n operator: 'and',\n filters: [\n {\n property,\n filter: {\n operator: !isUncategorizedValue\n ? operators[type as keyof typeof operators]\n : 'is_empty',\n ...(!isUncategorizedValue && {\n value: {\n type: 'exact',\n value: queryValue\n }\n })\n }\n }\n ]\n }\n }\n }\n }\n\n const reducerLabel = isBoardType ? 'board_columns' : `${type}_groups`\n loader = {\n type: 'reducer',\n reducers: {\n [reducerLabel]: {\n type: 'groups',\n version: 'v2',\n groupBy,\n ...(collectionView?.query2?.filter && {\n filter: collectionView?.query2?.filter\n }),\n groupSortPreference: groups.map((group: any) => ({\n property: group?.property,\n value: {\n type: group?.value?.type,\n value: group?.value?.value\n }\n })),\n limit\n },\n ...reducersQuery\n },\n ...collectionView?.query2,\n searchQuery,\n userTimeZone,\n //TODO: add filters here\n filter: {\n filters,\n operator: 'and'\n }\n }\n }\n\n // if (isBoardType) {\n // console.log(\n // JSON.stringify(\n // {\n // collectionId,\n // collectionViewId,\n // loader,\n // groupBy: groupBy || 'NONE',\n // collectionViewQuery: collectionView.query2 || 'NONE'\n // },\n // null,\n // 2\n // )\n // )\n // }\n\n const headers: any = {}\n if (spaceId) {\n headers['x-notion-space-id'] = spaceId\n }\n\n return this.fetch<notion.CollectionInstance>({\n endpoint: 'queryCollection',\n body: {\n collection: {\n id: collectionId\n },\n collectionView: {\n id: collectionViewId\n },\n source: {\n type: 'collection',\n id: collectionId\n },\n loader\n },\n headers,\n ofetchOptions: {\n timeout: 60_000,\n ...ofetchOptions,\n params: {\n // TODO: spread ofetchOptions?.searchParams\n src: 'initial_load'\n }\n }\n })\n }\n\n public async getUsers(userIds: string[], ofetchOptions?: OfetchOptions) {\n return this.fetch<notion.RecordValues<notion.User>>({\n endpoint: 'getRecordValues',\n body: {\n requests: userIds.map(id => ({ id, table: 'notion_user' }))\n },\n ofetchOptions\n })\n }\n\n public async getBlocks(blockIds: string[], ofetchOptions?: OfetchOptions) {\n return this.fetch<notion.PageChunk>({\n endpoint: 'syncRecordValuesMain',\n body: {\n requests: blockIds.map(blockId => ({\n // TODO: when to use table 'space' vs 'block'?\n table: 'block',\n id: blockId,\n version: -1\n }))\n },\n ofetchOptions\n })\n }\n\n public async getSignedFileUrls(\n urls: types.SignedUrlRequest[],\n ofetchOptions?: OfetchOptions\n ) {\n return this.fetch<types.SignedUrlResponse>({\n endpoint: 'getSignedFileUrls',\n body: {\n urls\n },\n ofetchOptions\n })\n }\n\n public async search(\n params: notion.SearchParams,\n ofetchOptions?: OfetchOptions\n ) {\n const body = {\n type: 'BlocksInAncestor',\n source: 'quick_find_public',\n ancestorId: parsePageId(params.ancestorId),\n sort: {\n field: 'relevance'\n },\n limit: params.limit || 20,\n query: params.query,\n filters: {\n isDeletedOnly: false,\n isNavigableOnly: false,\n excludeTemplates: true,\n requireEditPermissions: false,\n includePublicPagesWithoutExplicitAccess: true,\n ancestors: [],\n createdBy: [],\n editedBy: [],\n lastEditedTime: {},\n createdTime: {},\n ...params.filters\n }\n }\n\n return this.fetch<notion.SearchResults>({\n endpoint: 'search',\n body,\n ofetchOptions\n })\n }\n\n public async fetch<T>({\n endpoint,\n body,\n ofetchOptions,\n headers: clientHeaders\n }: {\n endpoint: string\n body: object\n ofetchOptions?: OfetchOptions\n headers?: any\n }): Promise<T> {\n const headers: any = {\n ...clientHeaders,\n ...this._ofetchOptions?.headers,\n ...ofetchOptions?.headers,\n 'Content-Type': 'application/json'\n }\n\n if (this._authToken) {\n headers.cookie = `token_v2=${this._authToken}`\n }\n\n if (this._activeUser) {\n headers['x-notion-active-user-header'] = this._activeUser\n }\n\n const url = `${this._apiBaseUrl}/${endpoint}`\n\n /* const res = await ky.post(url, {\n mode: 'no-cors',\n ...this._ofetchOptions,\n ...ofetchOptions,\n json: body,\n headers\n }) */\n\n // TODO: we're awaiting the first fetch and then separately awaiting\n // `res.json()` because there seems to be some weird error which repros\n // sporadically when loading collections where the body is already used.\n // No idea why, but from my testing, separating these into two separate\n // steps seems to fix the issue locally for me...\n // console.log(endpoint, { bodyUsed: res.bodyUsed })\n\n /* return res.json<T>() */\n const res = ofetch(url, {\n method: 'POST',\n mode: 'no-cors',\n ...this._ofetchOptions,\n ...ofetchOptions,\n body,\n headers\n })\n return res\n }\n\n /**\n * Fetch page content using Official Notion API (for private/integration pages).\n * Converts Official API block format to ExtendedRecordMap for NotionRenderer compatibility.\n */\n public async getPageWithOfficialApi(\n pageId: string,\n {\n concurrency = 3,\n ofetchOptions\n }: {\n concurrency?: number\n ofetchOptions?: OfetchOptions\n } = {}\n ): Promise<notion.ExtendedRecordMap> {\n const parsedPageId = parsePageId(pageId)\n if (!parsedPageId) {\n throw new Error(`invalid notion pageId \"${pageId}\"`)\n }\n\n // Initialize empty record map\n const recordMap: notion.ExtendedRecordMap = {\n block: {},\n collection: {},\n collection_view: {},\n collection_query: {},\n notion_user: {},\n signed_urls: {}\n }\n\n // Fetch page properties first\n const pageData = await this.fetchOfficialApi<any>({\n endpoint: `pages/${parsedPageId}`,\n method: 'GET',\n ofetchOptions\n })\n\n // Create root block from page data\n const rootBlock = this.convertPageToBlock(pageData, parsedPageId)\n recordMap.block[parsedPageId] = { value: rootBlock, role: 'reader' }\n\n // Fetch all child blocks recursively\n await this.fetchBlockChildrenRecursive(\n parsedPageId,\n recordMap,\n concurrency,\n 0,\n ofetchOptions\n )\n\n return recordMap\n }\n\n /**\n * Recursively fetch block children using Official API\n */\n private async fetchBlockChildrenRecursive(\n blockId: string,\n recordMap: notion.ExtendedRecordMap,\n concurrency: number,\n depth: number,\n ofetchOptions?: OfetchOptions\n ): Promise<void> {\n if (depth > 5) return // Prevent infinite recursion\n\n let cursor: string | undefined\n\n do {\n const params = new URLSearchParams({ page_size: '100' })\n if (cursor) params.set('start_cursor', cursor)\n\n const response = await this.fetchOfficialApi<{\n results: any[]\n has_more: boolean\n next_cursor: string | null\n }>({\n endpoint: `blocks/${blockId}/children?${params.toString()}`,\n method: 'GET',\n ofetchOptions\n })\n\n // Process each block\n const childIds: string[] = []\n for (const block of response.results) {\n const convertedBlock = this.convertOfficialBlock(block)\n recordMap.block[block.id] = { value: convertedBlock, role: 'reader' }\n childIds.push(block.id)\n\n // Track children for parent block\n if (recordMap.block[blockId]?.value) {\n const parent = recordMap.block[blockId].value as any\n if (!parent.content) parent.content = []\n parent.content.push(block.id)\n }\n }\n\n // Recursively fetch children for blocks that have them\n await pMap(\n response.results.filter(b => b.has_children),\n async block => {\n await this.fetchBlockChildrenRecursive(\n block.id,\n recordMap,\n concurrency,\n depth + 1,\n ofetchOptions\n )\n },\n { concurrency }\n )\n\n cursor = response.has_more\n ? (response.next_cursor ?? undefined)\n : undefined\n } while (cursor)\n }\n\n /**\n * Convert Official API page to block format\n */\n private convertPageToBlock(page: any, pageId: string): notion.Block {\n const title = this.extractTitleFromProperties(page.properties)\n\n return {\n id: pageId,\n type: 'page',\n version: 1,\n created_time: new Date(page.created_time).getTime(),\n last_edited_time: new Date(page.last_edited_time).getTime(),\n parent_id: page.parent?.page_id || page.parent?.database_id || '',\n parent_table:\n page.parent?.type === 'database_id' ? 'collection' : 'space',\n alive: true,\n properties: {\n title: title ? [[title]] : []\n },\n format: {\n page_icon: page.icon?.emoji || page.icon?.external?.url,\n page_cover: page.cover?.external?.url || page.cover?.file?.url\n },\n content: []\n } as unknown as notion.Block\n }\n\n /**\n * Convert Official API block to unofficial format\n */\n private convertOfficialBlock(block: any): notion.Block {\n const baseBlock = {\n id: block.id,\n version: 1,\n created_time: new Date(block.created_time).getTime(),\n last_edited_time: new Date(block.last_edited_time).getTime(),\n parent_id: block.parent?.page_id || block.parent?.block_id || '',\n parent_table: 'block' as const,\n alive: true,\n content: block.has_children ? [] : undefined\n }\n\n const blockData = block[block.type]\n\n switch (block.type) {\n case 'paragraph':\n return {\n ...baseBlock,\n type: 'text',\n properties: {\n title: this.convertRichText(blockData?.rich_text)\n }\n } as unknown as notion.Block\n\n case 'heading_1':\n return {\n ...baseBlock,\n type: 'header',\n properties: {\n title: this.convertRichText(blockData?.rich_text)\n }\n } as unknown as notion.Block\n\n case 'heading_2':\n return {\n ...baseBlock,\n type: 'sub_header',\n properties: {\n title: this.convertRichText(blockData?.rich_text)\n }\n } as unknown as notion.Block\n\n case 'heading_3':\n return {\n ...baseBlock,\n type: 'sub_sub_header',\n properties: {\n title: this.convertRichText(blockData?.rich_text)\n }\n } as unknown as notion.Block\n\n case 'bulleted_list_item':\n return {\n ...baseBlock,\n type: 'bulleted_list',\n properties: {\n title: this.convertRichText(blockData?.rich_text)\n }\n } as unknown as notion.Block\n\n case 'numbered_list_item':\n return {\n ...baseBlock,\n type: 'numbered_list',\n properties: {\n title: this.convertRichText(blockData?.rich_text)\n }\n } as unknown as notion.Block\n\n case 'quote':\n return {\n ...baseBlock,\n type: 'quote',\n properties: {\n title: this.convertRichText(blockData?.rich_text)\n }\n } as unknown as notion.Block\n\n case 'code':\n return {\n ...baseBlock,\n type: 'code',\n properties: {\n title: this.convertRichText(blockData?.rich_text),\n language: [[blockData?.language || 'plain text']]\n }\n } as unknown as notion.Block\n\n case 'callout':\n return {\n ...baseBlock,\n type: 'callout',\n properties: {\n title: this.convertRichText(blockData?.rich_text)\n },\n format: {\n page_icon: blockData?.icon?.emoji\n }\n } as unknown as notion.Block\n\n case 'divider':\n return {\n ...baseBlock,\n type: 'divider'\n } as unknown as notion.Block\n\n case 'image':\n const imgUrl = blockData?.file?.url || blockData?.external?.url\n return {\n ...baseBlock,\n type: 'image',\n properties: {\n source: imgUrl ? [[imgUrl]] : [],\n caption: this.convertRichText(blockData?.caption)\n },\n format: {\n display_source: imgUrl\n }\n } as unknown as notion.Block\n\n case 'video':\n const videoUrl = blockData?.file?.url || blockData?.external?.url\n return {\n ...baseBlock,\n type: 'video',\n properties: {\n source: videoUrl ? [[videoUrl]] : []\n },\n format: {\n display_source: videoUrl\n }\n } as unknown as notion.Block\n\n case 'toggle':\n return {\n ...baseBlock,\n type: 'toggle',\n properties: {\n title: this.convertRichText(blockData?.rich_text)\n }\n } as unknown as notion.Block\n\n case 'to_do':\n return {\n ...baseBlock,\n type: 'to_do',\n properties: {\n title: this.convertRichText(blockData?.rich_text),\n checked: blockData?.checked ? [['Yes']] : [['No']]\n }\n } as unknown as notion.Block\n\n default:\n return {\n ...baseBlock,\n type: block.type\n } as unknown as notion.Block\n }\n }\n\n /**\n * Convert Official API rich_text to unofficial format\n */\n private convertRichText(richText: any[]): notion.Decoration[] {\n if (!richText || !Array.isArray(richText)) return []\n\n return richText.map(item => {\n const decorations: any[] = []\n\n if (item.annotations?.bold) decorations.push(['b'])\n if (item.annotations?.italic) decorations.push(['i'])\n if (item.annotations?.strikethrough) decorations.push(['s'])\n if (item.annotations?.underline) decorations.push(['_'])\n if (item.annotations?.code) decorations.push(['c'])\n if (item.href) decorations.push(['a', item.href])\n\n if (decorations.length === 0) {\n return [item.plain_text || '']\n }\n\n return [item.plain_text || '', decorations]\n }) as notion.Decoration[]\n }\n\n /**\n * Extract title from Official API page properties\n */\n private extractTitleFromProperties(properties: any): string {\n if (!properties) return ''\n\n for (const key of Object.keys(properties)) {\n const prop = properties[key]\n if (prop.type === 'title' && prop.title?.length > 0) {\n return prop.title.map((t: any) => t.plain_text || '').join('')\n }\n }\n return ''\n }\n\n /**\n * Fetch from Official Notion API\n */\n private async fetchOfficialApi<T>({\n endpoint,\n method = 'GET',\n body,\n ofetchOptions\n }: {\n endpoint: string\n method?: 'GET' | 'POST'\n body?: object\n ofetchOptions?: OfetchOptions\n }): Promise<T> {\n const url = `https://api.notion.com/v1/${endpoint}`\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this._officialApiToken}`,\n 'Notion-Version': '2022-06-28',\n 'Content-Type': 'application/json'\n }\n\n return ofetch(url, {\n method,\n body: method === 'POST' ? body : undefined,\n headers,\n responseType: 'json'\n }) as Promise<T>\n }\n}\n"],"mappings":"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","names":["_a","_b","type"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@slogvo/notion-client",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.4",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Robust TypeScript client for the unofficial Notion API.",
|
|
6
6
|
"repository": "slogvo/vue-notion",
|
|
@@ -42,8 +42,8 @@
|
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"ofetch": "^1.4.1",
|
|
45
|
-
"@slogvo/notion-types": "^0.1.
|
|
46
|
-
"@slogvo/notion-utils": "^0.1.
|
|
45
|
+
"@slogvo/notion-types": "^0.1.1",
|
|
46
|
+
"@slogvo/notion-utils": "^0.1.2",
|
|
47
47
|
"p-map": "^7.0.3"
|
|
48
48
|
}
|
|
49
49
|
}
|