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.
Files changed (56) hide show
  1. package/README.ja.md +39 -13
  2. package/README.md +45 -18
  3. package/dist/exporter/api.d.ts +11 -1
  4. package/dist/exporter/api.js +35 -30
  5. package/dist/exporter/api.js.map +1 -1
  6. package/dist/exporter/bin.d.ts +2 -0
  7. package/dist/exporter/bin.js +4 -0
  8. package/dist/exporter/bin.js.map +1 -0
  9. package/dist/exporter/blocks.js +355 -320
  10. package/dist/exporter/blocks.js.map +1 -1
  11. package/dist/exporter/breadcrumbs.js +3 -3
  12. package/dist/exporter/breadcrumbs.js.map +1 -1
  13. package/dist/exporter/cli.d.ts +16 -0
  14. package/dist/exporter/cli.js +126 -0
  15. package/dist/exporter/cli.js.map +1 -0
  16. package/dist/exporter/database.js +82 -75
  17. package/dist/exporter/database.js.map +1 -1
  18. package/dist/exporter/dependencies.d.ts +38 -0
  19. package/dist/exporter/dependencies.js +102 -0
  20. package/dist/exporter/dependencies.js.map +1 -0
  21. package/dist/exporter/failures.d.ts +52 -0
  22. package/dist/exporter/failures.js +105 -0
  23. package/dist/exporter/failures.js.map +1 -0
  24. package/dist/exporter/files.d.ts +21 -0
  25. package/dist/exporter/files.js +164 -94
  26. package/dist/exporter/files.js.map +1 -1
  27. package/dist/exporter/github.d.ts +8 -0
  28. package/dist/exporter/github.js +22 -5
  29. package/dist/exporter/github.js.map +1 -1
  30. package/dist/exporter/index.d.ts +4 -0
  31. package/dist/exporter/index.js +2 -0
  32. package/dist/exporter/index.js.map +1 -1
  33. package/dist/exporter/log.d.ts +6 -0
  34. package/dist/exporter/log.js +15 -0
  35. package/dist/exporter/log.js.map +1 -0
  36. package/dist/exporter/mutex.js +55 -16
  37. package/dist/exporter/mutex.js.map +1 -1
  38. package/dist/exporter/page.js +51 -35
  39. package/dist/exporter/page.js.map +1 -1
  40. package/dist/exporter/prune.d.ts +27 -0
  41. package/dist/exporter/prune.js +95 -0
  42. package/dist/exporter/prune.js.map +1 -0
  43. package/dist/exporter/types.d.ts +13 -0
  44. package/dist/exporter/variables.d.ts +61 -17
  45. package/dist/exporter/variables.js +86 -23
  46. package/dist/exporter/variables.js.map +1 -1
  47. package/dist/ui/components/Gallery/GalleryCard/options.d.ts +11 -0
  48. package/dist/ui/esm/components/Gallery/GalleryCard/GalleryCard.js +2 -17
  49. package/dist/ui/esm/components/Gallery/GalleryCard/GalleryCard.js.map +1 -1
  50. package/dist/ui/esm/components/Gallery/GalleryCard/options.js +27 -0
  51. package/dist/ui/esm/components/Gallery/GalleryCard/options.js.map +1 -0
  52. package/dist/ui/esm/components/Page/CodeBlock/Code/Code.js +5 -0
  53. package/dist/ui/esm/components/Page/CodeBlock/Code/Code.js.map +1 -1
  54. package/dist/ui/index-without-dark.css +1 -1
  55. package/dist/ui/index.css +1 -1
  56. 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-bg.svg?raw=true">
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 18以上推奨
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-bg.svg?raw=true">
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=000000" alt="Github Actions" />
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=000000" alt="NPM" />
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 static site data via the Notion API.
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
- - Compatible with static site generators such as Next.js.
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 18 or later (recommended)
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)
@@ -1,5 +1,10 @@
1
1
  import { Client } from '@notionhq/client';
2
- export declare const notion: Client;
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>;
@@ -1,14 +1,22 @@
1
1
  import { Client } from '@notionhq/client';
2
- import { isNotionClientError, APIErrorCode, ClientErrorCode, LogLevel, } from '@notionhq/client';
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 { cacheDir, waitingTimeSec, waitTimeSecAfterLimit, auth, debug, } from './variables.js';
5
- export const notion = new Client({ auth, logLevel: debug ? LogLevel.DEBUG : LogLevel.ERROR });
6
- const retryableErrorCodes = [
7
- APIErrorCode.RateLimited,
8
- APIErrorCode.InternalServerError,
9
- ClientErrorCode.ResponseError,
10
- ClientErrorCode.RequestTimeout,
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 (waitingTimeSec > 0) {
36
- await new Promise(resolve => setTimeout(resolve, waitingTimeSec));
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) && retryableErrorCodes.includes(error.code);
49
+ const retryable = error && typeof error === 'object' && isNotionClientError(error) && transientNotionErrorCodes.includes(error.code);
41
50
  if (retryable && count > 1) {
42
- if (debug) {
43
- console.log(`reqAPIWithBackoff backoff(${count}) -- error: ${error}`);
44
- }
45
- if (waitTimeSecAfterLimit > 0) {
46
- await new Promise(resolve => setTimeout(resolve, waitTimeSecAfterLimit));
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
- const response = await fetch(url, fetchOptions);
87
- clearTimeout(timeoutId);
88
- return response;
94
+ return await fetch(url, { ...fetchOptions, signal: AbortSignal.timeout(timeout) });
89
95
  }
90
96
  catch (error) {
91
- clearTimeout(timeoutId);
92
- if (error instanceof Error && error.name === 'AbortError') {
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/exporter/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/exporter/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { run } from './cli.js';
3
+ process.exitCode = await run(process.argv.slice(2));
4
+ //# sourceMappingURL=bin.js.map
@@ -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"}