@texonom/cli 1.4.4 → 1.4.6

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/build/src/main.js CHANGED
@@ -1,19 +1,306 @@
1
- import{Cli as Z,Builtins as I}from"clipanion";var H="Notion CLI",z="1.4.4";import{Option as T,Command as le}from"clipanion";import{NotionAPI as C}from"@texonom/nclient";import{getBlockTitle as P,getCanonicalPageId as A,parsePageId as G,formatDate as K,getTextContent as O,getBlockParent as ee,defaultMapImageUrl as te,getAllInSpace as oe,getPageTitle as V,recursivePageTree as ae}from"@texonom/nutils";import{join as y}from"path";import{mkdir as q,readFile as j}from"fs/promises";import D from"JSONStream";import F from"graceful-fs";import{promisify as ie}from"util";import Y from"stream";import{format as se}from"prettier";import{isCollection as Q,isSpace as re}from"@texonom/ntypes";var X=ie(F.writeFile),J=($,t,e="https://texonom.com")=>`${e}/${A($,t)}`,U=class{constructor(t){this.promises=[];this.folder="texonom-raw";this.md="texonom-md";this.domain="https://texonom.com";this.validation=!0;this.update=!1;this.recursive=!1;this.prefetch=!1;this.load=!1;this.raw=!1;this.dataset=!1;this.debug=!1;this.wait=5;this.page=G(t.page),this.folder=t.folder??this.folder,this.domain=t.domain??this.domain,this.md=t.md??this.md,this.validation=t.validation??this.validation,this.update=t.update??this.update,this.recursive=t.recursive??this.recursive,this.prefetch=t.prefetch??this.prefetch,this.load=t.load??this.load,this.raw=t.raw??this.raw,this.dataset=t.dataset??this.dataset,this.token=t.token,this.notion=new C({authToken:this.token}),this.validation&&(X=async()=>{})}async execute(){let t=G(this.page);if(this.load&&(console.time("Load raw data"),await this.loadRaw(),console.timeEnd("Load raw data")),this.prefetch&&(console.time("Fetch raw data"),await this.fetchRawSpace(t),console.timeEnd("Fetch raw data")),this.raw)console.time("Export raw files"),this.recursive?await this.saveRawSpace():await this.saveRawPage(t),console.timeEnd("Export raw files");else{console.time("Extract markdown"),await this.exportMd(t),console.timeEnd("Extract markdown");let e={id:this.page,title:P(this.recordMap.block[this.page].value,this.recordMap),blocks:1,pages:1,children:[],type:"page"};ae(this.recordMap,e),this.pageTree=e}await Promise.all(this.promises),this.update&&(this.recursive?await this.saveRawSpace():await this.saveRawPage(t))}async loadRaw(){let{recordMap:t,pageTree:e,pageMap:o}=await ne(this.folder);this.recordMap=t,this.pageTree=e,this.pageMap=o}async fetchRawSpace(t){let{recordMap:e,pageTree:o,pageMap:i}=await oe(t,this.notion.getPage.bind(this.notion),this.notion.getBlocks.bind(this.notion),this.notion.fetchCollections.bind(this.notion),{startRecordMap:this.recordMap,collectionConcurrency:100,concurrency:100,fetchOption:{timeout:1e4},debug:this.debug});this.pageMap=i,this.recordMap=e,this.pageTree=o}async saveRawSpace(){if(this.validation)return;await q(this.folder,{recursive:!0});let t=[];await q(y(this.folder,"recordMap"),{recursive:!0});for(let e in this.recordMap)this.saveJson(y("recordMap",e),this.recordMap[e]);this.saveJson("pageMap",this.pageMap),this.saveJson("pageTree",this.pageTree),await Promise.all(t)}saveJson(t,e){if(this.validation)return;let o=F.createWriteStream(`${y(this.folder,t)}.json`),i=D.stringifyObject();i.pipe(o);for(let a in e)i.write([a,e[a]]);i.end()}async saveRawPage(t){if(this.validation)return;await q(this.folder,{recursive:!0});let e=await this.notion.getPage(t),o=`${A(t,e)}`,i=JSON.stringify(e),a="json";i=await se(i,{parser:"json"}),await this.writeFile(`${y(this.folder,o)}.${a}`,i)}async writeFile(t,e){if(this.folder)await X(t,e);else return}async exportMd(t){await q(this.md,{recursive:!0});try{let e=this.pageMap&&this.pageMap[t];e||(console.warn(`Missing from pageMap ${t}`),e=await this.notion.getPage(t)),this.recursive||(this.recordMap=e);try{e||(e=await this.notion.getPage(t))}catch{return}if(!["page","collection_view_page"].includes(e.block[t].value.type))throw new Error("Not a page");let o=await this.pageToMarkdown(t,e);this.pageMap[t]||(this.pageMap[t]=e);let i=y(this.md,`${A(t,e)}`);this.promises.push(this.writeFile(`${i}.md`,o))}catch(e){console.error(t,e)}}async pageToMarkdown(t,e){let o=await this.pageToMarkdownObj(t,e),i=`---
1
+ import{Cli as ae,Builtins as re}from"clipanion";var H="Notion CLI",W="1.4.6";import{Option as $,Command as be}from"clipanion";import{NotionAPI as j}from"@texonom/nclient";import{getBlockTitle as E,getCanonicalPageId as U,parsePageId as G,formatDate as Y,getTextContent as O,getBlockParent as ie,defaultMapImageUrl as ne,getAllInSpace as se,getPageTitle as D,recursivePageTree as ce}from"@texonom/nutils";import{join as x}from"path";import{mkdir as q,readFile as N}from"fs/promises";import F from"JSONStream";import L from"graceful-fs";import{promisify as le}from"util";import X from"stream";import{format as de}from"prettier";import{isCollection as K,isSpace as ue}from"@texonom/ntypes";var Q=le(L.writeFile),A=(c,t,e="https://texonom.com")=>`${e}/${U(c,t)}`,J=class{constructor(t){this.promises=[];this.folder="texonom-raw";this.md="texonom-md";this.domain="https://texonom.com";this.validation=!0;this.update=!1;this.recursive=!1;this.prefetch=!1;this.load=!1;this.raw=!1;this.dataset=!1;this.debug=!1;this.wait=5;this.page=G(t.page),this.folder=t.folder??this.folder,this.domain=t.domain??this.domain,this.md=t.md??this.md,this.validation=t.validation??this.validation,this.update=t.update??this.update,this.recursive=t.recursive??this.recursive,this.prefetch=t.prefetch??this.prefetch,this.load=t.load??this.load,this.raw=t.raw??this.raw,this.dataset=t.dataset??this.dataset,this.token=t.token,this.notion=new j({authToken:this.token}),this.validation&&(Q=async()=>{})}async execute(){let t=G(this.page);if(this.load&&(console.time("Load raw data"),await this.loadRaw(),console.timeEnd("Load raw data")),this.prefetch&&(console.time("Fetch raw data"),await this.fetchRawSpace(t),console.timeEnd("Fetch raw data")),this.raw)console.time("Export raw files"),this.recursive?await this.saveRawSpace():await this.saveRawPage(t),console.timeEnd("Export raw files");else{console.time("Extract markdown"),await this.exportMd(t),console.timeEnd("Extract markdown");let e={id:this.page,title:E(this.recordMap.block[this.page].value,this.recordMap),blocks:1,pages:1,children:[],type:"page"};ce(this.recordMap,e),this.pageTree=e}await Promise.all(this.promises),this.update&&(this.recursive?await this.saveRawSpace():await this.saveRawPage(t))}async loadRaw(){let{recordMap:t,pageTree:e,pageMap:o}=await pe(this.folder);this.recordMap=t,this.pageTree=e,this.pageMap=o}async fetchRawSpace(t){let{recordMap:e,pageTree:o,pageMap:r}=await se(t,this.notion.getPage.bind(this.notion),this.notion.getBlocks.bind(this.notion),this.notion.fetchCollections.bind(this.notion),{startRecordMap:this.recordMap,collectionConcurrency:100,concurrency:100,fetchOption:{timeout:1e4},debug:this.debug});this.pageMap=r,this.recordMap=e,this.pageTree=o}async saveRawSpace(){if(this.validation)return;await q(this.folder,{recursive:!0});let t=[];await q(x(this.folder,"recordMap"),{recursive:!0});for(let e in this.recordMap)this.saveJson(x("recordMap",e),this.recordMap[e]);this.saveJson("pageMap",this.pageMap),this.saveJson("pageTree",this.pageTree),await Promise.all(t)}saveJson(t,e){if(this.validation)return;let o=L.createWriteStream(`${x(this.folder,t)}.json`),r=F.stringifyObject();r.pipe(o);for(let a in e)r.write([a,e[a]]);r.end()}async saveRawPage(t){if(this.validation)return;await q(this.folder,{recursive:!0});let e=await this.notion.getPage(t),o=`${U(t,e)}`,r=JSON.stringify(e),a="json";r=await de(r,{parser:"json"}),await this.writeFile(`${x(this.folder,o)}.${a}`,r)}async writeFile(t,e){if(this.folder)await Q(t,e);else return}async exportMd(t){await q(this.md,{recursive:!0});try{let e=this.pageMap&&this.pageMap[t];e||(console.warn(`Missing from pageMap ${t}`),e=await this.notion.getPage(t)),this.recursive||(this.recordMap=e);try{e||(e=await this.notion.getPage(t))}catch{return}if(!["page","collection_view_page"].includes(e.block[t].value.type))throw new Error("Not a page");let o=await this.pageToMarkdown(t,e);this.pageMap[t]||(this.pageMap[t]=e);let r=x(this.md,`${U(t,e)}`);this.promises.push(this.writeFile(`${r}.md`,o))}catch(e){console.error(t,e)}}async pageToMarkdown(t,e){let o=await this.pageToMarkdownObj(t,e),r=`---
2
2
  Title: ${o.title}
3
- `;i+=`Parent: ${o.parent}
4
- `;let a=Object.keys(o).filter(r=>!["title","parent","body"].includes(r));for(let r of a)i+=`${r}: ${o[r]}
5
- `;return i+=`---
6
- `,i+=o.body,i}async pageToMarkdownObj(t,e){var g,h;let o=e.block[t].value,i={},a=await this.decorationsToMarkdown((g=o.properties)!=null&&g.title?o.properties.title:[["Untitled"]],e);i.title=a;let r=ee(o,e),n;if(re(r)?n=r.name:Q(r)?n=O(r.name):r&&(n=P(r,e)),Q(n)){let l=n!=null&&n.schema?Object.keys(n.schema):[];l.splice(l.indexOf("title"),1);for(let c of l){let S=n.schema[c].name,f=n.schema[c].type,u="";switch(f){case"text":u=(h=o==null?void 0:o.properties)!=null&&h[c]?await this.decorationsToMarkdown(o.properties[c],e):"";break;case"created_by":{let w=await this.getUser(o.created_by_id,e);u=w?w.name:"Unknown";break}case"last_edited_by":{let w=await this.getUser(o.last_edited_by_id,e);u=w?w.name:"Unknown";break}case"created_time":u=K(o.created_time);break;case"last_edited_time":u=K(o.last_edited_time);break;default:u=""}i[S]=u}}let p=await this.childrenToMd(o,e,"",o);return i.body=p,i}async childrenToMd(t,e,o,i){var n,p,g,h,l,c,S,f,u,w,b,M,x;let a="",r=1;for(let R of t.content?t.content:[]){let s=await this.getBlock(R,e,`${R} from ${P(i,e)}`);if(!s)continue;let v=(n=s==null?void 0:s.properties)==null?void 0:n.title;switch(s.type){case"header":a+=`${o}# ${await this.decorationsToMarkdown(v,e)}`;break;case"sub_header":a+=`${o}## ${await this.decorationsToMarkdown(v,e)}`;break;case"sub_sub_header":a+=`${o}### ${await this.decorationsToMarkdown(v,e)}`;break;case"text":a+=`${o}${await this.decorationsToMarkdown(v,e)}`;break;case"bulleted_list":a+=`${o}- ${await this.decorationsToMarkdown(v,e)}`;break;case"numbered_list":a+=`${o}${r++}. ${await this.decorationsToMarkdown(v,e)}`;break;case"to_do":a+=`${o}- [ ] ${await this.decorationsToMarkdown(v,e)}`;break;case"toggle":a+=`${o}<details><summary>${o}${o}${await this.decorationsToMarkdown(v,e)}</summary>
3
+ `;r+=`Parent: ${o.parent}
4
+ `;let a=Object.keys(o).filter(i=>!["title","parent","body"].includes(i));for(let i of a)r+=`${i}: ${o[i]}
5
+ `;return r+=`---
6
+ `,r+=o.body,r}async pageToMarkdownObj(t,e){var g,h;let o=e.block[t].value,r={},a=await this.decorationsToMarkdown((g=o.properties)!=null&&g.title?o.properties.title:[["Untitled"]],e);r.title=a;let i=ie(o,e),n;if(ue(i)?n=i.name:K(i)?n=O(i.name):i&&(n=E(i,e)),K(n)){let u=n!=null&&n.schema?Object.keys(n.schema):[];u.splice(u.indexOf("title"),1);for(let l of u){let T=n.schema[l].name,b=n.schema[l].type,m="";switch(b){case"text":m=(h=o==null?void 0:o.properties)!=null&&h[l]?await this.decorationsToMarkdown(o.properties[l],e):"";break;case"created_by":{let w=await this.getUser(o.created_by_id,e);m=w?w.name:"Unknown";break}case"last_edited_by":{let w=await this.getUser(o.last_edited_by_id,e);m=w?w.name:"Unknown";break}case"created_time":m=Y(o.created_time);break;case"last_edited_time":m=Y(o.last_edited_time);break;default:m=""}r[T]=m}}let d=await this.childrenToMd(o,e,"",o);return r.body=d,r}async childrenToMd(t,e,o,r){var n,d,g,h,u,l,T,b,m,w,y,M,P;let a="",i=1;for(let S of t.content?t.content:[]){let s=await this.getBlock(S,e,`${S} from ${E(r,e)}`);if(!s)continue;let v=(n=s==null?void 0:s.properties)==null?void 0:n.title;switch(s.type){case"header":a+=`${o}# ${await this.decorationsToMarkdown(v,e)}`;break;case"sub_header":a+=`${o}## ${await this.decorationsToMarkdown(v,e)}`;break;case"sub_sub_header":a+=`${o}### ${await this.decorationsToMarkdown(v,e)}`;break;case"text":a+=`${o}${await this.decorationsToMarkdown(v,e)}`;break;case"bulleted_list":a+=`${o}- ${await this.decorationsToMarkdown(v,e)}`;break;case"numbered_list":a+=`${o}${i++}. ${await this.decorationsToMarkdown(v,e)}`;break;case"to_do":a+=`${o}- [ ] ${await this.decorationsToMarkdown(v,e)}`;break;case"toggle":a+=`${o}<details><summary>${o}${o}${await this.decorationsToMarkdown(v,e)}</summary>
7
7
  `;break;case"quote":a+=await this.decorationsToMarkdown(v,e,`
8
8
  ${o.trim()}> `)+`
9
9
  `;break;case"code":a+=`${o}\`\`\`type${await this.decorationsToMarkdown(v,e)}\`\`\``;break;case"equation":a+=`${o}$$${await this.decorationsToMarkdown(v,e)}$$`;break;case"callout":{a+=await this.decorationsToMarkdown(v,e,`
10
10
  ${o.trim()}> `)+`
11
- `;break}case"bookmark":{let d=`
12
- ${o.trim()}> `;a+=`${d}[${O((p=s.properties)!=null&&p.title?s.properties.title:[["Untitled"]])}](${O(s.properties.link)})
13
- `;break}case"external_object_instance":try{let d=s.format.original_url,B=s.format.attributes?(h=(g=s.format.attributes.filter(E=>E.id==="title")[0])==null?void 0:g.values)==null?void 0:h[0]:d;if(!d)break;a+=`${o}${o}[${B}](${d})${o}`;break}catch(d){console.error(d,s.id);break}case"collection_view_page":case"collection_view":{let d=await this.getCollection(s,e,`${s.id} from ${V(e)}`);if(!d)continue;a+=`${o}### ${await this.decorationsToMarkdown(d.name,e)}`,a+=`${o}|Title|
14
- |:-:|`;let B=s.view_ids.map(m=>{var k;return e.collection_view[m]||this.debug&&console.warn(`Missing view ${m} from ${d.name}`),(k=e.collection_view[m])==null?void 0:k.value}).filter(Boolean),E=[];for(let m of B){let k=await this.getCollectionView(d.id,m.id,e,`${d.name} ${m.name}`);if(k)for(let _ of k.blockIds)E.push(_);else break}for(let m of E){let k=(l=e.block[m])==null?void 0:l.value;k||this.debug&&console.warn(`no ${m} in ${d.name[0]}`),a+=`${o}|[${P(k,e)}](${J(m,e)})|`}if(this.recursive&&E.length)for(let m of E)this.promises.push(this.exportMd(m));break}case"page":{a+=`${o}${o}[${P(s,e)}](${J(s.id,e)})${o}`,this.recursive&&this.promises.push(this.exportMd(s.id));break}case"alias":{let d=(f=e.block[(S=(c=s.format)==null?void 0:c.alias_pointer)==null?void 0:S.id])==null?void 0:f.value;if(!d){this.debug&&console.warn(`Missing alias ${(w=(u=s.format)==null?void 0:u.alias_pointer)==null?void 0:w.id} from ${P(i,e)} ${i.id}`);continue}a+=`${o}${o}[${P(d,e)}](${J(d.id,e)})${o}`;break}case"image":{let d=s.properties.caption?O(s.properties.caption):"";a+=`${o}![${d}](${te((b=s.format)==null?void 0:b.display_source,s)})`;break}case"video":a+=`${o}<video src="${s.format.display_source} />`;break;case"file":a+=`${o}[File](${(M=s.format)==null?void 0:M.display_source})`;break;case"pdf":a+=`${o}<iframe src="${(x=s.format)==null?void 0:x.display_source}"/>`;break;case"divider":a+=`${o}---`;break;case"column_list":break;case"column":break;default:a+=`${o}`}if(s.content&&s.type!=="page"&&s.type!=="collection_view_page"){let d=["toggle","transclusion_container","transclusion_reference","column_list"].includes(s.type)?o:`
15
- ${o.trim()}> `;a+=await this.childrenToMd(s,e,d,i),s.type==="column"&&(a+=`
16
- `)}s.type==="toggle"&&(a+=`${o}</details>${o}`)}return a}async decorationsToMarkdown(t,e,o=""){var n,p,g;if(!t)return"";let i="";for(let h of t){let l="",[c,S]=h;if(!S)i+=c;else{let f=c;for(let w of S)switch(w[0]){case"p":{let b=w[1],M=await this.getBlock(b,e,`"p" ${V(e)}`);if(!M)break;let x=P(M,e),R=J(b,e);f=`[${x}](${R})`;break}case"a":{let b=w[1];f=`[${c}](${b})`;break}case"i":l+="*";break;case"b":l+="**";break;case"h":l+="";break;case"c":l+="`";break;case"s":l+="~~";break;case"e":l+="$",f=w[1];break;case"eoi":try{let b=w[1],M=await this.getBlock(b,e,`"eoi" ${V(e)}`);if(!M)break;let x=M.format.uri,R=M.format.attributes?(g=(p=(n=M.format.attributes)==null?void 0:n.filter(s=>s.id==="title")[0])==null?void 0:p.values)==null?void 0:g[0]:x;if(!x)break;f=`[${R}](${x})`;break}catch(b){console.error(b,h);break}case"u":{let b=await this.getUser(w[1],e);if(!b)break;f=`[@${b.name}](mailto:${b.email})`;break}}let u=f;S.find(w=>w[0]==="_")&&(u=`<u>${f}</u>`),u=l+u+l.split("").reverse().join(""),i+=u}}return i.split(`
17
- `).map(h=>o+h).join("")}async getBlock(t,e,o=""){var a,r,n,p,g;let i=(a=e.block[t])==null?void 0:a.value;!i&&this.recordMap&&(i=(r=this.recordMap.block[t])==null?void 0:r.value);try{!i&&this.token&&(i=(g=(p=(n=(await new C({authToken:this.token}).getBlocks([t])).recordMap)==null?void 0:n.block)==null?void 0:p[t])==null?void 0:g.value)}catch{i||this.debug&&console.warn(`${o} Missing block ${t}`)}return i&&(e.block[t]={value:i,role:"reader"},this.recordMap&&(this.recordMap.block[t]={value:i,role:"reader"})),i}async getUser(t,e){var i,a,r,n,p;let o=(i=e.notion_user[t])==null?void 0:i.value;!o&&this.recordMap&&(o=(a=this.recordMap.notion_user[t])==null?void 0:a.value);try{!o&&this.token&&(o=(p=(n=(r=(await new C({authToken:this.token}).getUsers([t])).recordMapWithRoles)==null?void 0:r.notion_user)==null?void 0:n[t])==null?void 0:p.value)}catch{o||this.debug&&console.warn(`Missing user ${t}`)}return o&&(e.notion_user[t]={value:o,role:"reader"},this.recordMap&&(this.recordMap.notion_user[t]={value:o,role:"reader"})),o}async getCollection(t,e,o=""){var r,n,p,g,h;let i=t.collection_id,a=(r=e.collection[t.collection_id])==null?void 0:r.value;if(!a&&this.recordMap&&(a=(n=this.recordMap.collection[i])==null?void 0:n.value,a)){e.collection[i]=(p=this.recordMap.collection)==null?void 0:p[i];for(let l of t.view_ids)e.collection_view[l]=(g=this.recordMap.collection_view)==null?void 0:g[l]}try{if(!a&&this.token){let c=await new C({authToken:this.token}).getPageRaw(t.id);ce(1e3*this.wait),c.recordMap||console.error(c),a=(h=c.recordMap.collection[i])==null?void 0:h.value,a&&(e.collection_view={...e.collection_view,...c.recordMap.collection_view},e.collection={...e.collection,...c.recordMap.collection},e.block={...e.block,...c.recordMap.block},this.recordMap.collection_view={...this.recordMap.collection_view,...c.recordMap.collection_view},this.recordMap.collection={...this.recordMap.collection,...c.recordMap.collection},this.recordMap.block={...this.recordMap.block,...c.recordMap.block})}}catch{a||this.debug&&console.warn(`${o} Missing collection block ${t.id}`)}return await this.getCollectionView(i,t.view_ids[0],e,o),a}async getCollectionView(t,e,o,i=""){var r,n,p,g,h,l,c,S,f,u,w,b,M,x,R,s,v,d,B;let a=(p=(n=(r=o.collection_query)==null?void 0:r[t])==null?void 0:n[e])==null?void 0:p.collection_group_results;!a&&this.recordMap&&(a=(l=(h=(g=this.recordMap.collection_query)==null?void 0:g[t])==null?void 0:h[e])==null?void 0:l.collection_group_results,a&&(o.collection_query[t]={...o.collection_query[t],[e]:(S=(c=this.recordMap.collection_query)==null?void 0:c[t])==null?void 0:S[e]},this.recordMap.collection_query[t]={...this.recordMap.collection_query[t],[e]:(u=(f=this.recordMap.collection_query)==null?void 0:f[t])==null?void 0:u[e]},o.collection[t]={...o.collection[t],[e]:(b=(w=this.recordMap.collection)==null?void 0:w[t])==null?void 0:b[e]},this.recordMap.collection[t]={...this.recordMap.collection[t],[e]:(x=(M=this.recordMap.collection)==null?void 0:M[t])==null?void 0:x[e]}));try{if(!a&&this.token){let m=await new C({authToken:this.token}).getCollectionData(t,e,(R=o.collection_view[e])==null?void 0:R.value);if(a=(v=(s=m.result)==null?void 0:s.reducerResults)==null?void 0:v.collection_group_results,a){o.collection_query[t]={...o.collection_query[t],[e]:(d=m.result)==null?void 0:d.reducerResults},this.recordMap&&(this.recordMap.collection_query[t]={...this.recordMap.collection_query[t],[e]:(B=m.result)==null?void 0:B.reducerResults});for(let k in m.recordMap.block){let _=m.recordMap.block[k].value;_&&(o.block[k]={value:_,role:"reader"},this.recordMap&&(this.recordMap.block[k]={value:_,role:"reader"}))}for(let k in m.recordMap.collection){let _=m.recordMap.collection[k].value;_&&(o.collection[k]={value:_,role:"reader"},this.recordMap&&(this.recordMap.collection[k]={value:_,role:"reader"}))}for(let k in m.recordMap.collection_view){let _=m.recordMap.collection_view[k].value;_&&(o.collection_view[k]={value:_,role:"reader"},this.recordMap&&(this.recordMap.collection_view[k]={value:_,role:"reader"}))}}}}catch{a||this.debug&&console.warn(`${i} Missing collection view ${e}`)}return a}async getSpace(t,e){var i,a,r,n,p;let o=(i=e.space[t])==null?void 0:i.value;!o&&this.recordMap&&(o=(a=this.recordMap.space[t])==null?void 0:a.value);try{!o&&this.token&&(o=(p=(n=(r=(await new C({authToken:this.token}).getSpaces([t])).recordMapWithRoles)==null?void 0:r.space)==null?void 0:n[t])==null?void 0:p.value,o&&(e.space[t]={value:o,role:"reader"},this.recordMap&&(this.recordMap.space[t]={value:o,role:"reader"})))}catch{o||this.debug&&console.warn(`Missing space ${t}`)}return o}};async function ne($){let t=[];t.push(j(y($,"recordMap","block.json"),"utf8").then(JSON.parse)),t.push(j(y($,"recordMap","collection.json"),"utf8").then(JSON.parse)),t.push(j(y($,"recordMap","notion_user.json"),"utf8").then(JSON.parse)),t.push(j(y($,"recordMap","space.json"),"utf8").then(JSON.parse)),t.push(j(y($,"recordMap","collection_view.json"),"utf8").then(JSON.parse)),t.push(j(y($,"recordMap","collection_query.json"),"utf8").then(JSON.parse)),t.push(j(y($,"recordMap","signed_urls.json"),"utf8").then(JSON.parse)),t.push(j(y($,"pageTree.json"),"utf8").then(JSON.parse));let[e,o,i,a,r,n,p,g]=await Promise.all(t),h={},l=F.createReadStream(y($,"pageMap.json")),c=D.parse("*");return l.pipe(c),c.on("data",f=>{let u=Object.keys(f.block)[0];h[u]=f}),await new Promise(f=>Y.finished(c,u=>f(u))),{recordMap:{block:e,collection:o,notion_user:i,space:a,collection_query:n,collection_view:r,signed_urls:p},pageTree:g,pageMap:h}}async function ve($,t){let e={},o=F.createReadStream(y($,`${t}.json`)),i=D.parse("*");return o.pipe(i),i.on("*",([a,r])=>{e[a]=r}),new Promise(a=>Y.finished(i,r=>{console.error(r),a(e)}))}var ce=$=>{let t=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(t,0,0,$)};var N=class extends le{constructor(){super(...arguments);this.folder=T.String("-o,--output","texonom-raw",{description:"Target root folder to export folder"});this.md=T.String("-m,--md","texonom-md",{description:"Target folder to export markdown"});this.domain=T.String("-d,--domain","https://texonom.com",{description:"Domain to fill in the link"});this.validation=T.Boolean("-v,--validation",{description:"Validation exported data only"});this.update=T.Boolean("-u,--update",{description:"Update exported data and resave to the --root"});this.page=T.String("-p,--page",{required:!0,description:"Target page to export"});this.recursive=T.Boolean("-r,--recursive",{description:"Recursively export children"});this.prefetch=T.Boolean("-f, --prefetch",{description:"Prefetch all space for faster export (recommended for exporting all pages in a space)"});this.load=T.Boolean("-l, --load",{description:"Load data from exported cache folder --root"});this.raw=T.Boolean("--raw",{description:`Export raw recordMap JSON data
18
- Markdown format do not preserve all information`});this.dataset=T.Boolean("-d, --dataset",{description:"Export as dataset for LLM learning"});this.token=T.String("-t,--token",{description:"Notion Access Token"});this.wait=T.Counter("-w,--wait",{description:"Wait couter for missed collection view"})}async execute(){await new U({folder:this.folder,validation:this.validation,update:this.update,page:this.page,recursive:this.recursive,prefetch:this.prefetch,load:this.load,raw:this.raw,dataset:this.dataset,token:this.token}).execute()}};N.paths=[["export"]];var L=new Z({binaryName:"notion",binaryLabel:H,binaryVersion:z});L.register(N);L.register(I.HelpCommand);L.register(I.VersionCommand);L.runExit(process.argv.slice(2),Z.defaultContext);export{N as NotionExportCommand,U as NotionExporter,J as getBlockLink,ve as loadJson,ne as loadRaw};
11
+ `;break}case"bookmark":{let p=`
12
+ ${o.trim()}> `;a+=`${p}[${O((d=s.properties)!=null&&d.title?s.properties.title:[["Untitled"]])}](${O(s.properties.link)})
13
+ `;break}case"external_object_instance":try{let p=s.format.original_url,R=s.format.attributes?(h=(g=s.format.attributes.filter(B=>B.id==="title")[0])==null?void 0:g.values)==null?void 0:h[0]:p;if(!p)break;a+=`${o}${o}[${R}](${p})${o}`;break}catch(p){console.error(p,s.id);break}case"collection_view_page":case"collection_view":{let p=await this.getCollection(s,e,`${s.id} from ${D(e)}`);if(!p)continue;a+=`${o}### ${await this.decorationsToMarkdown(p.name,e)}`,a+=`${o}|Title|
14
+ |:-:|`;let R=s.view_ids.map(f=>{var k;return e.collection_view[f]||this.debug&&console.warn(`Missing view ${f} from ${p.name}`),(k=e.collection_view[f])==null?void 0:k.value}).filter(Boolean),B=[];for(let f of R){let k=await this.getCollectionView(p.id,f.id,e,`${p.name} ${f.name}`);if(k)for(let _ of k.blockIds)B.push(_);else break}for(let f of B){let k=(u=e.block[f])==null?void 0:u.value;k||this.debug&&console.warn(`no ${f} in ${p.name[0]}`),a+=`${o}|[${E(k,e)}](${A(f,e)})|`}if(this.recursive&&B.length)for(let f of B)this.promises.push(this.exportMd(f));break}case"page":{a+=`${o}${o}[${E(s,e)}](${A(s.id,e)})${o}`,this.recursive&&this.promises.push(this.exportMd(s.id));break}case"alias":{let p=(b=e.block[(T=(l=s.format)==null?void 0:l.alias_pointer)==null?void 0:T.id])==null?void 0:b.value;if(!p){this.debug&&console.warn(`Missing alias ${(w=(m=s.format)==null?void 0:m.alias_pointer)==null?void 0:w.id} from ${E(r,e)} ${r.id}`);continue}a+=`${o}${o}[${E(p,e)}](${A(p.id,e)})${o}`;break}case"image":{let p=s.properties.caption?O(s.properties.caption):"";a+=`${o}![${p}](${ne((y=s.format)==null?void 0:y.display_source,s)})`;break}case"video":a+=`${o}<video src="${s.format.display_source} />`;break;case"file":a+=`${o}[File](${(M=s.format)==null?void 0:M.display_source})`;break;case"pdf":a+=`${o}<iframe src="${(P=s.format)==null?void 0:P.display_source}"/>`;break;case"divider":a+=`${o}---`;break;case"column_list":break;case"column":break;default:a+=`${o}`}if(s.content&&s.type!=="page"&&s.type!=="collection_view_page"){let p=["toggle","transclusion_container","transclusion_reference","column_list"].includes(s.type)?o:`
15
+ ${o.trim()}> `;a+=await this.childrenToMd(s,e,p,r),s.type==="column"&&(a+=`
16
+ `)}s.type==="toggle"&&(a+=`${o}</details>${o}`)}return a}async decorationsToMarkdown(t,e,o=""){var n,d,g;if(!t)return"";let r="";for(let h of t){let u="",[l,T]=h;if(!T)r+=l;else{let b=l;for(let w of T)switch(w[0]){case"p":{let y=w[1],M=await this.getBlock(y,e,`"p" ${D(e)}`);if(!M)break;let P=E(M,e),S=A(y,e);b=`[${P}](${S})`;break}case"a":{let y=w[1];b=`[${l}](${y})`;break}case"i":u+="*";break;case"b":u+="**";break;case"h":u+="";break;case"c":u+="`";break;case"s":u+="~~";break;case"e":u+="$",b=w[1];break;case"eoi":try{let y=w[1],M=await this.getBlock(y,e,`"eoi" ${D(e)}`);if(!M)break;let P=M.format.uri,S=M.format.attributes?(g=(d=(n=M.format.attributes)==null?void 0:n.filter(s=>s.id==="title")[0])==null?void 0:d.values)==null?void 0:g[0]:P;if(!P)break;b=`[${S}](${P})`;break}catch(y){console.error(y,h);break}case"u":{let y=await this.getUser(w[1],e);if(!y)break;b=`[@${y.name}](mailto:${y.email})`;break}}let m=b;T.find(w=>w[0]==="_")&&(m=`<u>${b}</u>`),m=u+m+u.split("").reverse().join(""),r+=m}}return r.split(`
17
+ `).map(h=>o+h).join("")}async getBlock(t,e,o=""){var a,i,n,d,g;let r=(a=e.block[t])==null?void 0:a.value;!r&&this.recordMap&&(r=(i=this.recordMap.block[t])==null?void 0:i.value);try{!r&&this.token&&(r=(g=(d=(n=(await new j({authToken:this.token}).getBlocks([t])).recordMap)==null?void 0:n.block)==null?void 0:d[t])==null?void 0:g.value)}catch{r||this.debug&&console.warn(`${o} Missing block ${t}`)}return r&&(e.block[t]={value:r,role:"reader"},this.recordMap&&(this.recordMap.block[t]={value:r,role:"reader"})),r}async getUser(t,e){var r,a,i,n,d;let o=(r=e.notion_user[t])==null?void 0:r.value;!o&&this.recordMap&&(o=(a=this.recordMap.notion_user[t])==null?void 0:a.value);try{!o&&this.token&&(o=(d=(n=(i=(await new j({authToken:this.token}).getUsers([t])).recordMapWithRoles)==null?void 0:i.notion_user)==null?void 0:n[t])==null?void 0:d.value)}catch{o||this.debug&&console.warn(`Missing user ${t}`)}return o&&(e.notion_user[t]={value:o,role:"reader"},this.recordMap&&(this.recordMap.notion_user[t]={value:o,role:"reader"})),o}async getCollection(t,e,o=""){var i,n,d,g,h;let r=t.collection_id,a=(i=e.collection[t.collection_id])==null?void 0:i.value;if(!a&&this.recordMap&&(a=(n=this.recordMap.collection[r])==null?void 0:n.value,a)){e.collection[r]=(d=this.recordMap.collection)==null?void 0:d[r];for(let u of t.view_ids)e.collection_view[u]=(g=this.recordMap.collection_view)==null?void 0:g[u]}try{if(!a&&this.token){let l=await new j({authToken:this.token}).getPageRaw(t.id);he(1e3*this.wait),l.recordMap||console.error(l),a=(h=l.recordMap.collection[r])==null?void 0:h.value,a&&(e.collection_view={...e.collection_view,...l.recordMap.collection_view},e.collection={...e.collection,...l.recordMap.collection},e.block={...e.block,...l.recordMap.block},this.recordMap.collection_view={...this.recordMap.collection_view,...l.recordMap.collection_view},this.recordMap.collection={...this.recordMap.collection,...l.recordMap.collection},this.recordMap.block={...this.recordMap.block,...l.recordMap.block})}}catch{a||this.debug&&console.warn(`${o} Missing collection block ${t.id}`)}return await this.getCollectionView(r,t.view_ids[0],e,o),a}async getCollectionView(t,e,o,r=""){var i,n,d,g,h,u,l,T,b,m,w,y,M,P,S,s,v,p,R;let a=(d=(n=(i=o.collection_query)==null?void 0:i[t])==null?void 0:n[e])==null?void 0:d.collection_group_results;!a&&this.recordMap&&(a=(u=(h=(g=this.recordMap.collection_query)==null?void 0:g[t])==null?void 0:h[e])==null?void 0:u.collection_group_results,a&&(o.collection_query[t]={...o.collection_query[t],[e]:(T=(l=this.recordMap.collection_query)==null?void 0:l[t])==null?void 0:T[e]},this.recordMap.collection_query[t]={...this.recordMap.collection_query[t],[e]:(m=(b=this.recordMap.collection_query)==null?void 0:b[t])==null?void 0:m[e]},o.collection[t]={...o.collection[t],[e]:(y=(w=this.recordMap.collection)==null?void 0:w[t])==null?void 0:y[e]},this.recordMap.collection[t]={...this.recordMap.collection[t],[e]:(P=(M=this.recordMap.collection)==null?void 0:M[t])==null?void 0:P[e]}));try{if(!a&&this.token){let f=await new j({authToken:this.token}).getCollectionData(t,e,(S=o.collection_view[e])==null?void 0:S.value);if(a=(v=(s=f.result)==null?void 0:s.reducerResults)==null?void 0:v.collection_group_results,a){o.collection_query[t]={...o.collection_query[t],[e]:(p=f.result)==null?void 0:p.reducerResults},this.recordMap&&(this.recordMap.collection_query[t]={...this.recordMap.collection_query[t],[e]:(R=f.result)==null?void 0:R.reducerResults});for(let k in f.recordMap.block){let _=f.recordMap.block[k].value;_&&(o.block[k]={value:_,role:"reader"},this.recordMap&&(this.recordMap.block[k]={value:_,role:"reader"}))}for(let k in f.recordMap.collection){let _=f.recordMap.collection[k].value;_&&(o.collection[k]={value:_,role:"reader"},this.recordMap&&(this.recordMap.collection[k]={value:_,role:"reader"}))}for(let k in f.recordMap.collection_view){let _=f.recordMap.collection_view[k].value;_&&(o.collection_view[k]={value:_,role:"reader"},this.recordMap&&(this.recordMap.collection_view[k]={value:_,role:"reader"}))}}}}catch{a||this.debug&&console.warn(`${r} Missing collection view ${e}`)}return a}async getSpace(t,e){var r,a,i,n,d;let o=(r=e.space[t])==null?void 0:r.value;!o&&this.recordMap&&(o=(a=this.recordMap.space[t])==null?void 0:a.value);try{!o&&this.token&&(o=(d=(n=(i=(await new j({authToken:this.token}).getSpaces([t])).recordMapWithRoles)==null?void 0:i.space)==null?void 0:n[t])==null?void 0:d.value,o&&(e.space[t]={value:o,role:"reader"},this.recordMap&&(this.recordMap.space[t]={value:o,role:"reader"})))}catch{o||this.debug&&console.warn(`Missing space ${t}`)}return o}};async function pe(c){let t=[];t.push(N(x(c,"recordMap","block.json"),"utf8").then(JSON.parse)),t.push(N(x(c,"recordMap","collection.json"),"utf8").then(JSON.parse)),t.push(N(x(c,"recordMap","notion_user.json"),"utf8").then(JSON.parse)),t.push(N(x(c,"recordMap","space.json"),"utf8").then(JSON.parse)),t.push(N(x(c,"recordMap","collection_view.json"),"utf8").then(JSON.parse)),t.push(N(x(c,"recordMap","collection_query.json"),"utf8").then(JSON.parse)),t.push(N(x(c,"recordMap","signed_urls.json"),"utf8").then(JSON.parse)),t.push(N(x(c,"pageTree.json"),"utf8").then(JSON.parse));let[e,o,r,a,i,n,d,g]=await Promise.all(t),h={},u=L.createReadStream(x(c,"pageMap.json")),l=F.parse("*");return u.pipe(l),l.on("data",b=>{let m=Object.keys(b.block)[0];h[m]=b}),await new Promise(b=>X.finished(l,m=>b(m))),{recordMap:{block:e,collection:o,notion_user:r,space:a,collection_query:n,collection_view:i,signed_urls:d},pageTree:g,pageMap:h}}async function Ee(c,t){let e={},o=L.createReadStream(x(c,`${t}.json`)),r=F.parse("*");return o.pipe(r),r.on("*",([a,i])=>{e[a]=i}),new Promise(a=>X.finished(r,i=>{console.error(i),a(e)}))}var he=c=>{let t=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(t,0,0,c)};import me from"fs";import{promisify as fe}from"util";var ge=fe(me.writeFile);async function ee(c,t){let e=Z(t,"pages"),o="Texonom PageTree",r=`${c}/pagetree.html`;await I(e,o,r);let a=Z(t,"blocks"),i="Texonom BlockMap",n=`${c}/blocktree.html`;await I(a,i,n)}function Z(c,t){function e(o){let r=o.children?o.children.map(e).filter(i=>i!==null):[],a=o[t]||0;if(r.length>0){let i=r.reduce((n,d)=>n+d.value,0);a===0&&(a=i)}return a<=0?null:{id:o.id,name:o.title,value:a,children:r.length>0?r:void 0}}return e(c)}async function I(c,t,e){let o=`
18
+ <!DOCTYPE html>
19
+ <html lang="en">
20
+ <head>
21
+ <meta charset="UTF-8">
22
+ <title>${t}</title>
23
+ <style>
24
+ body {
25
+ margin: 0;
26
+ font-family: sans-serif;
27
+ background-color: #202229;
28
+ }
29
+ .header {
30
+ text-align: center;
31
+ margin: 20px;
32
+ font-size: 24px;
33
+ color: white;
34
+ }
35
+ .breadcrumb {
36
+ text-align: center;
37
+ margin: 10px;
38
+ font-size: 16px;
39
+ color: white;
40
+ }
41
+ .current-title {
42
+ text-align: center;
43
+ margin: 10px;
44
+ font-size: 18px;
45
+ color: white;
46
+ }
47
+ .chart {
48
+ width: 100%;
49
+ height: 70vh;
50
+ margin: auto;
51
+ position: relative;
52
+ }
53
+ .node rect {
54
+ cursor: pointer;
55
+ stroke: #fff;
56
+ stroke-width: 1px;
57
+ rx: 8;
58
+ ry: 8;
59
+ }
60
+ .label {
61
+ text-anchor: middle;
62
+ fill: white;
63
+ text-decoration: underline;
64
+ cursor: pointer;
65
+ }
66
+ .count {
67
+ text-anchor: middle;
68
+ fill: lightgray;
69
+ }
70
+ </style>
71
+ </head>
72
+ <body>
73
+ <div class="header">${t}</div>
74
+ <div class="breadcrumb" id="breadcrumb"></div>
75
+ <div class="current-title" id="current-title"></div>
76
+ <div class="chart" id="chart"></div>
77
+ <script src="https://d3js.org/d3.v6.min.js"></script>
78
+ <script>
79
+ var data = ${JSON.stringify(c)};
80
+
81
+ var margin = {top: 20, right: 0, bottom: 0, left: 0},
82
+ width = document.getElementById('chart').clientWidth,
83
+ height = document.getElementById('chart').clientHeight;
84
+
85
+ var color = d3.scaleOrdinal()
86
+ .domain([0, 1, 2, 3, 4, 5])
87
+ .range(["#465881", "#5f6d96", "#7882ab", "#9197c0"]);
88
+
89
+ var x = d3.scaleLinear()
90
+ .domain([0, width])
91
+ .range([0, width]);
92
+
93
+ var y = d3.scaleLinear()
94
+ .domain([0, height])
95
+ .range([0, height]);
96
+
97
+ var treemapLayout = d3.treemap()
98
+ .size([width, height])
99
+ .paddingInner(2)
100
+ .round(false);
101
+
102
+ var root = d3.hierarchy(data)
103
+ .sum(function(d) { return d.value; })
104
+ .sort(function(a, b) { return b.value - a.value; });
105
+
106
+ treemapLayout(root);
107
+
108
+ var svg = d3.select("#chart").append("svg")
109
+ .attr("width", width)
110
+ .attr("height", height)
111
+ .style("font", "10px sans-serif")
112
+ .style("position", "relative");
113
+
114
+ display(root);
115
+
116
+ function display(d) {
117
+ var currentDepth = d.depth;
118
+
119
+ // Update breadcrumb
120
+ var breadcrumb = d.ancestors().reverse().map(function(d) {
121
+ return '<span class="breadcrumb-item" data-id="' + d.data.id + '">' + d.data.name + '</span>';
122
+ }).join(' / ');
123
+ document.getElementById('breadcrumb').innerHTML = breadcrumb;
124
+
125
+ // Add click events to breadcrumb
126
+ var breadcrumbItems = document.querySelectorAll('.breadcrumb-item');
127
+ breadcrumbItems.forEach(function(item) {
128
+ item.addEventListener('click', function(event) {
129
+ var id = event.target.getAttribute('data-id');
130
+ var node = findNodeById(root, id);
131
+ if (node) {
132
+ zoom(node);
133
+ }
134
+ });
135
+ });
136
+
137
+ // Update current title
138
+ document.getElementById('current-title').innerText = d.data.name;
139
+
140
+ x.domain([d.x0, d.x1]);
141
+ y.domain([d.y0, d.y1]);
142
+
143
+ var nodes = d.descendants().filter(function(node) {
144
+ return node.depth - currentDepth <= 1 && node.depth >= currentDepth;
145
+ });
146
+
147
+ svg.selectAll(".node").remove();
148
+
149
+ var cell = svg.selectAll(".node")
150
+ .data(nodes)
151
+ .enter().append("g")
152
+ .attr("class", "node")
153
+ .attr("transform", function(d) { return "translate(" + x(d.x0) + "," + y(d.y0) + ")"; })
154
+ .on("click", function(event, d) {
155
+ if (d.children) {
156
+ zoom(d);
157
+ } else {
158
+ window.open('https://texonom.com/' + d.data.id, '_blank');
159
+ }
160
+ event.stopPropagation();
161
+ });
162
+
163
+ cell.append("rect")
164
+ .attr("id", function(d) { return d.data.id; })
165
+ .attr("width", function(d) { return x(d.x1) - x(d.x0); })
166
+ .attr("height", function(d) { return y(d.y1) - y(d.y0); })
167
+ .attr("fill", function(d) { return color(d.depth); })
168
+ .attr("rx", 8)
169
+ .attr("ry", 8);
170
+
171
+ cell.append("text")
172
+ .attr("class", "label")
173
+ .attr("x", function(d) { return (x(d.x1) - x(d.x0)) / 2; })
174
+ .attr("y", function(d) { return (y(d.y1) - y(d.y0)) / 2; })
175
+ .text(function(d) { return d.data.name; })
176
+ .style("font-size", function(d) {
177
+ var boxArea = (x(d.x1) - x(d.x0)) * (y(d.y1) - y(d.y0));
178
+ var size = Math.max(10, Math.min(30, Math.sqrt(boxArea) / 5));
179
+ return size + "px";
180
+ })
181
+ .on("click", function(event, d) {
182
+ window.open('https://texonom.com/' + d.data.id, '_blank');
183
+ event.stopPropagation();
184
+ });
185
+
186
+ cell.append("text")
187
+ .attr("class", "count")
188
+ .attr("x", function(d) { return (x(d.x1) - x(d.x0)) / 2; })
189
+ .attr("y", function(d) { return (y(d.y1) - y(d.y0)) / 2 + 20; })
190
+ .text(function(d) { return d.data.value; })
191
+ .style("fill", "lightgray")
192
+ .style("font-size", "0.8rem");
193
+ }
194
+
195
+ function zoom(d) {
196
+ var currentDepth = d.depth;
197
+
198
+ // Update breadcrumb
199
+ var breadcrumb = d.ancestors().reverse().map(function(d) {
200
+ return '<span class="breadcrumb-item" data-id="' + d.data.id + '">' + d.data.name + '</span>';
201
+ }).join(' / ');
202
+ document.getElementById('breadcrumb').innerHTML = breadcrumb;
203
+
204
+ // Add click events to breadcrumb
205
+ var breadcrumbItems = document.querySelectorAll('.breadcrumb-item');
206
+ breadcrumbItems.forEach(function(item) {
207
+ item.addEventListener('click', function(event) {
208
+ var id = event.target.getAttribute('data-id');
209
+ var node = findNodeById(root, id);
210
+ if (node) {
211
+ zoom(node);
212
+ }
213
+ });
214
+ });
215
+
216
+ // Update current title
217
+ document.getElementById('current-title').innerText = d.data.name;
218
+
219
+ var t = svg.transition()
220
+ .duration(750);
221
+
222
+ x.domain([d.x0, d.x1]);
223
+ y.domain([d.y0, d.y1]);
224
+
225
+ var nodes = d.descendants().filter(function(node) {
226
+ return node.depth - currentDepth <= 1 && node.depth >= currentDepth;
227
+ });
228
+
229
+ var cell = svg.selectAll(".node")
230
+ .data(nodes, function(d) { return d.data.id; });
231
+
232
+ cell.exit().remove();
233
+
234
+ var cellEnter = cell.enter().append("g")
235
+ .attr("class", "node")
236
+ .on("click", function(event, d) {
237
+ if (d.children) {
238
+ zoom(d);
239
+ } else {
240
+ window.open('https://texonom.com/' + d.data.id, '_blank');
241
+ }
242
+ event.stopPropagation();
243
+ });
244
+
245
+ cellEnter.append("rect")
246
+ .attr("id", function(d) { return d.data.id; })
247
+ .attr("fill", function(d) { return color(d.depth); })
248
+ .attr("rx", 8)
249
+ .attr("ry", 8);
250
+
251
+ cellEnter.append("text")
252
+ .attr("class", "label")
253
+ .style("fill", "white")
254
+ .on("click", function(event, d) {
255
+ window.open('https://texonom.com/' + d.data.id, '_blank');
256
+ event.stopPropagation();
257
+ });
258
+
259
+ cellEnter.append("text")
260
+ .attr("class", "count")
261
+ .style("fill", "lightgray")
262
+ .style("font-size", "0.8rem");
263
+
264
+ cell = cellEnter.merge(cell);
265
+
266
+ cell.transition(t)
267
+ .attr("transform", function(d) { return "translate(" + x(d.x0) + "," + y(d.y0) + ")"; });
268
+
269
+ cell.select("rect").transition(t)
270
+ .attr("width", function(d) { return x(d.x1) - x(d.x0); })
271
+ .attr("height", function(d) { return y(d.y1) - y(d.y0); });
272
+
273
+ cell.select(".label").transition(t)
274
+ .attr("x", function(d) { return (x(d.x1) - x(d.x0)) / 2; })
275
+ .attr("y", function(d) { return (y(d.y1) - y(d.y0)) / 2; })
276
+ .text(function(d) { return d.data.name; })
277
+ .style("font-size", function(d) {
278
+ var boxArea = (x(d.x1) - x(d.x0)) * (y(d.y1) - y(d.y0));
279
+ var size = Math.max(10, Math.min(30, Math.sqrt(boxArea) / 5));
280
+ return size + "px";
281
+ });
282
+
283
+ cell.select(".count").transition(t)
284
+ .attr("x", function(d) { return (x(d.x1) - x(d.x0)) / 2; })
285
+ .attr("y", function(d) { return (y(d.y1) - y(d.y0)) / 2 + 20; })
286
+ .text(function(d) { return d.data.value; });
287
+ }
288
+
289
+ function findNodeById(node, id) {
290
+ if (node.data.id === id) {
291
+ return node;
292
+ }
293
+ if (node.children) {
294
+ for (var child of node.children) {
295
+ var result = findNodeById(child, id);
296
+ if (result) return result;
297
+ }
298
+ }
299
+ return null;
300
+ }
301
+ </script>
302
+ </body>
303
+ </html>
304
+ `;await ge(e,o,"utf8")}function te(c){let t=0,e=0,o=0;function r(a,i){if(t+=a.pages||0,e+=a.blocks||0,i>o&&(o=i),a.children)for(let n of a.children)r(n,i+1)}return r(c,1),{totalPages:t,totalBlocks:e,maxDepth:o}}async function oe(c,t){await(await import("fs/promises")).writeFile(c,JSON.stringify(t,null,2),"utf8")}var C=class extends be{constructor(){super(...arguments);this.folder=$.String("-o,--output","texonom-raw",{description:"Target root folder to export folder"});this.md=$.String("-m,--md","texonom-md",{description:"Target folder to export markdown"});this.domain=$.String("-d,--domain","https://texonom.com",{description:"Domain to fill in the link"});this.validation=$.Boolean("-v,--validation",{description:"Validation exported data only"});this.update=$.Boolean("-u,--update",{description:"Update exported data and resave to the --root"});this.page=$.String("-p,--page",{required:!0,description:"Target page to export"});this.recursive=$.Boolean("-r,--recursive",{description:"Recursively export children"});this.prefetch=$.Boolean("-f, --prefetch",{description:"Prefetch all space for faster export (recommended for exporting all pages in a space)"});this.load=$.Boolean("-l, --load",{description:"Load data from exported cache folder --root"});this.raw=$.Boolean("--raw",{description:`Export raw recordMap JSON data
305
+ Markdown format do not preserve all information`});this.dataset=$.Boolean("-d, --dataset",{description:"Export as dataset for LLM learning"});this.treemap=$.Boolean("--treemap",{description:"Generate HTML treemap after export"});this.stats=$.Boolean("--stats",{description:"Generate statistics JSON after export"});this.token=$.String("-t,--token",{description:"Notion Access Token"});this.wait=$.Counter("-w,--wait",{description:"Wait couter for missed collection view"})}async execute(){let e=new J({folder:this.folder,validation:this.validation,update:this.update,page:this.page,recursive:this.recursive,prefetch:this.prefetch,load:this.load,raw:this.raw,dataset:this.dataset,token:this.token});await e.execute(),(this.treemap||this.stats)&&(e.pageTree||await e.loadRaw());let o=e.pageTree;if(this.treemap&&o&&await ee(this.folder,o),this.stats&&o){let r=te(o);await oe(`${this.folder}/stats.json`,r)}}};C.paths=[["export"]];var z=new ae({binaryName:"notion",binaryLabel:H,binaryVersion:W});z.register(C);z.register(re.HelpCommand);z.register(re.VersionCommand);z.runExit(process.argv.slice(2),ae.defaultContext);export{C as NotionExportCommand,J as NotionExporter,te as computeStats,ee as generateTreemaps,A as getBlockLink,Ee as loadJson,pe as loadRaw,oe as writeStats};
19
306
  //# sourceMappingURL=main.js.map