{"version":3,"file":"index.mjs","names":["block"],"sources":["../src/convert-color.ts","../src/convert-rich-text.ts","../src/convert-time.ts","../src/convert-block.ts","../src/convert-page.ts","../src/notion-compat-api.ts"],"sourcesContent":["import type * as notion from 'notion-types'\n\nexport function convertColor(color: string): notion.Color {\n  switch (color) {\n    case 'green':\n      return 'teal'\n\n    case 'green_background':\n      return 'teal_background'\n\n    default:\n      return color as notion.Color\n  }\n}\n","import type * as notion from 'notion-types'\n\nimport type * as types from './types'\nimport { convertColor } from './convert-color'\n\nexport function convertRichText(richText: types.RichText): notion.Decoration[] {\n  return (richText || []).map(convertRichTextItem).filter(Boolean)\n}\n\nexport function convertRichTextItem(\n  richTextItem: types.RichTextItem\n): notion.Decoration {\n  const subdecorations: notion.SubDecoration[] = []\n\n  if (richTextItem.annotations.bold) {\n    subdecorations.push(['b'])\n  }\n\n  if (richTextItem.annotations.italic) {\n    subdecorations.push(['i'])\n  }\n\n  if (richTextItem.annotations.strikethrough) {\n    subdecorations.push(['s'])\n  }\n\n  if (richTextItem.annotations.underline) {\n    subdecorations.push(['_'])\n  }\n\n  if (richTextItem.annotations.code) {\n    subdecorations.push(['c'])\n  }\n\n  if (richTextItem.annotations.color !== 'default') {\n    subdecorations.push(['h', convertColor(richTextItem.annotations.color)])\n  }\n\n  const details = richTextItem[\n    richTextItem.type as keyof types.RichTextItem\n  ] as any\n  if (details && typeof details === 'object') {\n    if (details.link?.url) {\n      subdecorations.push(['a', details.link.url])\n    }\n  }\n\n  switch (richTextItem.type) {\n    case 'text':\n      if (subdecorations.length) {\n        return [richTextItem.text.content, subdecorations]\n      } else {\n        return [richTextItem.text.content]\n      }\n\n    case 'equation':\n      if (richTextItem.equation?.expression) {\n        subdecorations.unshift(['e', richTextItem.equation.expression])\n      }\n\n      return ['⁍', subdecorations]\n\n    case 'mention': {\n      const { mention } = richTextItem\n\n      if (mention) {\n        switch (mention.type) {\n          case 'link_preview':\n            // TODO: this should be an eoi, but we don't hae the proper data\n            subdecorations.push(['a', mention.link_preview.url])\n            break\n\n          case 'page':\n            subdecorations.push(['p', mention.page.id])\n            return ['‣', subdecorations]\n\n          case 'database':\n            subdecorations.push(['p', mention.database.id])\n            return ['‣', subdecorations]\n\n          case 'date':\n            subdecorations.unshift([\n              'd',\n              {\n                type: 'date', // TODO\n                start_date: mention.date.start,\n                end_date: mention.date.end || undefined,\n                time_zone: mention.date.time_zone || undefined\n              }\n            ])\n            break\n\n          case 'user':\n            subdecorations.push(['u', mention.user.id])\n            break\n\n          case 'template_mention':\n            // TODO\n            // subdecorations.push(['m', mention.template_mention.type])\n            break\n\n          default:\n            // TODO\n            break\n        }\n      }\n\n      return [richTextItem.plain_text, subdecorations]\n    }\n\n    default:\n      return ['']\n  }\n}\n","export function convertTime(time?: string): number | undefined {\n  if (time) {\n    try {\n      return new Date(time).getTime()\n    } catch {\n      // ignore invalid time strings\n    }\n  }\n\n  return undefined\n}\n","import type * as notion from 'notion-types'\n\nimport type * as types from './types'\nimport { convertColor } from './convert-color'\nimport { convertRichText } from './convert-rich-text'\nimport { convertTime } from './convert-time'\n\nexport function convertBlock({\n  block: partialBlock,\n  children = [],\n  pageMap,\n  blockMap,\n  parentMap\n}: {\n  block: types.PartialBlock\n  children?: string[]\n  pageMap?: types.PageMap\n  blockMap?: types.BlockMap\n  parentMap?: types.ParentMap\n}): notion.Block {\n  const compatBlock: Partial<notion.BaseBlock> = {\n    id: partialBlock.id\n  }\n\n  if (children && children.length) {\n    compatBlock.content = children\n  }\n\n  const block = partialBlock as types.Block\n  if (!block.type) {\n    return compatBlock as notion.Block\n  }\n\n  compatBlock.properties = {}\n  compatBlock.format = {}\n  compatBlock.type = block.type as any // TODO\n  compatBlock.created_time = convertTime(block.created_time)\n  compatBlock.last_edited_time = convertTime(block.last_edited_time)\n  if (block.created_by) {\n    compatBlock.created_by_table = `notion_${block.created_by.object}`\n    compatBlock.created_by_id = block.created_by.id\n  }\n  compatBlock.last_edited_by_table = block.last_edited_by?.object\n  compatBlock.last_edited_by_id = block.last_edited_by?.id\n  compatBlock.alive = block.archived !== true\n\n  if (parentMap) {\n    const parentId = parentMap[block.id]\n\n    if (parentId) {\n      compatBlock.parent_id = parentId\n\n      const parentBlock = blockMap?.[parentId] as types.Block\n      if (parentBlock) {\n        switch (parentBlock.type) {\n          case 'child_database':\n            compatBlock.parent_table = 'table'\n            break\n\n          // case 'child_page':\n          // fallthrough\n          default:\n            compatBlock.parent_table = 'block'\n            break\n        }\n      } else {\n        const parentPage = pageMap?.[parentId] as types.Page\n\n        if (parentPage) {\n          compatBlock.parent_table = 'block'\n        }\n      }\n    }\n  }\n\n  const blockDetails: any = block[block.type as keyof types.Block]\n  if (blockDetails) {\n    if (blockDetails.rich_text) {\n      compatBlock.properties.title = convertRichText(blockDetails.rich_text)\n    }\n\n    if (blockDetails.color) {\n      compatBlock.format.block_color = convertColor(blockDetails.color)\n    }\n\n    if (blockDetails.icon) {\n      switch (blockDetails.icon.type) {\n        case 'emoji':\n          compatBlock.format.page_icon = blockDetails.icon.emoji\n          break\n\n        case 'external':\n          compatBlock.format.page_icon = blockDetails.icon.external.url\n          break\n\n        case 'file':\n          compatBlock.format.page_icon = blockDetails.icon.file.url\n          break\n      }\n    }\n\n    if (blockDetails.type) {\n      switch (blockDetails.type) {\n        case 'external':\n          compatBlock.properties.source = [[blockDetails.external.url]]\n          break\n\n        case 'file':\n          compatBlock.properties.source = [[blockDetails.file.url]]\n          break\n      }\n    }\n  }\n\n  switch (block.type) {\n    case 'paragraph':\n      compatBlock.type = 'text'\n      if (!block.paragraph?.rich_text?.length) {\n        delete compatBlock.properties\n      }\n      break\n\n    case 'heading_1':\n      compatBlock.type = 'header'\n      break\n\n    case 'heading_2':\n      compatBlock.type = 'sub_header'\n      break\n\n    case 'heading_3':\n      compatBlock.type = 'sub_sub_header'\n      break\n\n    case 'heading_4' as any:\n      compatBlock.type = 'header_4'\n      break\n\n    case 'bulleted_list_item':\n      compatBlock.type = 'bulleted_list'\n      break\n\n    case 'numbered_list_item':\n      compatBlock.type = 'numbered_list'\n      break\n\n    case 'quote':\n      // no-op\n      break\n\n    case 'to_do':\n      if (block.to_do?.checked) {\n        compatBlock.properties.checked = [['Yes']]\n      }\n      break\n\n    case 'toggle':\n      // no-op\n      break\n\n    case 'code':\n      if (block.code.language) {\n        compatBlock.properties.language = [[block.code.language]]\n      }\n      break\n\n    case 'callout':\n      // no-op\n      break\n\n    case 'file':\n      // no-op\n      break\n\n    case 'divider':\n      // no-op\n      break\n\n    case 'breadcrumb':\n      // TODO\n      break\n\n    case 'table_of_contents':\n      // no-op\n      break\n\n    case 'column_list':\n      // no-op\n      break\n\n    case 'column':\n      // no-op\n      break\n\n    case 'bookmark':\n      if (block.bookmark.url) {\n        compatBlock.properties.link = [[block.bookmark.url]]\n      }\n\n      if (block.bookmark.caption) {\n        compatBlock.properties.description = convertRichText(\n          block.bookmark.caption\n        )\n      }\n      break\n\n    case 'link_to_page':\n      compatBlock.type = 'alias'\n      switch (block.link_to_page?.type) {\n        case 'page_id':\n          compatBlock.format.alias_pointer = {\n            id: block.link_to_page.page_id,\n            table: 'block'\n          }\n          break\n\n        case 'database_id':\n          compatBlock.format.alias_pointer = {\n            id: block.link_to_page.database_id,\n            table: 'table'\n          }\n          break\n      }\n      break\n\n    case 'child_page':\n      compatBlock.type = 'page'\n\n      if (pageMap) {\n        const page = pageMap[block.id] as types.Page\n        if (page) {\n          if (page.properties.title) {\n            compatBlock.properties.title = convertRichText(\n              (page.properties.title as any).rich_text ||\n                (page.properties.title as any).title\n            )\n          }\n\n          if (page.cover) {\n            switch (page.cover.type) {\n              case 'external':\n                compatBlock.format.page_cover = page.cover.external.url\n                break\n\n              case 'file':\n                compatBlock.format.page_cover = page.cover.file.url\n                break\n            }\n\n            // TODO\n            compatBlock.format.page_cover_position = 0.5\n          }\n\n          if (page.icon) {\n            switch (page.icon.type) {\n              case 'emoji':\n                compatBlock.format.page_icon = page.icon.emoji\n                break\n\n              case 'external':\n                compatBlock.format.page_icon = page.icon.external.url\n                break\n\n              case 'file':\n                compatBlock.format.page_icon = page.icon.file.url\n                break\n            }\n          }\n\n          if (page.parent) {\n            switch (page.parent.type) {\n              case 'workspace':\n                compatBlock.parent_table = 'space'\n                break\n\n              case 'database_id':\n                compatBlock.parent_table = 'table'\n                break\n\n              case 'page_id':\n                compatBlock.parent_table = 'block'\n                break\n            }\n          }\n        }\n      }\n\n      if (block.child_page) {\n        if (block.child_page.title) {\n          compatBlock.properties.title = [[block.child_page.title]]\n        }\n      }\n\n      break\n\n    case 'template':\n      // TODO\n      break\n\n    case 'synced_block':\n      if (block.synced_block.synced_from) {\n        // TODO: handle block.synced_block.synced_from.type for non-block types\n        compatBlock.type = 'transclusion_reference'\n        compatBlock.format.transclusion_reference_pointer = {\n          id: block.synced_block.synced_from.block_id,\n          table: 'block'\n        }\n      } else {\n        compatBlock.type = 'transclusion_container'\n      }\n      break\n\n    case 'equation':\n      if (block.equation?.expression) {\n        compatBlock.properties.title = [[block.equation.expression]]\n      }\n      break\n\n    case 'child_database':\n      // TODO\n      break\n\n    case 'table':\n      if (blockDetails.table_width && blockDetails.table_width > 0) {\n        // There is no API to get the column ID. Used the index instead.\n        compatBlock.format.table_block_column_order = Array.from(\n          { length: blockDetails.table_width },\n          (_, i) => '' + i\n        )\n        compatBlock.format.table_block_column_format =\n          compatBlock.format.table_block_column_order.map((order: any) => {\n            return {\n              [order]: {\n                // TODO: The SimpleTable column has no width and color. API is not supported.\n                // width: 155,\n                // color:\n              }\n            }\n          })\n      }\n      if (blockDetails.has_column_header) {\n        compatBlock.format.table_block_column_header =\n          blockDetails.has_column_header\n      }\n      if (blockDetails.has_row_header) {\n        compatBlock.format.table_block_row_header = blockDetails.has_row_header\n      }\n      break\n\n    case 'table_row':\n      // TODO\n      // compatBlock.properties = {\n      //   ...block.table_row?.cells?.map((cell) => convertRichText(cell))\n      // }\n      break\n\n    case 'pdf':\n      // TODO: formatting\n      compatBlock.format.block_page_width = true\n      compatBlock.format.block_height = '80vh'\n      break\n\n    case 'video':\n      // TODO: formatting\n      compatBlock.format.block_page_width = true\n      compatBlock.format.block_aspect_ratio = 0.562_060_889_929_742_3\n\n      try {\n        const url = compatBlock.properties.source?.[0]?.[0]\n\n        if (!url) break\n        const u = new URL(url)\n\n        switch (u.hostname) {\n          case 'loom.com':\n          case 'www.loom.com':\n            u.pathname = u.pathname.replace(/^\\/share\\//i, '/embed/')\n            compatBlock.format.display_source = u.toString()\n            break\n        }\n      } catch {\n        // ignore invalid urls\n      }\n      break\n\n    case 'embed': {\n      // TODO: embedding really needs to use some sort of externaly embed API like\n      // embedly or microlinkhq. Currently, many embed use cases will not work or\n      // display properly.\n      const url = block.embed?.url\n\n      // TODO: formatting\n      compatBlock.format.block_page_width = true\n      compatBlock.format.block_height = '30vh'\n\n      if (url) {\n        compatBlock.properties.source = [[url]]\n\n        try {\n          const u = new URL(url)\n\n          switch (u.hostname) {\n            case 'twitter.com':\n              compatBlock.type = 'tweet'\n              delete compatBlock.format\n              break\n\n            case 'maps.google.com':\n              compatBlock.type = 'maps'\n              break\n\n            case 'excalidraw.com':\n              compatBlock.type = 'excalidraw'\n              break\n\n            case 'codepen.io':\n              compatBlock.type = 'codepen'\n              break\n\n            case 'docs.google.com':\n            // fallthrough\n            case 'drive.google.com':\n              compatBlock.type = 'drive'\n\n              // TODO: fetch drive_properties\n              break\n\n            case 'figma.com':\n              compatBlock.type = 'figma'\n              break\n\n            case 'open.spotify.com':\n              if (\n                u.pathname.includes('/embed/') ||\n                u.pathname.includes('/embed-podcast/')\n              ) {\n                break\n              }\n\n              if (u.pathname.startsWith('/playlist/')) {\n                u.pathname = `/embed${u.pathname}`\n              } else if (u.pathname.startsWith('/episode/')) {\n                u.pathname = `/embed-podcast${u.pathname}`\n              }\n\n              u.search = ''\n              compatBlock.format.display_source = u.toString()\n              break\n\n            case 'airtable.com':\n              if (!u.pathname.startsWith('/embed/')) {\n                u.pathname = `/embed${u.pathname}`\n                compatBlock.format.display_source = u.toString()\n              }\n              break\n\n            case 'soundcloud.com':\n              // TODO\n              break\n          }\n        } catch {\n          // ignore invalid urls\n        }\n      }\n      break\n    }\n\n    case 'image':\n      // TODO : Add image format\n      if (block.image) {\n        compatBlock.properties.source = [\n          [(block.image as any).file?.url || (block.image as any).external?.url]\n        ]\n\n        if (block.image.caption) {\n          compatBlock.properties.caption = block.image.caption.map((caption) =>\n            convertRichText([caption])\n          )\n        }\n      }\n      break\n\n    case 'audio':\n      // no-op\n      break\n\n    case 'link_preview':\n      // TODO\n      break\n\n    case 'unsupported':\n      // no-op\n      break\n  }\n\n  return compatBlock as notion.Block\n}\n","import type * as notion from 'notion-types'\n\nimport type * as types from './types'\nimport { convertBlock } from './convert-block'\n\nexport function convertPage({\n  pageId,\n  blockMap,\n  blockChildrenMap,\n  pageMap,\n  parentMap\n}: {\n  pageId: string\n  blockMap: types.BlockMap\n  blockChildrenMap: types.BlockChildrenMap\n  pageMap: types.PageMap\n  parentMap: types.ParentMap\n}): notion.ExtendedRecordMap {\n  const compatBlocks = Object.values(blockMap).map((block) =>\n    convertBlock({\n      block,\n      children: blockChildrenMap[block.id],\n      pageMap,\n      blockMap,\n      parentMap\n    })\n  )\n\n  const compatPageBlock = convertPageBlock({\n    pageId,\n    blockMap,\n    blockChildrenMap,\n    pageMap,\n    parentMap\n  })\n\n  const compatPageBlocks = Object.keys(pageMap)\n    .filter((id) => id !== pageId)\n    .map((id) =>\n      convertPageBlock({\n        pageId: id,\n        blockMap,\n        blockChildrenMap,\n        pageMap,\n        parentMap\n      })\n    )\n\n  const compatBlockMap = Object.fromEntries(\n    [compatPageBlock, ...compatBlocks, ...compatPageBlocks]\n      .filter(Boolean)\n      .map((block) => [\n        block!.id,\n        {\n          type: 'reader',\n          value: block!\n        }\n      ])\n  )\n\n  return {\n    block: compatBlockMap as any,\n    collection: {},\n    collection_view: {},\n    collection_query: {},\n    signed_urls: {},\n    notion_user: {}\n  }\n}\n\nexport function convertPageBlock({\n  pageId,\n  blockMap,\n  blockChildrenMap,\n  pageMap,\n  parentMap\n}: {\n  pageId: string\n  blockMap: types.BlockMap\n  blockChildrenMap: types.BlockChildrenMap\n  pageMap: types.PageMap\n  parentMap: types.ParentMap\n}): notion.Block | null {\n  const partialPage = pageMap[pageId]\n  const page = partialPage as types.Page\n\n  if (page) {\n    const compatPageBlock = convertBlock({\n      block: { ...page, type: 'child_page' } as unknown as types.Block,\n      children: blockChildrenMap[page.id],\n      pageMap,\n      blockMap,\n      parentMap\n    })\n\n    return compatPageBlock\n  }\n\n  return null\n}\n","import type { Client } from '@notionhq/client'\nimport type * as notion from 'notion-types'\nimport { parsePageId } from 'notion-utils'\nimport PQueue from 'p-queue'\n\nimport type * as types from './types'\nimport { convertPage } from './convert-page'\n\nexport class NotionCompatAPI {\n  client: Client\n\n  constructor(client: Client) {\n    this.client = client\n  }\n\n  public async getPage(rawPageId: string): Promise<notion.ExtendedRecordMap> {\n    const pageId = parsePageId(rawPageId)\n    if (!pageId) {\n      throw new Error(`Invalid page id \"${rawPageId}\"`)\n    }\n\n    const [page, block, children] = await Promise.all([\n      this.client.pages.retrieve({ page_id: pageId }),\n      this.client.blocks.retrieve({ block_id: pageId }),\n      this.getAllBlockChildren(pageId)\n    ])\n    const { blockMap, blockChildrenMap, pageMap, parentMap } =\n      await this.resolvePage(pageId)\n\n    const recordMap = convertPage({\n      pageId,\n      blockMap,\n      blockChildrenMap,\n      pageMap,\n      parentMap\n    })\n\n    ;(recordMap as any).raw = {\n      page,\n      block,\n      children\n    }\n\n    return recordMap\n  }\n\n  async resolvePage(\n    rootBlockId: string,\n    {\n      concurrency = 4\n    }: {\n      concurrency?: number\n    } = {}\n  ) {\n    const blockMap: types.BlockMap = {}\n    const pageMap: types.PageMap = {}\n    const parentMap: types.ParentMap = {}\n    const blockChildrenMap: types.BlockChildrenMap = {}\n    const pendingBlockIds = new Set<string>()\n    const queue = new PQueue({ concurrency })\n\n    const processBlock = async (\n      blockId: string,\n      { shallow = false }: { shallow?: boolean } = {}\n    ) => {\n      if (!blockId || pendingBlockIds.has(blockId)) {\n        return\n      }\n\n      pendingBlockIds.add(blockId)\n      void queue.add(async () => {\n        try {\n          let partialBlock = blockMap[blockId]\n          if (!partialBlock) {\n            partialBlock = await this.client.blocks.retrieve({\n              block_id: blockId\n            })\n            blockMap[blockId] = partialBlock\n          }\n\n          const block = partialBlock as types.Block\n          if (block.type === 'child_page') {\n            if (!pageMap[blockId]) {\n              const partialPage = await this.client.pages.retrieve({\n                page_id: blockId\n              })\n\n              pageMap[blockId] = partialPage\n\n              const page = partialPage as types.Page\n              switch (page.parent?.type) {\n                case 'page_id':\n                  void processBlock(page.parent.page_id, {\n                    shallow: true\n                  })\n                  if (!parentMap[blockId]) {\n                    parentMap[blockId] = page.parent.page_id\n                  }\n                  break\n\n                case 'database_id':\n                  void processBlock(page.parent.database_id, {\n                    shallow: true\n                  })\n                  if (!parentMap[blockId]) {\n                    parentMap[blockId] = page.parent.database_id\n                  }\n                  break\n              }\n            }\n\n            if (blockId !== rootBlockId) {\n              // don't fetch children or recurse on subpages\n              return\n            }\n          }\n\n          if (shallow) {\n            return\n          }\n\n          const children = await this.getAllBlockChildren(blockId)\n          blockChildrenMap[blockId] = children.map((child) => child.id)\n\n          for (const child of children) {\n            const childBlock = child as types.Block\n            const mappedChildBlock = blockMap[child.id] as types.Block\n            if (\n              !mappedChildBlock ||\n              (!mappedChildBlock.type && childBlock.type)\n            ) {\n              blockMap[child.id] = childBlock\n              parentMap[child.id] = blockId\n\n              const details: any =\n                childBlock[childBlock.type as keyof types.Block]\n              if (details?.rich_text) {\n                const richTextMentions = details.rich_text.filter(\n                  (richTextItem: types.RichTextItem) =>\n                    richTextItem.type === 'mention'\n                )\n\n                for (const richTextMention of richTextMentions) {\n                  switch (richTextMention.mention?.type) {\n                    case 'page': {\n                      const pageId = richTextMention.mention.page.id\n                      void processBlock(pageId, { shallow: true })\n                      break\n                    }\n\n                    case 'database': {\n                      const databaseId = richTextMention.mention.database.id\n                      void processBlock(databaseId, { shallow: true })\n                      break\n                    }\n                  }\n                }\n              }\n\n              if (childBlock.type === 'link_to_page') {\n                switch (childBlock.link_to_page?.type) {\n                  case 'page_id':\n                    void processBlock(childBlock.link_to_page.page_id, {\n                      shallow: true\n                    })\n                    break\n\n                  case 'database_id':\n                    void processBlock(childBlock.link_to_page.database_id, {\n                      shallow: true\n                    })\n                    break\n                }\n              }\n\n              if (\n                childBlock.has_children &&\n                childBlock.type !== 'child_database'\n              ) {\n                void processBlock(childBlock.id)\n              }\n            }\n          }\n        } catch (err: any) {\n          console.warn('failed resolving block', blockId, err.message)\n        } finally {\n          pendingBlockIds.delete(blockId)\n        }\n      })\n    }\n\n    await processBlock(rootBlockId)\n    await queue.onIdle()\n\n    return {\n      blockMap,\n      blockChildrenMap,\n      pageMap,\n      parentMap\n    }\n  }\n\n  async getAllBlockChildren(blockId: string) {\n    let blocks: types.BlockChildren = []\n    let cursor: string | undefined\n\n    do {\n      const res = await this.client.blocks.children.list({\n        block_id: blockId,\n        start_cursor: cursor\n      })\n\n      blocks = blocks.concat(res.results)\n      if (!res.next_cursor) break\n\n      cursor = res.next_cursor\n    } while (cursor)\n\n    return blocks\n  }\n}\n"],"mappings":"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"}