rotion 3.6.2 → 4.0.0
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/README.ja.md +39 -13
- package/README.md +45 -18
- package/dist/exporter/api.d.ts +11 -1
- package/dist/exporter/api.js +35 -30
- package/dist/exporter/api.js.map +1 -1
- package/dist/exporter/bin.d.ts +2 -0
- package/dist/exporter/bin.js +4 -0
- package/dist/exporter/bin.js.map +1 -0
- package/dist/exporter/blocks.js +355 -320
- package/dist/exporter/blocks.js.map +1 -1
- package/dist/exporter/breadcrumbs.js +3 -3
- package/dist/exporter/breadcrumbs.js.map +1 -1
- package/dist/exporter/cli.d.ts +16 -0
- package/dist/exporter/cli.js +126 -0
- package/dist/exporter/cli.js.map +1 -0
- package/dist/exporter/database.js +82 -75
- package/dist/exporter/database.js.map +1 -1
- package/dist/exporter/dependencies.d.ts +38 -0
- package/dist/exporter/dependencies.js +102 -0
- package/dist/exporter/dependencies.js.map +1 -0
- package/dist/exporter/failures.d.ts +52 -0
- package/dist/exporter/failures.js +105 -0
- package/dist/exporter/failures.js.map +1 -0
- package/dist/exporter/files.d.ts +21 -0
- package/dist/exporter/files.js +164 -94
- package/dist/exporter/files.js.map +1 -1
- package/dist/exporter/github.d.ts +8 -0
- package/dist/exporter/github.js +22 -5
- package/dist/exporter/github.js.map +1 -1
- package/dist/exporter/index.d.ts +4 -0
- package/dist/exporter/index.js +2 -0
- package/dist/exporter/index.js.map +1 -1
- package/dist/exporter/log.d.ts +6 -0
- package/dist/exporter/log.js +15 -0
- package/dist/exporter/log.js.map +1 -0
- package/dist/exporter/mutex.js +55 -16
- package/dist/exporter/mutex.js.map +1 -1
- package/dist/exporter/page.js +51 -35
- package/dist/exporter/page.js.map +1 -1
- package/dist/exporter/prune.d.ts +27 -0
- package/dist/exporter/prune.js +95 -0
- package/dist/exporter/prune.js.map +1 -0
- package/dist/exporter/types.d.ts +13 -0
- package/dist/exporter/variables.d.ts +61 -17
- package/dist/exporter/variables.js +86 -23
- package/dist/exporter/variables.js.map +1 -1
- package/dist/ui/components/Gallery/GalleryCard/options.d.ts +11 -0
- package/dist/ui/esm/components/Gallery/GalleryCard/GalleryCard.js +2 -17
- package/dist/ui/esm/components/Gallery/GalleryCard/GalleryCard.js.map +1 -1
- package/dist/ui/esm/components/Gallery/GalleryCard/options.js +27 -0
- package/dist/ui/esm/components/Gallery/GalleryCard/options.js.map +1 -0
- package/dist/ui/esm/components/Page/CodeBlock/Code/Code.js +5 -0
- package/dist/ui/esm/components/Page/CodeBlock/Code/Code.js.map +1 -1
- package/dist/ui/index-without-dark.css +1 -1
- package/dist/ui/index.css +1 -1
- package/package.json +30 -24
package/README.ja.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<p align="center">
|
|
4
4
|
<a href="https://rotion.linyo.ws">
|
|
5
5
|
<picture>
|
|
6
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://github.com/linyows/rotion/blob/main/misc/rotion-dark
|
|
6
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://github.com/linyows/rotion/blob/main/misc/rotion-dark.svg?raw=true">
|
|
7
7
|
<img alt="Rotion" src="https://github.com/linyows/rotion/blob/main/misc/rotion.svg?raw=true" width="300">
|
|
8
8
|
</picture>
|
|
9
9
|
</a>
|
|
@@ -18,19 +18,19 @@
|
|
|
18
18
|
</a>
|
|
19
19
|
</p>
|
|
20
20
|
|
|
21
|
-
**Rotion**は、Notion APIとReactを活用して、Notion
|
|
21
|
+
**Rotion**は、Notion APIとReactを活用して、Notionのデータベースやページからウェブサイトを作るためのコンポーネント&ツール群です。
|
|
22
22
|
Next.jsをはじめとしたReact系フレームワークでの利用を想定していますが、他のフレームワークでも動作します。
|
|
23
|
-
|
|
23
|
+
画像や必要なファイルはローカルに保存されるため、完全な静的サイトとして生成することも、Node.jsのサーバーで描画することもできます。
|
|
24
24
|
|
|
25
25
|
公式サイト: https://rotion.linyo.ws
|
|
26
26
|
|
|
27
27
|
主な特徴
|
|
28
28
|
--
|
|
29
29
|
|
|
30
|
-
- Notion API
|
|
30
|
+
- Notion APIからデータベース・ページを取得し、ビルド時またはリクエスト時にサイト用のデータとして変換
|
|
31
31
|
- 画像やPDFなどのファイルもローカル保存
|
|
32
32
|
- 豊富なReactコンポーネント(Gallery, Table, List, Page, 各種Blockなど)
|
|
33
|
-
- Next.js
|
|
33
|
+
- Next.jsなどで、静的サイト生成にもサーバーでの描画にも対応([サーバーでの描画](https://rotion.linyo.ws/ja/server-rendering))
|
|
34
34
|
- **Next.js App Router サポート** - `createClientLink` ヘルパー(v2.0.1以降)
|
|
35
35
|
- **Next.js Page Router サポート** - 従来のSSGワークフロー
|
|
36
36
|
- TypeScript対応
|
|
@@ -42,12 +42,6 @@ Next.jsをはじめとしたReact系フレームワークでの利用を想定
|
|
|
42
42
|
npm install rotion
|
|
43
43
|
```
|
|
44
44
|
|
|
45
|
-
または
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
yarn add rotion
|
|
49
|
-
```
|
|
50
|
-
|
|
51
45
|
使い方
|
|
52
46
|
--
|
|
53
47
|
|
|
@@ -78,6 +72,24 @@ const blocks = await FetchBlocks({ block_id: 'YOUR_PAGE_ID' })
|
|
|
78
72
|
const page = await FetchPage({ page_id: 'YOUR_PAGE_ID' })
|
|
79
73
|
```
|
|
80
74
|
|
|
75
|
+
#### インクリメンタルキャッシュ
|
|
76
|
+
|
|
77
|
+
取得したデータは `.cache` にキャッシュされます(`ROTION_CACHEDIR` で変更できます)。デフォルトでは、既存のキャッシュが常に使われます。`ROTION_INCREMENTAL_CACHE=true` を指定すると、変更されたデータだけを再取得します。データベースのクエリは `ROTION_CACHE_AVAILABLE_DURATION` ミリ秒(デフォルト:2分)を過ぎると再取得し、ページとブロックはページの `last_edited_time` が変わったときに再取得します。
|
|
78
|
+
|
|
79
|
+
このモードでは、`FetchBlocks` と `FetchPage` にページの `last_edited_time` を渡してください。渡さない場合は既存のキャッシュが常に返され、編集が反映されません。トグルやカラムなど、ネストしたブロックの中身を変更しても更新されるのはページの `last_edited_time` だけなので、ブロックではなくページの値を渡してください。
|
|
80
|
+
|
|
81
|
+
```ts
|
|
82
|
+
// データベースから取得したページには last_edited_time が含まれる
|
|
83
|
+
const db = await FetchDatabase({ database_id: 'YOUR_DATABASE_ID' })
|
|
84
|
+
for (const page of db.results) {
|
|
85
|
+
const blocks = await FetchBlocks({ block_id: page.id, last_edited_time: page.last_edited_time })
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// または先に最新のページ情報を取得する('force' は常にAPIへリクエストする)
|
|
89
|
+
const page = await FetchPage({ page_id: 'YOUR_PAGE_ID', last_edited_time: 'force' })
|
|
90
|
+
const blocks = await FetchBlocks({ block_id: 'YOUR_PAGE_ID', last_edited_time: page.last_edited_time })
|
|
91
|
+
```
|
|
92
|
+
|
|
81
93
|
### 3. Reactコンポーネントで表示
|
|
82
94
|
|
|
83
95
|
#### Next.js App Router (v15+)
|
|
@@ -228,6 +240,20 @@ npm install
|
|
|
228
240
|
npm run dev
|
|
229
241
|
```
|
|
230
242
|
|
|
243
|
+
### [nextjs-server](./examples/nextjs-server)
|
|
244
|
+
Node.jsのサーバーで描画するNext.js App Routerサンプル:
|
|
245
|
+
- リクエスト時に描画し、`revalidate` で再生成するページ
|
|
246
|
+
- ダウンロードした画像やファイルを、ルートハンドラーで `storage/` から配信
|
|
247
|
+
- インクリメンタルキャッシュにより、再ビルドなしでNotionの編集を反映
|
|
248
|
+
|
|
249
|
+
```bash
|
|
250
|
+
cd examples/nextjs-server
|
|
251
|
+
# .env.localにNOTION_TOKENとNOTION_DATABASE_IDを設定
|
|
252
|
+
npm install
|
|
253
|
+
npm run build
|
|
254
|
+
npm start
|
|
255
|
+
```
|
|
256
|
+
|
|
231
257
|
### [nextjs-pagerouter](./examples/nextjs-pagerouter)
|
|
232
258
|
データベース対応のNext.js Pages Routerサンプル:
|
|
233
259
|
- `getStaticProps` を使ったデータベーステーブルビュー
|
|
@@ -271,7 +297,7 @@ npm run dev
|
|
|
271
297
|
必要な環境
|
|
272
298
|
--
|
|
273
299
|
|
|
274
|
-
- Node.js
|
|
300
|
+
- Node.js 22.12以上
|
|
275
301
|
- React 17、18、または19
|
|
276
302
|
- Next.js 13以上(App Router機能を使う場合はNext.js 15以上推奨)
|
|
277
303
|
|
|
@@ -283,4 +309,4 @@ MIT
|
|
|
283
309
|
作者
|
|
284
310
|
--
|
|
285
311
|
|
|
286
|
-
[@linyows](https://github.com/linyows)
|
|
312
|
+
[@linyows](https://github.com/linyows)
|
package/README.md
CHANGED
|
@@ -2,34 +2,35 @@
|
|
|
2
2
|
|
|
3
3
|
<p align="center">
|
|
4
4
|
<a href="https://rotion.linyo.ws">
|
|
5
|
+
<br /><br /><br /><br /><br />
|
|
5
6
|
<picture>
|
|
6
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://github.com/linyows/rotion/blob/main/misc/rotion-dark
|
|
7
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://github.com/linyows/rotion/blob/main/misc/rotion-dark.svg?raw=true">
|
|
7
8
|
<img alt="Rotion" src="https://github.com/linyows/rotion/blob/main/misc/rotion.svg?raw=true" width="300">
|
|
8
9
|
</picture>
|
|
10
|
+
<br /><br /><br /><br /><br />
|
|
9
11
|
</a>
|
|
10
12
|
</p>
|
|
11
13
|
|
|
14
|
+
**Rotion** is a set of components and tools that utilize the Notion API and React to build a website from your Notion databases and pages.
|
|
15
|
+
It is designed primarily for use with Next.js (or other React frameworks) and stores images and other files locally, so that you can build a fully static site or render the pages on a Node.js server.
|
|
16
|
+
https://rotion.linyo.ws
|
|
17
|
+
|
|
12
18
|
<p align="center">
|
|
13
19
|
<a href="https://github.com/linyows/rotion/actions">
|
|
14
|
-
<img src="https://img.shields.io/github/actions/workflow/status/linyows/rotion/build.yml?branch=main&style=for-the-badge&labelColor=
|
|
20
|
+
<img alt="Github Workflow Status" src="https://img.shields.io/github/actions/workflow/status/linyows/rotion/build.yml?branch=main&style=for-the-badge&labelColor=666666" />
|
|
15
21
|
</a>
|
|
16
22
|
<a href="https://www.npmjs.com/package/rotion">
|
|
17
|
-
<img src="http://img.shields.io/npm/v/rotion.svg?style=for-the-badge&labelColor=
|
|
23
|
+
<img alrt="NPM" src="http://img.shields.io/npm/v/rotion.svg?style=for-the-badge&labelColor=666666&color=DDDDDD" />
|
|
18
24
|
</a>
|
|
19
25
|
</p>
|
|
20
26
|
|
|
21
|
-
**Rotion** is a set of components and tools that utilize the Notion API and React to generate a static website from your Notion databases and pages.
|
|
22
|
-
It is designed primarily for use with Next.js (or other React frameworks) and stores images and other files locally, so that you can build a fully static site.
|
|
23
|
-
|
|
24
|
-
Official site: https://rotion.linyo.ws
|
|
25
|
-
|
|
26
27
|
Features
|
|
27
28
|
--
|
|
28
29
|
|
|
29
|
-
- Fetch and convert Notion databases and pages into
|
|
30
|
+
- Fetch and convert Notion databases and pages into data for your site via the Notion API, at build time or on request.
|
|
30
31
|
- Local storage of images, PDFs, and other files.
|
|
31
32
|
- Rich React components (Gallery, Table, List, Page, and various Blocks).
|
|
32
|
-
-
|
|
33
|
+
- Works with static site generation and server rendering in frameworks such as Next.js ([Server rendering](https://rotion.linyo.ws/server-rendering)).
|
|
33
34
|
- **Next.js App Router support** with `createClientLink` helper (v2.0.1+).
|
|
34
35
|
- **Next.js Page Router support** for traditional SSG workflows.
|
|
35
36
|
- TypeScript support.
|
|
@@ -41,12 +42,6 @@ Installation
|
|
|
41
42
|
npm install rotion
|
|
42
43
|
```
|
|
43
44
|
|
|
44
|
-
or
|
|
45
|
-
|
|
46
|
-
```bash
|
|
47
|
-
yarn add rotion
|
|
48
|
-
```
|
|
49
|
-
|
|
50
45
|
Usage
|
|
51
46
|
--
|
|
52
47
|
|
|
@@ -77,6 +72,24 @@ const blocks = await FetchBlocks({ block_id: 'YOUR_PAGE_ID' })
|
|
|
77
72
|
const page = await FetchPage({ page_id: 'YOUR_PAGE_ID' })
|
|
78
73
|
```
|
|
79
74
|
|
|
75
|
+
#### Incremental Cache
|
|
76
|
+
|
|
77
|
+
Fetched data is cached in `.cache` (change it with `ROTION_CACHEDIR`). By default, an existing cache is always reused. With `ROTION_INCREMENTAL_CACHE=true`, only changed data is fetched again: database queries are refreshed after `ROTION_CACHE_AVAILABLE_DURATION` milliseconds (default: 2 minutes), and pages and blocks are refreshed when the page's `last_edited_time` changes.
|
|
78
|
+
|
|
79
|
+
In this mode, pass the page's `last_edited_time` to `FetchBlocks` and `FetchPage`. Without it, an existing cache is always returned and edits are not reflected. Changes inside nested blocks such as toggles and columns update only the page's `last_edited_time`, so use the page's value, not a block's.
|
|
80
|
+
|
|
81
|
+
```ts
|
|
82
|
+
// Pages from a database already have last_edited_time
|
|
83
|
+
const db = await FetchDatabase({ database_id: 'YOUR_DATABASE_ID' })
|
|
84
|
+
for (const page of db.results) {
|
|
85
|
+
const blocks = await FetchBlocks({ block_id: page.id, last_edited_time: page.last_edited_time })
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Or fetch the latest page first ('force' always requests the API)
|
|
89
|
+
const page = await FetchPage({ page_id: 'YOUR_PAGE_ID', last_edited_time: 'force' })
|
|
90
|
+
const blocks = await FetchBlocks({ block_id: 'YOUR_PAGE_ID', last_edited_time: page.last_edited_time })
|
|
91
|
+
```
|
|
92
|
+
|
|
80
93
|
### 3. Render with React Components
|
|
81
94
|
|
|
82
95
|
#### Next.js App Router (v15+)
|
|
@@ -227,6 +240,20 @@ npm install
|
|
|
227
240
|
npm run dev
|
|
228
241
|
```
|
|
229
242
|
|
|
243
|
+
### [nextjs-server](./examples/nextjs-server)
|
|
244
|
+
Next.js App Router example rendered on a Node.js server:
|
|
245
|
+
- Pages rendered on request and regenerated with `revalidate`
|
|
246
|
+
- Downloaded images and files served from `storage/` by route handlers
|
|
247
|
+
- Incremental cache, so edits in Notion appear without a rebuild
|
|
248
|
+
|
|
249
|
+
```bash
|
|
250
|
+
cd examples/nextjs-server
|
|
251
|
+
# Add your NOTION_TOKEN and NOTION_DATABASE_ID to .env.local
|
|
252
|
+
npm install
|
|
253
|
+
npm run build
|
|
254
|
+
npm start
|
|
255
|
+
```
|
|
256
|
+
|
|
230
257
|
### [nextjs-pagerouter](./examples/nextjs-pagerouter)
|
|
231
258
|
Next.js Pages Router example with database support:
|
|
232
259
|
- Database table view using `getStaticProps`
|
|
@@ -270,7 +297,7 @@ Scripts
|
|
|
270
297
|
Requirements
|
|
271
298
|
--
|
|
272
299
|
|
|
273
|
-
- Node.js
|
|
300
|
+
- Node.js 22.12 or later
|
|
274
301
|
- React 17, 18, or 19
|
|
275
302
|
- Next.js 13+ (for App Router features, Next.js 15+ recommended)
|
|
276
303
|
|
|
@@ -282,4 +309,4 @@ MIT
|
|
|
282
309
|
Author
|
|
283
310
|
--
|
|
284
311
|
|
|
285
|
-
[@linyows](https://github.com/linyows)
|
|
312
|
+
[@linyows](https://github.com/linyows)
|
package/dist/exporter/api.d.ts
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { Client } from '@notionhq/client';
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* notion returns the Notion client for the current settings. It is created on
|
|
4
|
+
* first use, not on import, so NOTION_TOKEN (or configure({ auth })) only has
|
|
5
|
+
* to be set before the first request, and a new token gets a new client.
|
|
6
|
+
*/
|
|
7
|
+
export declare function notion(): Client;
|
|
3
8
|
export interface reqAPIWithBackoffArgs {
|
|
4
9
|
func: Function;
|
|
5
10
|
args: unknown;
|
|
@@ -23,4 +28,9 @@ export declare function reqAPIWithBackoffAndCache<T>({ name, func, args, count }
|
|
|
23
28
|
export interface FetchOptions extends RequestInit {
|
|
24
29
|
timeout?: number;
|
|
25
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* fetchWithTimeout aborts the request when it takes longer than timeout
|
|
33
|
+
* milliseconds. The limit also covers reading the body, so a server that
|
|
34
|
+
* sends the headers and then stalls does not hold the caller forever.
|
|
35
|
+
*/
|
|
26
36
|
export declare function fetchWithTimeout(url: string | URL | Request, options?: FetchOptions): Promise<Response>;
|
package/dist/exporter/api.js
CHANGED
|
@@ -1,14 +1,22 @@
|
|
|
1
1
|
import { Client } from '@notionhq/client';
|
|
2
|
-
import { isNotionClientError,
|
|
2
|
+
import { isNotionClientError, LogLevel, } from '@notionhq/client';
|
|
3
|
+
import { transientNotionErrorCodes } from './failures.js';
|
|
4
|
+
import { warn } from './log.js';
|
|
3
5
|
import { atoh, readCache, writeCache, isAvailableCache, } from './files.js';
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
import { config } from './variables.js';
|
|
7
|
+
let client;
|
|
8
|
+
/**
|
|
9
|
+
* notion returns the Notion client for the current settings. It is created on
|
|
10
|
+
* first use, not on import, so NOTION_TOKEN (or configure({ auth })) only has
|
|
11
|
+
* to be set before the first request, and a new token gets a new client.
|
|
12
|
+
*/
|
|
13
|
+
export function notion() {
|
|
14
|
+
const { auth, debug } = config();
|
|
15
|
+
if (client === undefined || client.auth !== auth || client.debug !== debug) {
|
|
16
|
+
client = { auth, debug, instance: new Client({ auth, logLevel: debug ? LogLevel.DEBUG : LogLevel.ERROR }) };
|
|
17
|
+
}
|
|
18
|
+
return client.instance;
|
|
19
|
+
}
|
|
12
20
|
const truncate = (str, max = 1000) => {
|
|
13
21
|
return str.length > max ? `${str.slice(0, max)}...` : str;
|
|
14
22
|
};
|
|
@@ -29,21 +37,22 @@ export async function reqAPIWithBackoff({ func, args, count }) {
|
|
|
29
37
|
if (count < 1) {
|
|
30
38
|
throw new Error('backoff count exceeded');
|
|
31
39
|
}
|
|
40
|
+
const { waitTime, limitedWaitTime, debug } = config();
|
|
32
41
|
let res = null;
|
|
33
42
|
try {
|
|
34
43
|
res = await func(args);
|
|
35
|
-
if (
|
|
36
|
-
await new Promise(resolve => setTimeout(resolve,
|
|
44
|
+
if (waitTime > 0) {
|
|
45
|
+
await new Promise(resolve => setTimeout(resolve, waitTime));
|
|
37
46
|
}
|
|
38
47
|
}
|
|
39
48
|
catch (error) {
|
|
40
|
-
const retryable = error && typeof error === 'object' && isNotionClientError(error) &&
|
|
49
|
+
const retryable = error && typeof error === 'object' && isNotionClientError(error) && transientNotionErrorCodes.includes(error.code);
|
|
41
50
|
if (retryable && count > 1) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
if (
|
|
46
|
-
await new Promise(resolve => setTimeout(resolve,
|
|
51
|
+
// The wait is a minute by default; say why nothing seems to happen
|
|
52
|
+
const name = func.name === '' ? 'anonymous' : func.name;
|
|
53
|
+
warn(`notion api ${name} failed with ${error.code}; retrying in ${limitedWaitTime}ms (${count - 1} attempts left)`);
|
|
54
|
+
if (limitedWaitTime > 0) {
|
|
55
|
+
await new Promise(resolve => setTimeout(resolve, limitedWaitTime));
|
|
47
56
|
}
|
|
48
57
|
return await reqAPIWithBackoff({ func, args, count: count - 1 });
|
|
49
58
|
}
|
|
@@ -59,7 +68,7 @@ export async function reqAPIWithBackoff({ func, args, count }) {
|
|
|
59
68
|
}
|
|
60
69
|
export async function reqAPIWithBackoffAndCache({ name, func, args, count }) {
|
|
61
70
|
const key = atoh(JSON.stringify({ func: func.name, args }));
|
|
62
|
-
const cacheFile = `${cacheDir}/${name}-${key}`;
|
|
71
|
+
const cacheFile = `${config().cacheDir}/${name}-${key}`;
|
|
63
72
|
try {
|
|
64
73
|
const cache = await readCache(cacheFile);
|
|
65
74
|
if (await isAvailableCache(cacheFile)) {
|
|
@@ -73,24 +82,20 @@ export async function reqAPIWithBackoffAndCache({ name, func, args, count }) {
|
|
|
73
82
|
await writeCache(cacheFile, res);
|
|
74
83
|
return res;
|
|
75
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* fetchWithTimeout aborts the request when it takes longer than timeout
|
|
87
|
+
* milliseconds. The limit also covers reading the body, so a server that
|
|
88
|
+
* sends the headers and then stalls does not hold the caller forever.
|
|
89
|
+
*/
|
|
76
90
|
// TODO: replace http(s).get functions to this
|
|
77
91
|
export async function fetchWithTimeout(url, options = {}) {
|
|
78
92
|
const { timeout = 5000, ...fetchOptions } = options;
|
|
79
|
-
const controller = new AbortController();
|
|
80
|
-
const { signal } = controller;
|
|
81
|
-
const timeoutId = setTimeout(() => {
|
|
82
|
-
controller.abort();
|
|
83
|
-
}, timeout);
|
|
84
|
-
options.signal = signal;
|
|
85
93
|
try {
|
|
86
|
-
|
|
87
|
-
clearTimeout(timeoutId);
|
|
88
|
-
return response;
|
|
94
|
+
return await fetch(url, { ...fetchOptions, signal: AbortSignal.timeout(timeout) });
|
|
89
95
|
}
|
|
90
96
|
catch (error) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
throw new Error(`Request timed out after ${timeout}ms`);
|
|
97
|
+
if (error instanceof Error && (error.name === 'TimeoutError' || error.name === 'AbortError')) {
|
|
98
|
+
throw new Error(`Request timed out after ${timeout}ms`, { cause: error });
|
|
94
99
|
}
|
|
95
100
|
throw error;
|
|
96
101
|
}
|
package/dist/exporter/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/exporter/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EACL,mBAAmB,EACnB,
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/exporter/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../../src/exporter/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAE9B,OAAO,CAAC,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA"}
|