Compare commits

...

19 Commits

Author SHA1 Message Date
Ian Cooperman 2c7084028f Merge branch 'data-transformation' into main 2022-08-06 16:50:06 -07:00
Ian Cooperman 876c74ba41 Wrote rudimentary creation of Notion pages with title and body 2022-08-06 16:37:12 -07:00
Ian Cooperman b3fe8075f5 Cleaned up index.js before continuing 2022-08-04 20:00:18 -07:00
Ian Cooperman 2571b5c360 Merge branch 'joplin-data-api-wrapper' into main 2022-08-04 19:37:45 -07:00
Ian Cooperman 5be9f56c12 Cleaned up joplin.js. Ready for merge into main. 2022-08-04 19:37:38 -07:00
Ian Cooperman c1ad4f0d6c Added loop to account for multiple fetches needed to retrieve all data 2022-08-04 18:16:28 -07:00
Ian Cooperman bce9f8a04d Moved joplin wrapper functions to class for cleaner usage 2022-08-04 16:25:28 -07:00
Ian Cooperman e5d4bdf90d Adjusted getNotesFromNotebook() to also take the fields to retrive 2022-08-04 15:16:02 -07:00
Ian Cooperman aab9cada6d Changed note retrieval URL parameters to obtain additional useful info 2022-08-02 12:36:49 -07:00
Ian Cooperman 8bca7443ca Function getNote no longer proved necessary 2022-08-02 12:29:56 -07:00
Ian Cooperman 2a6c968a99 Now getting note data for each note 2022-08-02 12:27:19 -07:00
Ian Cooperman a4bfa7dd05 Began work on interfacing with the Joplin Data API 2022-08-01 19:00:19 -07:00
Ian Cooperman 49f49112b3 Imported node-fetch into joplin api wrapper module 2022-08-01 15:01:37 -07:00
Ian Cooperman 4c41583ba8 Merge branch 'readme-draft' into main 2022-08-01 14:42:42 -07:00
Ian Cooperman b7b62b4ac8 Created rough draft of readme 2022-08-01 14:42:37 -07:00
Ian Cooperman 1df10d078a Merge branch 'node-fetch-install' into main 2022-08-01 13:46:19 -07:00
Ian Cooperman cfaa0c4a94 Added `node-fetch` to dependencies 2022-08-01 13:46:14 -07:00
Ian Cooperman 390c8ca68a Added brief description 2022-07-29 11:38:03 -07:00
Ian Cooperman 31affdc480 Merge branch 'notion-hello-world' into main 2022-07-29 11:34:36 -07:00
5 changed files with 464 additions and 27 deletions

222
README.md
View File

@ -1 +1,223 @@
# joplin2notion
A script meant to aid in the transfer of entries from [Joplin](https://joplinapp.org/) to [Notion](https://www.notion.so/)
<div id="top"></div>
<!--
*** Thanks for checking out the Best-README-Template. If you have a suggestion
*** that would make this better, please fork the repo and create a pull request
*** or simply open an issue with the tag "enhancement".
*** Don't forget to give the project a star!
*** Thanks again! Now go create something AMAZING! :D
-->
<!-- PROJECT SHIELDS -->
<!--
*** I'm using markdown "reference style" links for readability.
*** Reference links are enclosed in brackets [ ] instead of parentheses ( ).
*** See the bottom of this document for the declaration of the reference variables
*** for contributors-url, forks-url, etc. This is an optional, concise syntax you may use.
*** https://www.markdownguide.org/basic-syntax/#reference-style-links
-->
[![Contributors][contributors-shield]][contributors-url]
[![Forks][forks-shield]][forks-url]
[![Stargazers][stars-shield]][stars-url]
[![Issues][issues-shield]][issues-url]
[![MIT License][license-shield]][license-url]
[![LinkedIn][linkedin-shield]][linkedin-url]
<h3 align="center">joplin2notion</h3>
<p align="center">
A script meant to aid in the transfer of entries from <a href="https://joplinapp.org/">Joplin</a> to <a href="https://www.notion.so/">Notion</a>
<br />
<a href="https://github.com/iancooperman/joplin2notion"><strong>Explore the docs »</strong></a>
<br />
<br />
<a href="https://github.com/iancooperman/joplin2notion">View Demo</a>
·
<a href="https://github.com/iancooperman/joplin2notion/issues">Report Bug</a>
·
<a href="https://github.com/iancooperman/joplin2notion/issues">Request Feature</a>
</p>
</div>
<!-- TABLE OF CONTENTS -->
<details>
<summary>Table of Contents</summary>
<ol>
<li>
<a href="#about-the-project">About The Project</a>
<ul>
<li><a href="#built-with">Built With</a></li>
</ul>
</li>
<li>
<a href="#getting-started">Getting Started</a>
<ul>
<li><a href="#prerequisites">Prerequisites</a></li>
<li><a href="#installation">Installation</a></li>
</ul>
</li>
<li><a href="#usage">Usage</a></li>
<li><a href="#roadmap">Roadmap</a></li>
<li><a href="#contributing">Contributing</a></li>
<li><a href="#license">License</a></li>
<li><a href="#contact">Contact</a></li>
<li><a href="#acknowledgments">Acknowledgments</a></li>
</ol>
</details>
<!-- ABOUT THE PROJECT -->
## About The Project
[![Product Name Screen Shot][product-screenshot]](https://example.com)
Here's a blank template to get started: To avoid retyping too much info. Do a search and replace with your text editor for the following: `iancooperman`, `joplin2notion`, `@IanPLCooperman`, `ian-pl-cooperman`, `gmail`, `ian.pl.cooperman`, `joplin2notion`, `A script meant to aid in the transfer of entries from [Joplin](https://joplinapp.org/) to [Notion](https://www.notion.so/)`
<p align="right">(<a href="#top">back to top</a>)</p>
### Built With
* [![Node][Node.js]][Next-url]
* [![React][React.js]][React-url]
* [![Vue][Vue.js]][Vue-url]
* [![Angular][Angular.io]][Angular-url]
* [![Svelte][Svelte.dev]][Svelte-url]
* [![Laravel][Laravel.com]][Laravel-url]
* [![Bootstrap][Bootstrap.com]][Bootstrap-url]
* [![JQuery][JQuery.com]][JQuery-url]
<p align="right">(<a href="#top">back to top</a>)</p>
<!-- GETTING STARTED -->
## Getting Started
To get a local copy up and running follow these simple example steps.
### Prerequisites
This is an example of how to list things you need to use the software and how to install them.
* npm
```sh
npm install npm@latest -g
```
### Installation
1. Create a Notion integration and copy the internal integration token by following the steps here: [https://www.notion.so/help/add-and-manage-integrations-with-the-api](https://www.notion.so/help/add-and-manage-integrations-with-the-api)
2. Clone the repo
```sh
git clone https://github.com/iancooperman/joplin2notion.git
```
3. Install NPM packages
```sh
npm install
```
4. Enter your keys into a file called `.env`
```env
NOTION_TOKEN="secret_ABCDEFGHIJKLMNOPQRSTUVWXYZ123456"
JOPLIN_CLIPPER_PORT=41184
JOPLIN_AUTHORIZATION_TOKEN="e39c0d1dc22ff649a545cfe65b6f0b75cdeeeb0b5f923492b5bea4f390f40e9155efc34981843d156cf9c2489783fc6dc1515538e63cfb39d59f7946093f6ca2"
```
<p align="right">(<a href="#top">back to top</a>)</p>
<!-- USAGE EXAMPLES -->
## Usage
In a terminal, enter the following:
ps
```
node index.js [joplin-notebook-id] [notion-database-id]
```
*Use this space to show useful examples of how a project can be used. Additional screenshots, code examples and demos work well in this space. You may also link to more resources.*
<p align="right">(<a href="#top">back to top</a>)</p>
<!-- CONTRIBUTING -->
## Contributing
This code was written solely for my own purposes. I have no intention to maintain this repo after my own usage is done. I just thought that others might be able to benefit from my work here.
<!-- LICENSE -->
## License
Distributed under the MIT License. See `LICENSE.txt` for more information.
<p align="right">(<a href="#top">back to top</a>)</p>
<!-- CONTACT -->
## Contact
Ian Cooperman - [@IanPLCooperman](https://twitter.com/IanPLCooperman) - ian.pl.cooperman@gmail.com
Project Link: [https://github.com/iancooperman/joplin2notion](https://github.com/iancooperman/joplin2notion)
<p align="right">(<a href="#top">back to top</a>)</p>
<!-- ACKNOWLEDGMENTS -->
## Acknowledgments
* []()
* []()
* []()
<p align="right">(<a href="#top">back to top</a>)</p>
<!-- MARKDOWN LINKS & IMAGES -->
<!-- https://www.markdownguide.org/basic-syntax/#reference-style-links -->
[contributors-shield]: https://img.shields.io/github/contributors/iancooperman/joplin2notion.svg?style=for-the-badge
[contributors-url]: https://github.com/iancooperman/joplin2notion/graphs/contributors
[forks-shield]: https://img.shields.io/github/forks/iancooperman/joplin2notion.svg?style=for-the-badge
[forks-url]: https://github.com/iancooperman/joplin2notion/network/members
[stars-shield]: https://img.shields.io/github/stars/iancooperman/joplin2notion.svg?style=for-the-badge
[stars-url]: https://github.com/iancooperman/joplin2notion/stargazers
[issues-shield]: https://img.shields.io/github/issues/iancooperman/joplin2notion.svg?style=for-the-badge
[issues-url]: https://github.com/iancooperman/joplin2notion/issues
[license-shield]: https://img.shields.io/github/license/iancooperman/joplin2notion.svg?style=for-the-badge
[license-url]: https://github.com/iancooperman/joplin2notion/blob/master/LICENSE.txt
[linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=for-the-badge&logo=linkedin&colorB=555
[linkedin-url]: https://linkedin.com/in/ian-pl-cooperman
[product-screenshot]: images/screenshot.png
[Next.js]: https://img.shields.io/badge/next.js-000000?style=for-the-badge&logo=nextdotjs&logoColor=white
[Next-url]: https://nextjs.org/
[React.js]: https://img.shields.io/badge/React-20232A?style=for-the-badge&logo=react&logoColor=61DAFB
[React-url]: https://reactjs.org/
[Vue.js]: https://img.shields.io/badge/Vue.js-35495E?style=for-the-badge&logo=vuedotjs&logoColor=4FC08D
[Vue-url]: https://vuejs.org/
[Angular.io]: https://img.shields.io/badge/Angular-DD0031?style=for-the-badge&logo=angular&logoColor=white
[Angular-url]: https://angular.io/
[Svelte.dev]: https://img.shields.io/badge/Svelte-4A4A55?style=for-the-badge&logo=svelte&logoColor=FF3E00
[Svelte-url]: https://svelte.dev/
[Laravel.com]: https://img.shields.io/badge/Laravel-FF2D20?style=for-the-badge&logo=laravel&logoColor=white
[Laravel-url]: https://laravel.com
[Bootstrap.com]: https://img.shields.io/badge/Bootstrap-563D7C?style=for-the-badge&logo=bootstrap&logoColor=white
[Bootstrap-url]: https://getbootstrap.com
[JQuery.com]: https://img.shields.io/badge/jQuery-0769AD?style=for-the-badge&logo=jquery&logoColor=white
[JQuery-url]: https://jquery.com

View File

@ -1,12 +1,26 @@
// import variables from `.env`
require('dotenv').config();
const { Client } = require('@notionhq/client');
import 'dotenv/config'
import { Client } from '@notionhq/client'
import Joplin from './joplin.js'
const notion = new Client({auth: process.env.NOTION_KEY});
const joplin = new Joplin(process.env.JOPLIN_TOKEN, process.env.JOPLIN_CLIPPER_PORT)
const notion = new Client({auth: process.env.NOTION_TOKEN});
const joplinNotebookID = process.env.JOPLIN_NOTEBOOK_ID;
const notionDatabaseID = process.env.NOTION_DATABASE_ID;
const databaseID = process.env.NOTION_DATABASE_ID;
async function addItem(text) {
// essentially a main function
async function processNotes() {
const data = await joplin.getNotesFromNotebook(joplinNotebookID, ["title", "body", "created_time", "updated_time"])
for (let note of data) {
addPageToNotionDatabase(notionDatabaseID, note.title, note.body)
}
}
processNotes()
async function addPageToNotionDatabase(databaseID, title, body) {
try {
const response = await notion.pages.create({
parent: {database_id: databaseID},
@ -14,13 +28,40 @@ async function addItem(text) {
title: {
title: [
{
"type": "text",
"text": {
"content": text
}
}
"content": title,
"link": null
},
"annotations": {
"bold": false,
"italic": false,
"strikethrough": false,
"underline": false,
"code": false,
"color": "default"
},
"plain_text": "Grocery List",
"href": null
}
]
}
},
children: [
{
object: "block",
type: "paragraph",
paragraph: {
"rich_text": [
{
"text": {
"content": body
}
}
]
}
}
]
})
console.log(response);
console.log("Success! Entry added.");
@ -29,4 +70,4 @@ async function addItem(text) {
}
}
addItem("Yurts in Big Sur, California");
// addItem("Yurts in Big Sur, California");

43
joplin.js Normal file
View File

@ -0,0 +1,43 @@
import fetch from 'node-fetch'
import 'dotenv/config'
// This class is used to interact with the Joplin Data API. It provides a method for getting notes from a specified notebook, using the notebook's ID. The fields parameter specifies which fields to include in the response.
class Joplin {
constructor(joplinToken, joplinPort) {
this.token = joplinToken
this.port = joplinPort
this.getNotesFromNotebook.bind(this)
}
//This function gets notes from a specified notebook, using the notebook's ID. The fields parameter specifies which fields to include in the response.
// @param {string=} notebookID - The id of the notebook you want to get notes from, as extracted from the notebook's external link
// @param {Array[string]=} fields - The specific fields wanted in the returned response. Valid fields can be found in this table: https://joplinapp.org/api/references/rest_api/#properties
async getNotesFromNotebook(notebookID, fields) {
const fieldsString = fields.join()
let items = []
let pageNum = 1
let data = null
do {
let tempURL = "http://localhost:" + this.port + "/folders/" + notebookID + "/notes"
let foldersURL = new URL(tempURL)
foldersURL.searchParams.append("token", this.token)
foldersURL.searchParams.append("fields", fieldsString)
foldersURL.searchParams.append("page", pageNum)
const res = await fetch(foldersURL.href)
data = await res.json()
items = items.concat(data.items)
pageNum++
}
while (data.has_more)
return items
}
}
export default Joplin

163
package-lock.json generated
View File

@ -6,7 +6,8 @@
"": {
"dependencies": {
"@notionhq/client": "^2.1.1",
"dotenv": "^16.0.1"
"dotenv": "^16.0.1",
"node-fetch": "^3.2.10"
}
},
"node_modules/@notionhq/client": {
@ -21,6 +22,25 @@
"node": ">=12"
}
},
"node_modules/@notionhq/client/node_modules/node-fetch": {
"version": "2.6.7",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
"integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
"dependencies": {
"whatwg-url": "^5.0.0"
},
"engines": {
"node": "4.x || >=6.0.0"
},
"peerDependencies": {
"encoding": "^0.1.0"
},
"peerDependenciesMeta": {
"encoding": {
"optional": true
}
}
},
"node_modules/@types/node": {
"version": "18.6.2",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.2.tgz",
@ -51,6 +71,14 @@
"node": ">= 0.8"
}
},
"node_modules/data-uri-to-buffer": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz",
"integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==",
"engines": {
"node": ">= 12"
}
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@ -67,6 +95,28 @@
"node": ">=12"
}
},
"node_modules/fetch-blob": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
"integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/jimmywarting"
},
{
"type": "paypal",
"url": "https://paypal.me/jimmywarting"
}
],
"dependencies": {
"node-domexception": "^1.0.0",
"web-streams-polyfill": "^3.0.3"
},
"engines": {
"node": "^12.20 || >= 14.13"
}
},
"node_modules/form-data": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
@ -80,6 +130,17 @@
"node": ">= 6"
}
},
"node_modules/formdata-polyfill": {
"version": "4.0.10",
"resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
"integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
"dependencies": {
"fetch-blob": "^3.1.2"
},
"engines": {
"node": ">=12.20.0"
}
},
"node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
@ -99,23 +160,39 @@
"node": ">= 0.6"
}
},
"node_modules/node-domexception": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
"integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/jimmywarting"
},
{
"type": "github",
"url": "https://paypal.me/jimmywarting"
}
],
"engines": {
"node": ">=10.5.0"
}
},
"node_modules/node-fetch": {
"version": "2.6.7",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
"integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
"version": "3.2.10",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.10.tgz",
"integrity": "sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==",
"dependencies": {
"whatwg-url": "^5.0.0"
"data-uri-to-buffer": "^4.0.0",
"fetch-blob": "^3.1.4",
"formdata-polyfill": "^4.0.10"
},
"engines": {
"node": "4.x || >=6.0.0"
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"peerDependencies": {
"encoding": "^0.1.0"
},
"peerDependenciesMeta": {
"encoding": {
"optional": true
}
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/node-fetch"
}
},
"node_modules/tr46": {
@ -123,6 +200,14 @@
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
},
"node_modules/web-streams-polyfill": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz",
"integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==",
"engines": {
"node": ">= 8"
}
},
"node_modules/webidl-conversions": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
@ -146,6 +231,16 @@
"requires": {
"@types/node-fetch": "^2.5.10",
"node-fetch": "^2.6.1"
},
"dependencies": {
"node-fetch": {
"version": "2.6.7",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
"integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
"requires": {
"whatwg-url": "^5.0.0"
}
}
}
},
"@types/node": {
@ -175,6 +270,11 @@
"delayed-stream": "~1.0.0"
}
},
"data-uri-to-buffer": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz",
"integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA=="
},
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@ -185,6 +285,15 @@
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz",
"integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ=="
},
"fetch-blob": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
"integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
"requires": {
"node-domexception": "^1.0.0",
"web-streams-polyfill": "^3.0.3"
}
},
"form-data": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
@ -195,6 +304,14 @@
"mime-types": "^2.1.12"
}
},
"formdata-polyfill": {
"version": "4.0.10",
"resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
"integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
"requires": {
"fetch-blob": "^3.1.2"
}
},
"mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
@ -208,12 +325,19 @@
"mime-db": "1.52.0"
}
},
"node-domexception": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
"integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="
},
"node-fetch": {
"version": "2.6.7",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
"integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
"version": "3.2.10",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.10.tgz",
"integrity": "sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==",
"requires": {
"whatwg-url": "^5.0.0"
"data-uri-to-buffer": "^4.0.0",
"fetch-blob": "^3.1.4",
"formdata-polyfill": "^4.0.10"
}
},
"tr46": {
@ -221,6 +345,11 @@
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
},
"web-streams-polyfill": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz",
"integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q=="
},
"webidl-conversions": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",

View File

@ -1,6 +1,8 @@
{
"type": "module",
"dependencies": {
"@notionhq/client": "^2.1.1",
"dotenv": "^16.0.1"
"dotenv": "^16.0.1",
"node-fetch": "^3.2.10"
}
}