@tk_wfl/o2n-core 0.1.2

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 (53) hide show
  1. package/dist/converter.d.ts +48 -0
  2. package/dist/converter.d.ts.map +1 -0
  3. package/dist/converter.js +264 -0
  4. package/dist/converter.js.map +1 -0
  5. package/dist/credentials.d.ts +13 -0
  6. package/dist/credentials.d.ts.map +1 -0
  7. package/dist/credentials.js +33 -0
  8. package/dist/credentials.js.map +1 -0
  9. package/dist/index.d.ts +13 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +13 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/migrator.d.ts +16 -0
  14. package/dist/migrator.d.ts.map +1 -0
  15. package/dist/migrator.js +402 -0
  16. package/dist/migrator.js.map +1 -0
  17. package/dist/notion-blocks.d.ts +23 -0
  18. package/dist/notion-blocks.d.ts.map +1 -0
  19. package/dist/notion-blocks.js +91 -0
  20. package/dist/notion-blocks.js.map +1 -0
  21. package/dist/notion-client.d.ts +161 -0
  22. package/dist/notion-client.d.ts.map +1 -0
  23. package/dist/notion-client.js +187 -0
  24. package/dist/notion-client.js.map +1 -0
  25. package/dist/notion-db.d.ts +15 -0
  26. package/dist/notion-db.d.ts.map +1 -0
  27. package/dist/notion-db.js +88 -0
  28. package/dist/notion-db.js.map +1 -0
  29. package/dist/planner.d.ts +16 -0
  30. package/dist/planner.d.ts.map +1 -0
  31. package/dist/planner.js +60 -0
  32. package/dist/planner.js.map +1 -0
  33. package/dist/property-mapping.d.ts +17 -0
  34. package/dist/property-mapping.d.ts.map +1 -0
  35. package/dist/property-mapping.js +68 -0
  36. package/dist/property-mapping.js.map +1 -0
  37. package/dist/report.d.ts +6 -0
  38. package/dist/report.d.ts.map +1 -0
  39. package/dist/report.js +51 -0
  40. package/dist/report.js.map +1 -0
  41. package/dist/scanner.d.ts +14 -0
  42. package/dist/scanner.d.ts.map +1 -0
  43. package/dist/scanner.js +202 -0
  44. package/dist/scanner.js.map +1 -0
  45. package/dist/state.d.ts +39 -0
  46. package/dist/state.d.ts.map +1 -0
  47. package/dist/state.js +99 -0
  48. package/dist/state.js.map +1 -0
  49. package/dist/types.d.ts +126 -0
  50. package/dist/types.d.ts.map +1 -0
  51. package/dist/types.js +3 -0
  52. package/dist/types.js.map +1 -0
  53. package/package.json +48 -0
@@ -0,0 +1,402 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { buildNameIndex, resolveByFilename } from './scanner.js';
4
+ import { convertNote, ESCAPE_SENTINEL, ESCAPE_TARGET } from './converter.js';
5
+ import { NotionApiError } from './notion-client.js';
6
+ import { contentHash, isNoteUpToDate } from './state.js';
7
+ import { createDatabaseForFolder, buildRowProperties } from './notion-db.js';
8
+ import { buildTitleProperty, buildFrontmatterMetaCallout, splitMarkdownForPayload, shouldUseAsyncWrite, buildAttachmentBlock, } from './notion-blocks.js';
9
+ function folderOf(notePath) {
10
+ const dir = path.posix.dirname(notePath);
11
+ return dir === '.' ? '' : dir;
12
+ }
13
+ function basenameNoExt(p) {
14
+ return path.posix.basename(p).replace(/\.md$/, '');
15
+ }
16
+ function folderDepth(folderPath) {
17
+ return folderPath === '' ? 0 : folderPath.split('/').length;
18
+ }
19
+ function buildResolvers(inventory, sourcePath) {
20
+ const noteIndex = buildNameIndex(inventory.notes.map((n) => n.path));
21
+ const fileIndex = buildNameIndex(
22
+ // 添付は vault 内の非.mdファイル全体から解決(wikiLinks抽出時と同じロジック)
23
+ inventory.attachments
24
+ .map((a) => a.targetPath)
25
+ .filter((p) => p !== null));
26
+ return {
27
+ sourcePath,
28
+ resolveNoteLink: (target) => resolveByFilename(target, sourcePath, noteIndex).resolved,
29
+ resolveAttachment: (target) => resolveByFilename(target, sourcePath, fileIndex).resolved,
30
+ };
31
+ }
32
+ /**
33
+ * フォルダ=親ページ(page_tree) or DB(database) のコンテナを、親→子の順で作成する。
34
+ */
35
+ async function createFolderContainers(opts, report) {
36
+ const { plan, state, api, dryRun } = opts;
37
+ const containers = new Map();
38
+ containers.set('', { kind: 'page', id: plan.parentPageId });
39
+ const folders = [...plan.folders].filter((f) => f.folderPath !== '').sort((a, b) => folderDepth(a.folderPath) - folderDepth(b.folderPath));
40
+ for (const folder of folders) {
41
+ const existing = state.getFolder(folder.folderPath);
42
+ if (existing?.status === 'created') {
43
+ containers.set(folder.folderPath, {
44
+ kind: existing.kind,
45
+ id: existing.notionId,
46
+ dataSourceId: existing.dataSourceId,
47
+ });
48
+ continue;
49
+ }
50
+ const parentFolderPath = folderOf(folder.folderPath);
51
+ let parentContainer = containers.get(parentFolderPath);
52
+ if (!parentContainer) {
53
+ parentContainer = { kind: 'page', id: plan.parentPageId };
54
+ }
55
+ if (parentContainer.kind === 'database') {
56
+ report.push({
57
+ category: 'warning',
58
+ path: folder.folderPath,
59
+ message: `親フォルダ "${parentFolderPath}" がdatabaseモードのため、サブフォルダはルート直下に作成しました`,
60
+ });
61
+ parentContainer = { kind: 'page', id: plan.parentPageId };
62
+ }
63
+ const title = path.posix.basename(folder.folderPath);
64
+ try {
65
+ if (folder.mode === 'database') {
66
+ if (dryRun) {
67
+ const c = { kind: 'database', id: `dry-run-db-${folder.folderPath}`, dataSourceId: `dry-run-ds-${folder.folderPath}` };
68
+ containers.set(folder.folderPath, c);
69
+ api.callCount; // dry-runでもカウンタは進む(呼び出しはされない)
70
+ await createDatabaseForFolder(api, parentContainer.id, title, plan.frontmatterMappings[folder.folderPath] ?? []);
71
+ await state.setFolder(folder.folderPath, { status: 'created', kind: 'database', notionId: c.id, dataSourceId: c.dataSourceId });
72
+ continue;
73
+ }
74
+ const { databaseId, dataSourceId } = await createDatabaseForFolder(api, parentContainer.id, title, plan.frontmatterMappings[folder.folderPath] ?? []);
75
+ containers.set(folder.folderPath, { kind: 'database', id: databaseId, dataSourceId });
76
+ await state.setFolder(folder.folderPath, { status: 'created', kind: 'database', notionId: databaseId, dataSourceId });
77
+ }
78
+ else {
79
+ if (dryRun) {
80
+ const id = `dry-run-page-${folder.folderPath}`;
81
+ containers.set(folder.folderPath, { kind: 'page', id });
82
+ await api.createPageMarkdown({ parent: { page_id: parentContainer.id }, properties: { title: buildTitleProperty(title) } });
83
+ await state.setFolder(folder.folderPath, { status: 'created', kind: 'page', notionId: id });
84
+ continue;
85
+ }
86
+ const page = await api.createPageMarkdown({
87
+ parent: { page_id: parentContainer.id },
88
+ properties: { title: buildTitleProperty(title) },
89
+ });
90
+ containers.set(folder.folderPath, { kind: 'page', id: page.id });
91
+ await state.setFolder(folder.folderPath, { status: 'created', kind: 'page', notionId: page.id });
92
+ }
93
+ }
94
+ catch (err) {
95
+ await state.setFolder(folder.folderPath, {
96
+ status: 'failed',
97
+ kind: folder.mode === 'database' ? 'database' : 'page',
98
+ notionId: '',
99
+ error: String(err),
100
+ });
101
+ report.push({ category: 'warning', path: folder.folderPath, message: `フォルダコンテナ作成に失敗: ${String(err)}` });
102
+ }
103
+ }
104
+ return containers;
105
+ }
106
+ async function runPass1(opts, containers, report) {
107
+ const { plan, inventory, state, api, dryRun, vaultPath, onProgress } = opts;
108
+ const skipSet = new Set(plan.skipList);
109
+ const total = inventory.notes.length;
110
+ let done = 0;
111
+ for (const note of inventory.notes) {
112
+ if (skipSet.has(note.path)) {
113
+ await state.setNote(note.path, { status: 'skipped' });
114
+ done += 1;
115
+ onProgress?.(done, total, note.path);
116
+ continue;
117
+ }
118
+ const hash = contentHash(note.content);
119
+ const existing = state.getNote(note.path);
120
+ if (isNoteUpToDate(existing, hash) && existing) {
121
+ done += 1;
122
+ onProgress?.(done, total, note.path);
123
+ continue;
124
+ }
125
+ const folder = folderOf(note.path);
126
+ const container = containers.get(folder) ?? { kind: 'page', id: plan.parentPageId };
127
+ const ctx = buildResolvers(inventory, note.path);
128
+ const converted = convertNote(note.content, ctx);
129
+ report.push(...converted.entries);
130
+ const title = note.frontmatter.title || basenameNoExt(note.path);
131
+ let markdown;
132
+ let properties;
133
+ let parent;
134
+ if (container.kind === 'database' && container.dataSourceId) {
135
+ markdown = converted.markdown;
136
+ properties = buildRowProperties(note.frontmatter, plan.frontmatterMappings[folder] ?? [], title);
137
+ parent = { type: 'data_source_id', data_source_id: container.dataSourceId };
138
+ }
139
+ else {
140
+ markdown = buildFrontmatterMetaCallout(note.frontmatter) + converted.markdown;
141
+ properties = { title: buildTitleProperty(title) };
142
+ parent = { page_id: container.id };
143
+ }
144
+ const chunks = splitMarkdownForPayload(markdown);
145
+ try {
146
+ if (dryRun) {
147
+ await api.createPageMarkdown({ parent, markdown: chunks[0], properties });
148
+ for (const chunk of chunks.slice(1)) {
149
+ await api.updatePageMarkdown('dry-run', {
150
+ type: 'insert_content',
151
+ insert_content: { content: chunk, position: { type: 'end' } },
152
+ });
153
+ }
154
+ await state.setNote(note.path, {
155
+ status: 'created',
156
+ pageId: `dry-run-${note.path}`,
157
+ pageUrl: `https://www.notion.so/dry-run-${encodeURIComponent(note.path)}`,
158
+ contentHash: hash,
159
+ });
160
+ done += 1;
161
+ onProgress?.(done, total, note.path);
162
+ continue;
163
+ }
164
+ const page = await api.createPageMarkdown({ parent, markdown: chunks[0], properties });
165
+ for (const chunk of chunks.slice(1)) {
166
+ await api.updatePageMarkdown(page.id, { type: 'insert_content', insert_content: { content: chunk, position: { type: 'end' } } }, shouldUseAsyncWrite(chunk));
167
+ }
168
+ await state.setNote(note.path, { status: 'created', pageId: page.id, pageUrl: page.url, contentHash: hash });
169
+ }
170
+ catch (err) {
171
+ await state.setNote(note.path, { status: 'failed', contentHash: hash, error: String(err) });
172
+ report.push({ category: 'warning', path: note.path, message: `ページ作成に失敗: ${String(err)}` });
173
+ }
174
+ done += 1;
175
+ onProgress?.(done, total, note.path);
176
+ }
177
+ void vaultPath;
178
+ }
179
+ async function runPass2(opts, report) {
180
+ const { inventory, state, api, dryRun } = opts;
181
+ for (const note of inventory.notes) {
182
+ const noteState = state.getNote(note.path);
183
+ if (!noteState || noteState.status !== 'created' || !noteState.pageId)
184
+ continue;
185
+ const ctx = buildResolvers(inventory, note.path);
186
+ const reconverted = convertNote(note.content, ctx);
187
+ const updates = [];
188
+ for (const link of reconverted.pendingLinks) {
189
+ const targetState = link.targetPath ? state.getNote(link.targetPath) : undefined;
190
+ let newStr;
191
+ if (targetState?.pageUrl && (targetState.status === 'created' || targetState.status === 'linked' || targetState.status === 'attached' || targetState.status === 'done')) {
192
+ newStr = `[${link.displayText}](${targetState.pageUrl})`;
193
+ }
194
+ else {
195
+ newStr = link.fallbackText;
196
+ report.push({ category: 'unresolved_link', path: note.path, message: `リンク "${link.fallbackText}" は解決できず元表記に戻しました` });
197
+ }
198
+ updates.push({ old_str: link.placeholder, new_str: newStr, replace_all_matches: true });
199
+ }
200
+ if (reconverted.needsEscapeRestore) {
201
+ updates.push({ old_str: ESCAPE_SENTINEL, new_str: ESCAPE_TARGET, replace_all_matches: true });
202
+ }
203
+ try {
204
+ if (updates.length > 0) {
205
+ await api.updatePageMarkdown(noteState.pageId, { type: 'update_content', update_content: { content_updates: updates } });
206
+ }
207
+ await state.setNote(note.path, { ...noteState, status: 'linked' });
208
+ }
209
+ catch (err) {
210
+ // ページ自体は作成済みのため status は 'created' のまま保つ('failed' にすると
211
+ // resumeでPass1が再度ページを作成してしまい重複が発生する)。次回resume時に
212
+ // Pass2が改めてこのノートを処理する。
213
+ await state.setNote(note.path, { ...noteState, status: 'created', error: String(err) });
214
+ report.push({ category: 'warning', path: note.path, message: `リンク解決に失敗: ${String(err)}` });
215
+ }
216
+ void dryRun;
217
+ }
218
+ }
219
+ const SINGLE_PART_LIMIT = 20 * 1024 * 1024;
220
+ const MIME_TYPES = {
221
+ png: 'image/png',
222
+ jpg: 'image/jpeg',
223
+ jpeg: 'image/jpeg',
224
+ gif: 'image/gif',
225
+ svg: 'image/svg+xml',
226
+ webp: 'image/webp',
227
+ bmp: 'image/bmp',
228
+ pdf: 'application/pdf',
229
+ mp3: 'audio/mpeg',
230
+ wav: 'audio/wav',
231
+ m4a: 'audio/mp4',
232
+ ogg: 'audio/ogg',
233
+ flac: 'audio/flac',
234
+ mp4: 'video/mp4',
235
+ mov: 'video/quicktime',
236
+ webm: 'video/webm',
237
+ mkv: 'video/x-matroska',
238
+ };
239
+ function mimeTypeFor(filename) {
240
+ const ext = filename.split('.').pop()?.toLowerCase() ?? '';
241
+ return MIME_TYPES[ext] ?? 'application/octet-stream';
242
+ }
243
+ /**
244
+ * §16検証済み(2026-07-19): createFileUpload時にcontent_typeを指定しないと、
245
+ * send時にNotionが「作成時に決定された元のcontent typeと一致しない」として400を返す。
246
+ * 作成時とBlobのtypeの両方で同じMIMEタイプを明示する必要がある。
247
+ * さらに、作成直後(数百ms以内)にsendすると同じ400エラーが発生するケースが実ワークスペースで
248
+ * 確認された(file_uploadレコードの反映にタイムラグがあると見られる)。sendを1回リトライする
249
+ * ことで回避する。
250
+ */
251
+ function sleep(ms) {
252
+ return new Promise((resolve) => setTimeout(resolve, ms));
253
+ }
254
+ async function sendWithRetry(api, uploadId, buildForm) {
255
+ try {
256
+ await api.sendFileUpload(uploadId, buildForm());
257
+ }
258
+ catch (err) {
259
+ if (err instanceof NotionApiError && err.status === 400 && /content type/i.test(err.message)) {
260
+ await sleep(1000);
261
+ await api.sendFileUpload(uploadId, buildForm());
262
+ return;
263
+ }
264
+ throw err;
265
+ }
266
+ }
267
+ async function uploadFile(api, absPath, size, dryRun) {
268
+ const filename = path.basename(absPath);
269
+ if (dryRun)
270
+ return `dry-run-upload-${filename}`;
271
+ const contentType = mimeTypeFor(filename);
272
+ if (size <= SINGLE_PART_LIMIT) {
273
+ const created = await api.createFileUpload({ filename, content_type: contentType, mode: 'single_part' });
274
+ const buf = await fs.readFile(absPath);
275
+ await sendWithRetry(api, created.id, () => {
276
+ const form = new FormData();
277
+ form.append('file', new Blob([buf], { type: contentType }), filename);
278
+ return form;
279
+ });
280
+ return created.id;
281
+ }
282
+ // マルチパート: §4.1 マルチパートアップロード。実ワークスペースでの完了フローは docs/questions.md 参照
283
+ const numberOfParts = Math.ceil(size / SINGLE_PART_LIMIT);
284
+ const created = await api.createFileUpload({ filename, content_type: contentType, mode: 'multi_part', number_of_parts: numberOfParts });
285
+ const fh = await fs.open(absPath, 'r');
286
+ try {
287
+ for (let i = 0; i < numberOfParts; i += 1) {
288
+ const partSize = Math.min(SINGLE_PART_LIMIT, size - i * SINGLE_PART_LIMIT);
289
+ const buf = Buffer.alloc(partSize);
290
+ await fh.read(buf, 0, partSize, i * SINGLE_PART_LIMIT);
291
+ await sendWithRetry(api, created.id, () => {
292
+ const form = new FormData();
293
+ form.append('file', new Blob([buf], { type: contentType }), filename);
294
+ form.append('part_number', String(i + 1));
295
+ return form;
296
+ });
297
+ }
298
+ }
299
+ finally {
300
+ await fh.close();
301
+ }
302
+ return created.id;
303
+ }
304
+ async function runPass3(opts, report) {
305
+ const { inventory, state, api, dryRun, vaultPath } = opts;
306
+ let wsLimit = Infinity;
307
+ if (!dryRun) {
308
+ try {
309
+ const me = await api.getMe();
310
+ wsLimit = me.bot?.workspace_limits?.max_file_upload_size_in_bytes ?? Infinity;
311
+ }
312
+ catch {
313
+ wsLimit = Infinity;
314
+ }
315
+ }
316
+ for (const note of inventory.notes) {
317
+ const noteState = state.getNote(note.path);
318
+ // 'done'も対象に含めるのは、resume時に前回失敗した添付だけを再試行できるようにするため
319
+ // (一度'done'になったノートをPass3が二度と見に行かないと、失敗した添付が永遠に直らない)
320
+ if (!noteState || !noteState.pageId || (noteState.status !== 'linked' && noteState.status !== 'done'))
321
+ continue;
322
+ const ctx = buildResolvers(inventory, note.path);
323
+ const reconverted = convertNote(note.content, ctx);
324
+ if (reconverted.pendingFiles.length === 0) {
325
+ await state.setNote(note.path, { ...noteState, status: 'done' });
326
+ continue;
327
+ }
328
+ for (const file of reconverted.pendingFiles) {
329
+ if (!file.targetPath)
330
+ continue; // 未解決添付はPass1で警告済み
331
+ const existingFile = state.getFile(file.targetPath);
332
+ if (existingFile?.status === 'attached' || existingFile?.status === 'skipped')
333
+ continue; // resumeで既に完了済み
334
+ let fileUploadId = existingFile?.fileUploadId;
335
+ if (!fileUploadId || existingFile?.status === 'failed') {
336
+ const absPath = path.join(vaultPath, file.targetPath);
337
+ try {
338
+ const stat = dryRun ? { size: 0 } : await fs.stat(absPath);
339
+ if (stat.size > wsLimit) {
340
+ await state.setFile(file.targetPath, { status: 'skipped', error: 'ワークスペースのファイルサイズ上限超過' });
341
+ report.push({ category: 'oversized_file', path: file.targetPath, message: 'ワークスペースのファイルサイズ上限を超過したためスキップしました' });
342
+ continue;
343
+ }
344
+ fileUploadId = await uploadFile(api, absPath, stat.size, dryRun);
345
+ await state.setFile(file.targetPath, { status: 'uploaded', fileUploadId });
346
+ }
347
+ catch (err) {
348
+ await state.setFile(file.targetPath, { status: 'failed', error: String(err) });
349
+ report.push({ category: 'warning', path: file.targetPath, message: `アップロードに失敗: ${String(err)}` });
350
+ continue;
351
+ }
352
+ }
353
+ if (dryRun) {
354
+ await state.setFile(file.targetPath, { status: 'attached', fileUploadId });
355
+ continue;
356
+ }
357
+ try {
358
+ const children = await api.getBlockChildren(noteState.pageId);
359
+ // §16検証済み(2026-07-19): 添付プレースホルダーは箇条書き中に書かれることが多く、
360
+ // Notionはそれを paragraph ではなく bulleted_list_item 等として保存する。
361
+ // ブロックタイプを限定せず、プレースホルダー文字列を含むブロックを探す。
362
+ const placeholderBlock = children.results.find((b) => JSON.stringify(b).includes(file.placeholder));
363
+ if (!placeholderBlock) {
364
+ report.push({ category: 'warning', path: note.path, message: `添付プレースホルダーが見つかりませんでした: ${file.placeholder}` });
365
+ continue;
366
+ }
367
+ const ext = file.targetPath.split('.').pop() ?? '';
368
+ await api.appendBlockChildren(noteState.pageId, [buildAttachmentBlock(fileUploadId, ext)], placeholderBlock.id);
369
+ await api.deleteBlock(placeholderBlock.id);
370
+ await state.setFile(file.targetPath, { status: 'attached', fileUploadId });
371
+ }
372
+ catch (err) {
373
+ report.push({ category: 'warning', path: note.path, message: `添付ブロック挿入に失敗: ${String(err)}` });
374
+ }
375
+ }
376
+ await state.setNote(note.path, { ...state.getNote(note.path), status: 'done' });
377
+ }
378
+ }
379
+ export async function runMigration(opts) {
380
+ const report = [];
381
+ for (const skipped of opts.inventory.skipped) {
382
+ report.push({ category: 'skipped', path: skipped.path, message: skipped.reason });
383
+ }
384
+ for (const warning of opts.inventory.warnings) {
385
+ report.push({
386
+ category: 'warning',
387
+ path: warning.sourcePath,
388
+ message: warning.reason === 'ambiguous'
389
+ ? `リンク "${warning.linkText}" は複数候補があり曖昧です: ${warning.candidates?.join(', ')}`
390
+ : `リンク先 "${warning.linkText}" が見つかりませんでした`,
391
+ });
392
+ }
393
+ const containers = await createFolderContainers(opts, report);
394
+ await runPass1(opts, containers, report);
395
+ await runPass2(opts, report);
396
+ await runPass3(opts, report);
397
+ return report;
398
+ }
399
+ export function noteRecordByPath(notes, p) {
400
+ return notes.find((n) => n.path === p);
401
+ }
402
+ //# sourceMappingURL=migrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrator.js","sourceRoot":"","sources":["../src/migrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export declare function buildTitleProperty(text: string): {
2
+ title: Array<{
3
+ text: {
4
+ content: string;
5
+ };
6
+ }>;
7
+ };
8
+ /**
9
+ * §7.1 page_treeモード: frontmatterをページ本文冒頭のcalloutとして保持する
10
+ */
11
+ export declare function buildFrontmatterMetaCallout(frontmatter: Record<string, unknown>): string;
12
+ /**
13
+ * §4.2 のペイロード制限(1000ブロック・500KB)に対応するため、markdownを
14
+ * 段落境界(空行)で分割する。1個目はPOST /v1/pages用、以降はPATCH .../markdown
15
+ * の insert_content(position: end) で追記する。
16
+ */
17
+ export declare function splitMarkdownForPayload(markdown: string): string[];
18
+ export declare function shouldUseAsyncWrite(markdown: string): boolean;
19
+ export type AttachmentBlockType = 'image' | 'pdf' | 'audio' | 'video' | 'file';
20
+ export declare function attachmentBlockType(extension: string): AttachmentBlockType;
21
+ export declare function buildAttachmentBlock(fileUploadId: string, extension: string): Record<string, unknown>;
22
+ export declare function buildPlaceholderParagraphBlock(placeholder: string): Record<string, unknown>;
23
+ //# sourceMappingURL=notion-blocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notion-blocks.d.ts","sourceRoot":"","sources":["../src/notion-blocks.ts"],"names":[],"mappings":"AAGA,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC,CAAA;CAAE,CAEhG;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAWxF;AAMD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CA0BlE;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE7D;AAMD,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;AAE/E,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,mBAAmB,CAO1E;AAED,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUrG;AAED,wBAAgB,8BAA8B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAM3F"}
@@ -0,0 +1,91 @@
1
+ const MAX_PAYLOAD_BYTES = 450_000; // §4.2の500KB上限にマージンを取る
2
+ const MAX_BLOCKS_PER_CHUNK = 900; // 1000ブロック上限にマージン
3
+ export function buildTitleProperty(text) {
4
+ return { title: [{ text: { content: text } }] };
5
+ }
6
+ /**
7
+ * §7.1 page_treeモード: frontmatterをページ本文冒頭のcalloutとして保持する
8
+ */
9
+ export function buildFrontmatterMetaCallout(frontmatter) {
10
+ const keys = Object.keys(frontmatter);
11
+ if (keys.length === 0)
12
+ return '';
13
+ const lines = keys.map((k) => {
14
+ const v = frontmatter[k];
15
+ const rendered = Array.isArray(v) ? v.join(', ') : typeof v === 'object' && v !== null ? JSON.stringify(v) : String(v);
16
+ return `${k}: ${rendered}`;
17
+ });
18
+ // §16検証済み(2026-07-19): callout内の複数行は\nではなく<br>で区切る必要がある。
19
+ // \nのままだと</callout>が意図しない位置に挿入され、calloutが途中で閉じてしまう。
20
+ return `<callout icon="ℹ️" color="gray_bg">${lines.join('<br>')}</callout>\n\n`;
21
+ }
22
+ function byteLength(s) {
23
+ return Buffer.byteLength(s, 'utf-8');
24
+ }
25
+ /**
26
+ * §4.2 のペイロード制限(1000ブロック・500KB)に対応するため、markdownを
27
+ * 段落境界(空行)で分割する。1個目はPOST /v1/pages用、以降はPATCH .../markdown
28
+ * の insert_content(position: end) で追記する。
29
+ */
30
+ export function splitMarkdownForPayload(markdown) {
31
+ if (byteLength(markdown) <= MAX_PAYLOAD_BYTES)
32
+ return [markdown];
33
+ const paragraphs = markdown.split(/\n\n/);
34
+ const chunks = [];
35
+ let current = [];
36
+ let currentBytes = 0;
37
+ let currentBlocks = 0;
38
+ for (const para of paragraphs) {
39
+ const paraBytes = byteLength(para) + 2;
40
+ if (current.length > 0 &&
41
+ (currentBytes + paraBytes > MAX_PAYLOAD_BYTES || currentBlocks + 1 > MAX_BLOCKS_PER_CHUNK)) {
42
+ chunks.push(current.join('\n\n'));
43
+ current = [];
44
+ currentBytes = 0;
45
+ currentBlocks = 0;
46
+ }
47
+ current.push(para);
48
+ currentBytes += paraBytes;
49
+ currentBlocks += 1;
50
+ }
51
+ if (current.length > 0)
52
+ chunks.push(current.join('\n\n'));
53
+ return chunks;
54
+ }
55
+ export function shouldUseAsyncWrite(markdown) {
56
+ return byteLength(markdown) > MAX_PAYLOAD_BYTES * 2;
57
+ }
58
+ const IMAGE_EXT = new Set(['png', 'jpg', 'jpeg', 'gif', 'svg', 'webp', 'bmp']);
59
+ const AUDIO_EXT = new Set(['mp3', 'wav', 'm4a', 'ogg', 'flac']);
60
+ const VIDEO_EXT = new Set(['mp4', 'mov', 'webm', 'mkv']);
61
+ export function attachmentBlockType(extension) {
62
+ const ext = extension.toLowerCase();
63
+ if (IMAGE_EXT.has(ext))
64
+ return 'image';
65
+ if (ext === 'pdf')
66
+ return 'pdf';
67
+ if (AUDIO_EXT.has(ext))
68
+ return 'audio';
69
+ if (VIDEO_EXT.has(ext))
70
+ return 'video';
71
+ return 'file';
72
+ }
73
+ export function buildAttachmentBlock(fileUploadId, extension) {
74
+ const type = attachmentBlockType(extension);
75
+ return {
76
+ object: 'block',
77
+ type,
78
+ [type]: {
79
+ type: 'file_upload',
80
+ file_upload: { id: fileUploadId },
81
+ },
82
+ };
83
+ }
84
+ export function buildPlaceholderParagraphBlock(placeholder) {
85
+ return {
86
+ object: 'block',
87
+ type: 'paragraph',
88
+ paragraph: { rich_text: [{ type: 'text', text: { content: placeholder } }] },
89
+ };
90
+ }
91
+ //# sourceMappingURL=notion-blocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notion-blocks.js","sourceRoot":"","sources":["../src/notion-blocks.ts"],"names":[],"mappings":"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"}