Coder Social home page Coder Social logo

amrtsuper / notion-sdk-js Goto Github PK

View Code? Open in Web Editor NEW

This project forked from makenotion/notion-sdk-js

0.0 0.0 0.0 4.29 MB

Official Notion JavaScript Client

Home Page: https://developers.notion.com/docs

License: MIT License

Shell 0.12% JavaScript 0.26% TypeScript 99.62%

notion-sdk-js's Introduction

Notion SDK for JavaScript

A simple and easy to use client for the Notion API


Build status npm version

Installation

npm install @notionhq/client

Usage

Use Notion's Getting Started Guide to get set up to use Notion's API.

Import and initialize a client using an integration token or an OAuth access token.

const { Client } = require("@notionhq/client")

// Initializing a client
const notion = new Client({
  auth: process.env.NOTION_TOKEN,
})

Make a request to any Notion API endpoint.

See the complete list of endpoints in the API reference.

;(async () => {
  const listUsersResponse = await notion.users.list({})
})()

Each method returns a Promise which resolves the response.

console.log(listUsersResponse)
{
  results: [
    {
      object: 'user',
      id: 'd40e767c-d7af-4b18-a86d-55c61f1e39a4',
      type: 'person',
      person: {
        email: '[email protected]',
      },
      name: 'Avocado Lovelace',
      avatar_url: 'https://secure.notion-static.com/e6a352a8-8381-44d0-a1dc-9ed80e62b53d.jpg',
    },
    ...
  ]
}

Endpoint parameters are grouped into a single object. You don't need to remember which parameters go in the path, query, or body.

const myPage = await notion.databases.query({
  database_id: "897e5a76-ae52-4b48-9fdf-e71f5945d1af",
  filter: {
    property: "Landmark",
    rich_text: {
      contains: "Bridge",
    },
  },
})

Handling errors

If the API returns an unsuccessful response, the returned Promise rejects with a APIResponseError.

The error contains properties from the response, and the most helpful is code. You can compare code to the values in the APIErrorCode object to avoid misspelling error codes.

const { Client, APIErrorCode } = require("@notionhq/client")

try {
  const notion = new Client({ auth: process.env.NOTION_TOKEN })
  const myPage = await notion.databases.query({
    database_id: databaseId,
    filter: {
      property: "Landmark",
      rich_text: {
        contains: "Bridge",
      },
    },
  })
} catch (error) {
  if (error.code === APIErrorCode.ObjectNotFound) {
    //
    // For example: handle by asking the user to select a different database
    //
  } else {
    // Other error handling code
    console.error(error)
  }
}

Logging

The client emits useful information to a logger. By default, it only emits warnings and errors.

If you're debugging an application, and would like the client to log response bodies, set the logLevel option to LogLevel.DEBUG.

const { Client, LogLevel } = require("@notionhq/client")

const notion = new Client({
  auth: process.env.NOTION_TOKEN,
  logLevel: LogLevel.DEBUG,
})

You may also set a custom logger to emit logs to a destination other than stdout. A custom logger is a function which is called with 3 parameters: logLevel, message, and extraInfo. The custom logger should not return a value.

Client options

The Client supports the following options on initialization. These options are all keys in the single constructor parameter.

Option Default value Type Description
auth undefined string Bearer token for authentication. If left undefined, the auth parameter should be set on each request.
logLevel LogLevel.WARN LogLevel Verbosity of logs the instance will produce. By default, logs are written to stdout.
timeoutMs 60_000 number Number of milliseconds to wait before emitting a RequestTimeoutError
baseUrl "https://api.notion.com" string The root URL for sending API requests. This can be changed to test with a mock server.
logger Log to console Logger A custom logging function. This function is only called when the client emits a log that is equal or greater severity than logLevel.
agent Default node agent http.Agent Used to control creation of TCP sockets. A common use is to proxy requests with https-proxy-agent

TypeScript

This package contains type definitions for all request parameters and responses, as well as some useful sub-objects from those entities.

Because errors in TypeScript start with type any or unknown, you should use the isNotionClientError type guard to handle them in a type-safe way. Each NotionClientError type is uniquely identified by its error.code. Codes in the APIErrorCode enum are returned from the server. Codes in the ClientErrorCode enum are produced on the client.

try {
  const response = await notion.databases.query({
    /* ... */
  })
} catch (error: unknown) {
  if (isNotionClientError(error)) {
    // error is now strongly typed to NotionClientError
    switch (error.code) {
      case ClientErrorCode.RequestTimeout:
        // ...
        break
      case APIErrorCode.ObjectNotFound:
        // ...
        break
      case APIErrorCode.Unauthorized:
        // ...
        break
      // ...
      default:
        // you could even take advantage of exhaustiveness checking
        assertNever(error.code)
    }
  }
}

Type guards

There are several type guards provided to distinguish between full and partial API responses.

Type guard function Purpose
isFullPage Determine whether an object is a full PageObjectResponse
isFullBlock Determine whether an object is a full BlockObjectResponse
isFullDatabase Determine whether an object is a full DatabaseObjectResponse
isFullPageOrDatabase Determine whether an object is a full PageObjectResponse or DatabaseObjectResponse
isFullUser Determine whether an object is a full UserObjectResponse
isFullComment Determine whether an object is a full CommentObjectResponse

Here is an example of using a type guard:

const fullOrPartialPages = await notion.databases.query({
  database_id: "897e5a76-ae52-4b48-9fdf-e71f5945d1af",
})
for (const page of fullOrPartialPages.results) {
  if (!isFullPageOrDatabase(page)) {
    continue
  }
  // The page variable has been narrowed from
  //      PageObjectResponse | PartialPageObjectResponse | DatabaseObjectResponse | PartialDatabaseObjectResponse
  // to
  //      PageObjectResponse | DatabaseObjectResponse.
  console.log("Created at:", page.created_time)
}

Utility functions

This package also exports a few utility functions that are helpful for dealing with any of our paginated APIs.

iteratePaginatedAPI(listFn, firstPageArgs)

This utility turns any paginated API into an async iterator.

Parameters:

  • listFn: Any function on the Notion client that represents a paginated API (i.e. accepts start_cursor.) Example: notion.blocks.children.list.
  • firstPageArgs: Arguments that should be passed to the API on the first and subsequent calls to the API, for example a block_id.

Returns:

An async iterator over results from the API.

Example:

for await (const block of iteratePaginatedAPI(notion.blocks.children.list, {
  block_id: parentBlockId,
})) {
  // Do something with block.
}

collectPaginatedAPI(listFn, firstPageArgs)

This utility accepts the same arguments as iteratePaginatedAPI, but collects the results into an in-memory array.

Before using this utility, check that the data you are dealing with is small enough to fit in memory.

Parameters:

  • listFn: Any function on the Notion client that represents a paginated API (i.e. accepts start_cursor.) Example: notion.blocks.children.list.
  • firstPageArgs: Arguments that should be passed to the API on the first and subsequent calls to the API, for example a block_id.

Returns:

An array with results from the API.

Example:

const blocks = await collectPaginatedAPI(notion.blocks.children.list, {
  block_id: parentBlockId,
})
// Do something with blocks.

Requirements

This package supports the following minimum versions:

  • Runtime: node >= 12
  • Type definitions (optional): typescript >= 4.5

Earlier versions may still work, but we encourage people building new applications to upgrade to the current stable.

Getting help

If you want to submit a feature request for Notion's API, or are experiencing any issues with the API platform, please email us at [email protected].

To report issues with the SDK, it is possible to submit an issue to this repo. However, we don't monitor these issues very closely. We recommend you reach out to us at [email protected] instead.

notion-sdk-js's People

Contributors

97agupta avatar alicial avatar almawang avatar alpartr avatar aoberoi avatar blackmad avatar cwang314 avatar elb-notion avatar hazel-notion avatar huw avatar ichtum avatar ivoberger avatar jeremiah-notion avatar jessmitch42 avatar justjake avatar kajirikajiri avatar kiranpandit avatar lao9 avatar liuderchi avatar mlafontant avatar nishadagrawal avatar parulbaweja avatar pllnk avatar rhart92 avatar s-h-a-r-c avatar seratch avatar sidvermanotion avatar usagrada avatar wcauchois avatar yacinehmito avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.