@texonom/nutils 1.5.1 → 1.5.3

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/index.js CHANGED
@@ -13,34 +13,34 @@ var F = (e, t, c) => t in e ? J(e, t, { enumerable: !0, configurable: !0, writab
13
13
  var L = (e, t, c) => new Promise((o, n) => {
14
14
  var s = (a) => {
15
15
  try {
16
- l(c.next(a));
16
+ i(c.next(a));
17
17
  } catch (f) {
18
18
  n(f);
19
19
  }
20
- }, i = (a) => {
20
+ }, l = (a) => {
21
21
  try {
22
- l(c.throw(a));
22
+ i(c.throw(a));
23
23
  } catch (f) {
24
24
  n(f);
25
25
  }
26
- }, l = (a) => a.done ? o(a.value) : Promise.resolve(a.value).then(s, i);
27
- l((c = c.apply(e, t)).next());
26
+ }, i = (a) => a.done ? o(a.value) : Promise.resolve(a.value).then(s, l);
27
+ i((c = c.apply(e, t)).next());
28
28
  });
29
29
  import K from "is-url-superb";
30
30
  import { default as qe } from "is-url-superb";
31
31
  import M from "mem";
32
32
  import ee from "normalize-url";
33
- const S = (e) => {
33
+ const W = (e) => {
34
34
  var t;
35
35
  return e ? Array.isArray(e) ? (t = e == null ? void 0 : e.reduce((c, o) => c + (o[0] !== "⁍" && o[0] !== "‣" ? o[0] : ""), "")) != null ? t : "" : e : "";
36
36
  };
37
37
  function V(e, t) {
38
- var n, s, i, l, a, f, r;
38
+ var n, s, l, i, a, f, r;
39
39
  const c = e.collection_id || ((s = (n = e.format) == null ? void 0 : n.collection_pointer) == null ? void 0 : s.id);
40
40
  if (c) return c;
41
- const o = (i = e == null ? void 0 : e.view_ids) == null ? void 0 : i[0];
41
+ const o = (l = e == null ? void 0 : e.view_ids) == null ? void 0 : l[0];
42
42
  if (o) {
43
- const m = (a = (l = t.collection_view) == null ? void 0 : l[o]) == null ? void 0 : a.value;
43
+ const m = (a = (i = t.collection_view) == null ? void 0 : i[o]) == null ? void 0 : a.value;
44
44
  if (m)
45
45
  return (r = (f = m.format) == null ? void 0 : f.collection_pointer) == null ? void 0 : r.id;
46
46
  }
@@ -48,12 +48,12 @@ function V(e, t) {
48
48
  }
49
49
  function C(e, t) {
50
50
  var c, o;
51
- if ((c = e.properties) != null && c.title) return S(e.properties.title);
51
+ if ((c = e.properties) != null && c.title) return W(e.properties.title);
52
52
  if (e.type === "collection_view_page" || e.type === "collection_view") {
53
53
  const n = V(e, t);
54
54
  if (n) {
55
55
  const s = (o = t.collection[n]) == null ? void 0 : o.value;
56
- if (s) return S(s.name);
56
+ if (s) return W(s.name);
57
57
  }
58
58
  }
59
59
  return "";
@@ -64,8 +64,8 @@ function H(e, t) {
64
64
  if (e.type === "collection_view_page" || e.type === "collection_view") {
65
65
  const s = V(e, t);
66
66
  if (s) {
67
- const i = (n = t.collection[s]) == null ? void 0 : n.value;
68
- if (i) return i.icon;
67
+ const l = (n = t.collection[s]) == null ? void 0 : n.value;
68
+ if (l) return l.icon;
69
69
  }
70
70
  }
71
71
  return null;
@@ -82,28 +82,28 @@ function te(e, t, c) {
82
82
  return null;
83
83
  const n = (o = c.collection[t.parent_id]) == null ? void 0 : o.value;
84
84
  if (n) {
85
- const s = e.toLowerCase(), i = Object.keys(n.schema).find(
85
+ const s = e.toLowerCase(), l = Object.keys(n.schema).find(
86
86
  (f) => {
87
87
  var r, m;
88
88
  return ((m = (r = n.schema[f]) == null ? void 0 : r.name) == null ? void 0 : m.toLowerCase()) === s;
89
89
  }
90
90
  );
91
- if (!i) return null;
92
- const { type: l } = n.schema[i], a = S(t.properties[i]);
93
- switch (l) {
91
+ if (!l) return null;
92
+ const { type: i } = n.schema[l], a = W(t.properties[l]);
93
+ switch (i) {
94
94
  case "created_time":
95
95
  return t.created_time;
96
96
  case "multi_select":
97
97
  return a.split(",");
98
98
  case "date": {
99
- const r = t.properties[i][0][1][0][1];
99
+ const r = t.properties[l][0][1][0][1];
100
100
  if (r.type == "datetime")
101
101
  return (/* @__PURE__ */ new Date(`${r.start_date} ${r.start_time}`)).getTime();
102
102
  if (r.type == "date")
103
103
  return new Date(r.start_date).getTime();
104
104
  if (r.type == "datetimerange") {
105
- const { start_date: m, start_time: b, end_date: $, end_time: v } = r, _ = (/* @__PURE__ */ new Date(`${m} ${b}`)).getTime(), k = (/* @__PURE__ */ new Date(`${$} ${v}`)).getTime();
106
- return [_, k];
105
+ const { start_date: m, start_time: b, end_date: $, end_time: v } = r, _ = (/* @__PURE__ */ new Date(`${m} ${b}`)).getTime(), h = (/* @__PURE__ */ new Date(`${$} ${v}`)).getTime();
106
+ return [_, h];
107
107
  } else {
108
108
  const m = new Date(r.start_date).getTime(), b = new Date(r.end_date).getTime();
109
109
  return [m, b];
@@ -137,17 +137,17 @@ const ne = (e) => {
137
137
  let o = e;
138
138
  for (; o != null; ) {
139
139
  if (c && (o == null ? void 0 : o.type) === "page") return o;
140
- const i = o.parent_id, l = o.parent_table;
141
- if (!i) break;
142
- if (l === "collection")
143
- o = (n = t.collection[i]) == null ? void 0 : n.value;
144
- else if (o = (s = t.block[i]) == null ? void 0 : s.value, (o == null ? void 0 : o.type) === "page") return o;
140
+ const l = o.parent_id, i = o.parent_table;
141
+ if (!l) break;
142
+ if (i === "collection")
143
+ o = (n = t.collection[l]) == null ? void 0 : n.value;
144
+ else if (o = (s = t.block[l]) == null ? void 0 : s.value, (o == null ? void 0 : o.type) === "page") return o;
145
145
  }
146
146
  return null;
147
147
  }, ye = (e, t, {
148
148
  inclusive: c = !1
149
149
  } = {}) => {
150
- var n, s, i, l;
150
+ var n, s, l, i;
151
151
  let o = e;
152
152
  for (; o != null; ) {
153
153
  if (c && (o == null ? void 0 : o.type) === "page") return o;
@@ -156,8 +156,8 @@ const ne = (e) => {
156
156
  if (f === "collection")
157
157
  return (n = t.collection[a]) == null ? void 0 : n.value;
158
158
  if (f === "space")
159
- return (i = (s = t.space) == null ? void 0 : s[a]) == null ? void 0 : i.value;
160
- if (o = (l = t.block[a]) == null ? void 0 : l.value, (o == null ? void 0 : o.type) === "page") return o;
159
+ return (l = (s = t.space) == null ? void 0 : s[a]) == null ? void 0 : l.value;
160
+ if (o = (i = t.block[a]) == null ? void 0 : i.value, (o == null ? void 0 : o.type) === "page") return o;
161
161
  }
162
162
  return null;
163
163
  }, ce = {
@@ -167,15 +167,15 @@ const ne = (e) => {
167
167
  }, se = (e, t) => {
168
168
  var n;
169
169
  const c = ((n = e.content) != null ? n : []).map((s) => {
170
- var l, a;
171
- const i = (l = t.block[s]) == null ? void 0 : l.value;
172
- if (i) {
173
- const { type: f } = i;
170
+ var i, a;
171
+ const l = (i = t.block[s]) == null ? void 0 : i.value;
172
+ if (l) {
173
+ const { type: f } = l;
174
174
  if (f === "header" || f === "sub_header" || f === "sub_sub_header")
175
175
  return {
176
176
  id: s,
177
177
  type: f,
178
- text: S((a = i.properties) == null ? void 0 : a.title),
178
+ text: W((a = l.properties) == null ? void 0 : a.title),
179
179
  indentLevel: ce[f]
180
180
  };
181
181
  }
@@ -187,15 +187,15 @@ const ne = (e) => {
187
187
  }
188
188
  ];
189
189
  for (const s of c) {
190
- const { indentLevel: i } = s, l = i;
190
+ const { indentLevel: l } = s, i = l;
191
191
  do {
192
192
  const a = o[o.length - 1], { actual: f, effective: r } = a;
193
- if (l > f)
193
+ if (i > f)
194
194
  s.indentLevel = r + 1, o.push({
195
- actual: l,
195
+ actual: i,
196
196
  effective: s.indentLevel
197
197
  });
198
- else if (l === f) {
198
+ else if (i === f) {
199
199
  s.indentLevel = r;
200
200
  break;
201
201
  } else
@@ -205,52 +205,52 @@ const ne = (e) => {
205
205
  return c;
206
206
  }, D = (e, t, c = !1) => {
207
207
  const o = t || Object.keys(e.block)[0], n = /* @__PURE__ */ new Set();
208
- function s(i) {
208
+ function s(l) {
209
209
  var b, $;
210
- if (n.has(i)) return;
211
- n.add(i);
212
- const l = (b = e.block[i]) == null ? void 0 : b.value;
213
- if (!l) return;
214
- const { content: a, type: f, properties: r, format: m } = l;
210
+ if (n.has(l)) return;
211
+ n.add(l);
212
+ const i = (b = e.block[l]) == null ? void 0 : b.value;
213
+ if (!i) return;
214
+ const { content: a, type: f, properties: r, format: m } = i;
215
215
  if (r)
216
216
  for (const v of Object.keys(r)) {
217
217
  const _ = r[v];
218
- _.map((k) => {
218
+ _.map((h) => {
219
219
  var I, w;
220
- const h = (w = (I = k == null ? void 0 : k[0]) == null ? void 0 : I[1]) == null ? void 0 : w[0];
221
- (h == null ? void 0 : h[0]) === "p" && h[1] && s(h[1]);
222
- }), _.map((k) => {
220
+ const k = (w = (I = h == null ? void 0 : h[0]) == null ? void 0 : I[1]) == null ? void 0 : w[0];
221
+ (k == null ? void 0 : k[0]) === "p" && k[1] && s(k[1]);
222
+ }), _.map((h) => {
223
223
  var I;
224
- const h = (I = k == null ? void 0 : k[1]) == null ? void 0 : I[0];
225
- ((h == null ? void 0 : h[0]) === "p" || (h == null ? void 0 : h[0]) === "eoi") && h[1] && s(h[1]);
224
+ const k = (I = h == null ? void 0 : h[1]) == null ? void 0 : I[0];
225
+ ((k == null ? void 0 : k[0]) === "p" || (k == null ? void 0 : k[0]) === "eoi") && k[1] && s(k[1]);
226
226
  });
227
227
  }
228
228
  if (m) {
229
229
  const v = ($ = m.transclusion_reference_pointer) == null ? void 0 : $.id;
230
230
  v && s(v);
231
231
  }
232
- if (!(!a || !Array.isArray(a)) && !(i !== o && !c && (f === "page" || f === "collection_view_page")))
232
+ if (!(!a || !Array.isArray(a)) && !(l !== o && !c && (f === "page" || f === "collection_view_page")))
233
233
  for (const v of a) s(v);
234
234
  }
235
235
  return s(o), Array.from(n);
236
236
  }, we = (e, t) => {
237
- var i;
238
- const c = t || Object.keys(e.block)[0], o = /* @__PURE__ */ new Set(), n = (i = e.block[c]) == null ? void 0 : i.value;
237
+ var l;
238
+ const c = t || Object.keys(e.block)[0], o = /* @__PURE__ */ new Set(), n = (l = e.block[c]) == null ? void 0 : l.value;
239
239
  n != null && n.created_by_id && o.add(n == null ? void 0 : n.created_by_id), n != null && n.last_edited_by_id && o.add(n == null ? void 0 : n.last_edited_by_id);
240
240
  const { properties: s } = n;
241
241
  if (s)
242
- for (const l of Object.keys(s))
243
- s[l].map((f) => {
242
+ for (const i of Object.keys(s))
243
+ s[i].map((f) => {
244
244
  var m;
245
245
  const r = (m = f == null ? void 0 : f[1]) == null ? void 0 : m[0];
246
246
  (r == null ? void 0 : r[0]) === "u" && r[1] && o.add(r[1]);
247
247
  });
248
248
  return Array.from(o);
249
- }, le = (e = "") => `${e.substr(0, 8)}-${e.substr(8, 4)}-${e.substr(12, 4)}-${e.substr(16, 4)}-${e.substr(20)}`, ie = /\b([a-f0-9]{32})\b/, ae = /\b([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})\b/, Ie = (e = "", { uuid: t = !0 } = {}) => {
249
+ }, ie = (e = "") => `${e.substr(0, 8)}-${e.substr(8, 4)}-${e.substr(12, 4)}-${e.substr(16, 4)}-${e.substr(20)}`, le = /\b([a-f0-9]{32})\b/, ae = /\b([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})\b/, Ie = (e = "", { uuid: t = !0 } = {}) => {
250
250
  if (!e) return null;
251
251
  e = e.split("?")[0];
252
- const c = e.match(ie);
253
- if (c) return t ? le(c[1]) : c[1];
252
+ const c = e.match(le);
253
+ if (c) return t ? ie(c[1]) : c[1];
254
254
  const o = e.match(ae);
255
255
  return o ? t ? o[1] : o[1].replace(/-/g, "") : null;
256
256
  }, re = (e) => e.replace(/-/g, "");
@@ -268,47 +268,47 @@ function $e(r, m, b, $) {
268
268
  return L(this, arguments, function* (e, t, c, o, {
269
269
  startRecordMap: n,
270
270
  fetchOption: s = { timeout: 1e5 },
271
- maxPage: i,
272
- debug: l,
271
+ maxPage: l,
272
+ debug: i,
273
273
  concurrency: a = 100,
274
274
  collectionConcurrency: f = 100
275
275
  } = {}) {
276
276
  var O;
277
277
  const v = {}, _ = n || (yield t(e, { fetchOption: s }));
278
- let k = JSON.parse(JSON.stringify(_));
279
- l && console.time("Total fetch time");
280
- let h = 1;
278
+ let h = JSON.parse(JSON.stringify(_));
279
+ i && console.time("Total fetch time");
280
+ let k = 1;
281
281
  for (; ; ) {
282
- l && console.debug(`Iteration ${h}`), l && console.debug("block length ", Object.keys(_.block).length), l && console.time("getPageContentBlockIds");
283
- const T = Object.keys(k.block), B = Object.keys(
282
+ i && console.debug(`Iteration ${k}`), i && console.debug("block length ", Object.keys(_.block).length), i && console.time("getPageContentBlockIds");
283
+ const T = Object.keys(h.block), B = Object.keys(
284
284
  T.reduce((u, g) => {
285
285
  const y = D(_, g, !0);
286
- for (const U of y) _.block[U] || (u[U] = !0);
286
+ for (const P of y) _.block[P] || (u[P] = !0);
287
287
  return u;
288
288
  }, {})
289
289
  );
290
- for (const { value: u } of Object.values(k.block))
290
+ for (const { value: u } of Object.values(h.block))
291
291
  u && !_.block[u.parent_id] && u.parent_table === "block" && B.push(u.parent_id);
292
- if (l && console.timeEnd("getPageContentBlockIds"), l && console.time("getBlocks"), k = (yield c(B, s)).recordMap, l && console.timeEnd("getBlocks"), !(k != null && k.block)) break;
293
- l && console.time("mapBlocks");
294
- const W = Object.values(_.block).map((u) => {
292
+ if (i && console.timeEnd("getPageContentBlockIds"), i && console.time("getBlocks"), h = (yield c(B, s)).recordMap, i && console.timeEnd("getBlocks"), !(h != null && h.block)) break;
293
+ i && console.time("mapBlocks");
294
+ const S = Object.values(_.block).map((u) => {
295
295
  var g;
296
296
  return (g = u.value) == null ? void 0 : g.id;
297
297
  }).filter(Boolean);
298
- _.block = d(d({}, _.block), k.block), l && console.timeEnd("mapBlocks"), l && console.time("fetchCollections"), yield o(W, _, void 0, { fetchOption: s, concurrency: a, collectionConcurrency: f }), l && console.timeEnd("fetchCollections"), l && console.debug("collection query length " + Object.keys(_.collection_query).length), l && console.debug("new block length ", Object.keys(k.block).length);
298
+ _.block = d(d({}, _.block), h.block), i && console.timeEnd("mapBlocks"), i && console.time("fetchCollections"), yield o(S, _, void 0, { fetchOption: s, concurrency: a, collectionConcurrency: f }), i && console.timeEnd("fetchCollections"), i && console.debug("collection query length " + Object.keys(_.collection_query).length), i && console.debug("new block length ", Object.keys(h.block).length);
299
299
  const p = Object.values(_.block).map((u) => {
300
300
  var g;
301
301
  return (g = u.value) == null ? void 0 : g.type;
302
302
  }).filter((u) => u === "page").length;
303
- if (l && console.debug("page length ", p), Number.isInteger(i) && p >= i) break;
304
- l && console.debug(`memory usage ${process.memoryUsage().rss / 1024 / 1024}MB`), h += 1, l && console.debug();
303
+ if (i && console.debug("page length ", p), Number.isInteger(l) && p >= l) break;
304
+ i && console.debug(`memory usage ${process.memoryUsage().rss / 1024 / 1024}MB`), k += 1, i && console.debug();
305
305
  }
306
- l && console.timeEnd("Total fetch time"), l && console.time("get page map"), l && console.debug("Total block length ", Object.keys(_.block).length);
306
+ i && console.timeEnd("Total fetch time"), i && console.time("get page map"), i && console.debug("Total block length ", Object.keys(_.block).length);
307
307
  const I = Object.keys(_.block), w = [];
308
308
  for (const T of I)
309
309
  ((O = _.block[T].value) == null ? void 0 : O.type) === "page" && (w.push(ue(T, _, c).then((B) => v[T] = B)), yield fe(1));
310
- yield Promise.all(w), l && console.timeEnd("get page map"), l && console.debug("Total page length ", Object.keys(v).length), l && console.time("get page tree");
311
- const P = {
310
+ yield Promise.all(w), i && console.timeEnd("get page map"), i && console.debug("Total page length ", Object.keys(v).length), i && console.time("get page tree");
311
+ const U = {
312
312
  id: e,
313
313
  title: C(_.block[e].value, _),
314
314
  blocks: 1,
@@ -316,11 +316,11 @@ function $e(r, m, b, $) {
316
316
  children: [],
317
317
  type: "page"
318
318
  };
319
- return A(_, P), l && console.timeEnd("get page tree"), { pageMap: v, pageTree: P, recordMap: _ };
319
+ return A(_, U), i && console.timeEnd("get page tree"), { pageMap: v, pageTree: U, recordMap: _ };
320
320
  });
321
321
  }
322
322
  function A(e, t) {
323
- var s, i, l, a;
323
+ var s, l, i, a;
324
324
  const c = [t];
325
325
  let o = t;
326
326
  for (; o.parent; )
@@ -328,10 +328,10 @@ function A(e, t) {
328
328
  const n = (s = e.block[t.id]) == null ? void 0 : s.value;
329
329
  if (!n)
330
330
  return console.warn(`No block value for ${t.id}`), delete t.parent, t;
331
- if ((i = n.content) != null && i.length) {
331
+ if ((l = n.content) != null && l.length) {
332
332
  for (const f of c) f.blocks += n.content.length;
333
333
  for (const f of n.content) {
334
- const r = (l = e.block[f]) == null ? void 0 : l.value;
334
+ const r = (i = e.block[f]) == null ? void 0 : i.value;
335
335
  if (r && (t.children.push(
336
336
  A(e, {
337
337
  id: f,
@@ -372,9 +372,9 @@ function A(e, t) {
372
372
  }
373
373
  function ue(e, t, c) {
374
374
  return L(this, null, function* () {
375
- var r, m, b, $, v, _, k, h, I, w, P, O, T, B, W;
375
+ var r, m, b, $, v, _, h, k, I, w, U, O, T, B, S;
376
376
  let o = D(t, e), n = { [e]: { value: t.block[e].value, role: "reader" } };
377
- const s = {}, i = {}, l = {}, a = [];
377
+ const s = {}, l = {}, i = {}, a = [];
378
378
  for (const p of o) {
379
379
  const u = (r = t.block[p]) == null ? void 0 : r.value;
380
380
  if (!u) {
@@ -382,15 +382,15 @@ function ue(e, t, c) {
382
382
  continue;
383
383
  }
384
384
  if (n[p] = { value: u, role: "reader" }, u.type === "collection_view" || u.type === "collection_view_page") {
385
- t.collection[u.collection_id] && (s[u.collection_id] = t.collection[u.collection_id]), t.collection_query[u.collection_id] && (l[u.collection_id] = t.collection_query[u.collection_id]);
385
+ t.collection[u.collection_id] && (s[u.collection_id] = t.collection[u.collection_id]), t.collection_query[u.collection_id] && (i[u.collection_id] = t.collection_query[u.collection_id]);
386
386
  for (const g of u.view_ids)
387
387
  if (t.collection_view[g]) {
388
- i[g] = t.collection_view[g];
388
+ l[g] = t.collection_view[g];
389
389
  const y = ($ = (b = (m = t.collection_query[u == null ? void 0 : u.collection_id]) == null ? void 0 : m[g]) == null ? void 0 : b.collection_group_results) == null ? void 0 : $.blockIds;
390
390
  if (y != null && y.length)
391
- for (const U of y) {
392
- const j = (v = t.block[U]) == null ? void 0 : v.value;
393
- j ? n[U] = { value: j, role: "reader" } : a.push(U);
391
+ for (const P of y) {
392
+ const j = (v = t.block[P]) == null ? void 0 : v.value;
393
+ j ? n[P] = { value: j, role: "reader" } : a.push(P);
394
394
  }
395
395
  }
396
396
  }
@@ -399,7 +399,7 @@ function ue(e, t, c) {
399
399
  for (const p of f) {
400
400
  const u = (_ = t.block[p]) == null ? void 0 : _.value;
401
401
  u && (n[p] = { value: u, role: "reader" });
402
- const g = (k = t.collection[p]) == null ? void 0 : k.value;
402
+ const g = (h = t.collection[p]) == null ? void 0 : h.value;
403
403
  g && (s[p] = { value: g });
404
404
  }
405
405
  for (const p of Object.keys(n)) {
@@ -407,7 +407,7 @@ function ue(e, t, c) {
407
407
  let g = u;
408
408
  if ((u == null ? void 0 : u.type) === "alias")
409
409
  for (; ; ) {
410
- const y = (I = (h = g == null ? void 0 : g.format) == null ? void 0 : h.alias_pointer) == null ? void 0 : I.id;
410
+ const y = (I = (k = g == null ? void 0 : g.format) == null ? void 0 : k.alias_pointer) == null ? void 0 : I.id;
411
411
  if (!y) break;
412
412
  g = (w = t.block[y]) == null ? void 0 : w.value, g ? n[y] = { value: g, role: "reader" } : a.push(y);
413
413
  }
@@ -422,17 +422,17 @@ function ue(e, t, c) {
422
422
  }
423
423
  o = D(t, e);
424
424
  for (const p of o) {
425
- const u = (P = t.block[p]) == null ? void 0 : P.value;
425
+ const u = (U = t.block[p]) == null ? void 0 : U.value;
426
426
  if (u && (n[p] = { value: u, role: "reader" }, u.type === "collection_view" || u.type === "collection_view_page")) {
427
- t.collection[u.collection_id] && (s[u.collection_id] = t.collection[u.collection_id]), t.collection_query[u.collection_id] && (l[u.collection_id] = t.collection_query[u.collection_id]);
427
+ t.collection[u.collection_id] && (s[u.collection_id] = t.collection[u.collection_id]), t.collection_query[u.collection_id] && (i[u.collection_id] = t.collection_query[u.collection_id]);
428
428
  for (const g of u.view_ids)
429
429
  if (t.collection_view[g]) {
430
- i[g] = t.collection_view[g];
430
+ l[g] = t.collection_view[g];
431
431
  const y = (B = (T = (O = t.collection_query[u == null ? void 0 : u.collection_id]) == null ? void 0 : O[g]) == null ? void 0 : T.collection_group_results) == null ? void 0 : B.blockIds;
432
432
  if (y != null && y.length)
433
- for (const U of y) {
434
- const j = (W = t.block[U]) == null ? void 0 : W.value;
435
- j && (n[U] = { value: j, role: "reader" });
433
+ for (const P of y) {
434
+ const j = (S = t.block[P]) == null ? void 0 : S.value;
435
+ j && (n[P] = { value: j, role: "reader" });
436
436
  }
437
437
  }
438
438
  }
@@ -440,8 +440,8 @@ function ue(e, t, c) {
440
440
  return {
441
441
  block: n,
442
442
  collection: s,
443
- collection_view: i,
444
- collection_query: l,
443
+ collection_view: l,
444
+ collection_query: i,
445
445
  signed_urls: {},
446
446
  notion_user: {}
447
447
  };
@@ -449,40 +449,40 @@ function ue(e, t, c) {
449
449
  }
450
450
  const fe = (e) => L(null, null, function* () {
451
451
  return new Promise((t) => setTimeout(t, e));
452
- }), N = (e) => (e || "").replace(/( |\/)/g, "-").replace(/[^a-zA-Z0-9-\u4e00-\u9FFF\uAC00-\uD7AF\u3130-\u318F\u3041-\u3096\u30A1-\u30FC\u3000-\u303F]/g, "").replace(/--+/g, "-").replace(/^-+|-+$/g, "").trim().toLowerCase(), Pe = (e, t, { uuid: c = !0 } = {}) => {
453
- var s, i;
452
+ }), N = (e) => (e || "").replace(/( |\/)/g, "-").replace(/[^a-zA-Z0-9-\u4e00-\u9FFF\uAC00-\uD7AF\u3130-\u318F\u3041-\u3096\u30A1-\u30FC\u3000-\u303F]/g, "").replace(/--+/g, "-").replace(/^-+|-+$/g, "").trim().toLowerCase(), Ue = (e, t, { uuid: c = !0 } = {}) => {
453
+ var s, l;
454
454
  if (!e || !t) return null;
455
455
  const o = re(e), n = (s = t.block[e]) == null ? void 0 : s.value;
456
456
  if (n) {
457
- const l = te("slug", n, t) || N(C(n, t));
458
- if (l)
459
- return c ? `${l}-${o}` : l;
457
+ const i = te("slug", n, t) || N(C(n, t));
458
+ if (i)
459
+ return c ? `${i}-${o}` : i;
460
460
  } else {
461
- const l = (i = t.collection[e]) == null ? void 0 : i.value;
462
- if (l) {
463
- const a = N(S(l.name));
461
+ const i = (l = t.collection[e]) == null ? void 0 : l.value;
462
+ if (i) {
463
+ const a = N(W(i.name));
464
464
  if (a)
465
465
  return c ? `${a}-${o}` : a;
466
466
  }
467
467
  }
468
468
  return o;
469
- }, Ue = (e, t) => {
469
+ }, Pe = (e, t) => {
470
470
  var s;
471
471
  const c = e.block, o = [];
472
472
  let n = t;
473
473
  do {
474
- const i = (s = c[n]) == null ? void 0 : s.value;
475
- if (!i) break;
476
- const l = C(i, e), a = H(i, e);
477
- if (!(l || a)) break;
474
+ const l = (s = c[n]) == null ? void 0 : s.value;
475
+ if (!l) break;
476
+ const i = C(l, e), a = H(l, e);
477
+ if (!(i || a)) break;
478
478
  o.push({
479
- block: i,
479
+ block: l,
480
480
  active: n === t,
481
481
  pageId: n,
482
- title: l,
482
+ title: i,
483
483
  icon: a
484
484
  });
485
- const f = oe(i, e), r = f == null ? void 0 : f.id;
485
+ const f = oe(l, e), r = f == null ? void 0 : f.id;
486
486
  if (!r) break;
487
487
  n = r;
488
488
  } while (!0);
@@ -491,44 +491,44 @@ const fe = (e) => L(null, null, function* () {
491
491
  mapImageUrl: t
492
492
  }) => {
493
493
  const o = Object.keys(e.block).flatMap((n) => {
494
- var l, a, f, r, m, b, $, v, _, k, h;
495
- const s = (l = e.block[n]) == null ? void 0 : l.value, i = [];
494
+ var i, a, f, r, m, b, $, v, _, h, k;
495
+ const s = (i = e.block[n]) == null ? void 0 : i.value, l = [];
496
496
  if (s) {
497
497
  if (s.type === "image") {
498
- let P = ((a = e.signed_urls) == null ? void 0 : a[s.id]) || ((m = (r = (f = s.properties) == null ? void 0 : f.source) == null ? void 0 : r[0]) == null ? void 0 : m[0]);
499
- P.includes("file.notion.so") && (P = (v = ($ = (b = s.properties) == null ? void 0 : b.source) == null ? void 0 : $[0]) == null ? void 0 : v[0]), P && i.push({
498
+ let U = ((a = e.signed_urls) == null ? void 0 : a[s.id]) || ((m = (r = (f = s.properties) == null ? void 0 : f.source) == null ? void 0 : r[0]) == null ? void 0 : m[0]);
499
+ U.includes("file.notion.so") && (U = (v = ($ = (b = s.properties) == null ? void 0 : b.source) == null ? void 0 : $[0]) == null ? void 0 : v[0]), U && l.push({
500
500
  block: s,
501
- url: P
501
+ url: U
502
502
  });
503
503
  }
504
504
  if ((_ = s.format) != null && _.page_cover) {
505
505
  const w = s.format.page_cover;
506
- i.push({
506
+ l.push({
507
507
  block: s,
508
508
  url: w
509
509
  });
510
510
  }
511
- if ((k = s.format) != null && k.bookmark_cover) {
511
+ if ((h = s.format) != null && h.bookmark_cover) {
512
512
  const w = s.format.bookmark_cover;
513
- i.push({
513
+ l.push({
514
514
  block: s,
515
515
  url: w
516
516
  });
517
517
  }
518
- if ((h = s.format) != null && h.bookmark_icon) {
518
+ if ((k = s.format) != null && k.bookmark_icon) {
519
519
  const w = s.format.bookmark_icon;
520
- i.push({
520
+ l.push({
521
521
  block: s,
522
522
  url: w
523
523
  });
524
524
  }
525
525
  const I = H(s, e);
526
- I && K(I) && i.push({
526
+ I && K(I) && l.push({
527
527
  block: s,
528
528
  url: I
529
529
  });
530
530
  }
531
- return i;
531
+ return l;
532
532
  }).filter(Boolean).map(({ block: n, url: s }) => t(s, n)).filter(Boolean);
533
533
  return Array.from(new Set(o));
534
534
  }, me = M((e) => {
@@ -568,10 +568,10 @@ const _e = (e, { month: t = "short" } = {}) => {
568
568
  return _e(t);
569
569
  };
570
570
  function ge(e, t, { wordsPerMinute: c = 275, imageReadTimeInSeconds: o = 12 } = {}) {
571
- const n = z(e, t), s = n.numWords / c, l = (n.numImages > 10 ? n.numImages / 2 * (o + 3) + (n.numImages - 10) * 3 : n.numImages / 2 * (2 * o + (1 - n.numImages))) / 60, a = s + l;
571
+ const n = z(e, t), s = n.numWords / c, i = (n.numImages > 10 ? n.numImages / 2 * (o + 3) + (n.numImages - 10) * 3 : n.numImages / 2 * (2 * o + (1 - n.numImages))) / 60, a = s + i;
572
572
  return E(d({}, n), {
573
573
  totalWordsReadTimeInMinutes: s,
574
- totalImageReadTimeInMinutes: l,
574
+ totalImageReadTimeInMinutes: i,
575
575
  totalReadTimeInMinutes: a
576
576
  });
577
577
  }
@@ -580,14 +580,14 @@ function Oe(e, t, c) {
580
580
  return be(o.totalReadTimeInMinutes);
581
581
  }
582
582
  function z(e, t) {
583
- var o, n, s, i;
583
+ var o, n, s, l;
584
584
  const c = {
585
585
  numWords: 0,
586
586
  numImages: 0
587
587
  };
588
588
  if (!e) return c;
589
- for (const l of e.content || []) {
590
- const a = (o = t.block[l]) == null ? void 0 : o.value;
589
+ for (const i of e.content || []) {
590
+ const a = (o = t.block[i]) == null ? void 0 : o.value;
591
591
  let f = !1;
592
592
  if (a) {
593
593
  switch (a.type) {
@@ -676,7 +676,7 @@ function z(e, t) {
676
676
  case "transclusion_reference": {
677
677
  const r = (s = (n = a == null ? void 0 : a.format) == null ? void 0 : n.transclusion_reference_pointer) == null ? void 0 : s.id;
678
678
  if (!r) continue;
679
- const m = (i = t.block[r]) == null ? void 0 : i.value;
679
+ const m = (l = t.block[r]) == null ? void 0 : l.value;
680
680
  m && Q(c, z(m, t));
681
681
  break;
682
682
  }
@@ -698,6 +698,12 @@ function be(e) {
698
698
  const je = (e, t) => {
699
699
  if (!e) return null;
700
700
  if (e.startsWith("data:") || e.startsWith("https://images.unsplash.com")) return e;
701
+ try {
702
+ const n = new URL(e);
703
+ if ((n.protocol === "https:" || n.protocol === "http:") && !n.hostname.endsWith(".notion.so") && !n.hostname.endsWith(".amazonaws.com") && n.hostname !== "www.notion.so" && n.hostname !== "notion.so")
704
+ return e;
705
+ } catch (n) {
706
+ }
701
707
  try {
702
708
  const n = new URL(e);
703
709
  if (n.pathname.startsWith("/secure.notion-static.com") && n.hostname.endsWith(".amazonaws.com") && n.searchParams.has("X-Amz-Credential") && n.searchParams.has("X-Amz-Signature") && n.searchParams.has("X-Amz-Algorithm"))
@@ -708,10 +714,10 @@ const je = (e, t) => {
708
714
  const c = new URL(e);
709
715
  let o = t.parent_table === "space" ? "block" : t.parent_table;
710
716
  return (o === "collection" || o === "team") && (o = "block"), c.searchParams.set("table", o), c.searchParams.set("id", t.id), c.searchParams.set("cache", "v2"), e = c.toString(), e;
711
- }, Se = (e) => (t) => (t = (t || "").replace(/-/g, ""), e && t === e ? "/" : `/${t}`);
717
+ }, We = (e) => (t) => (t = (t || "").replace(/-/g, ""), e && t === e ? "/" : `/${t}`);
712
718
  export {
713
719
  je as defaultMapImageUrl,
714
- Se as defaultMapPageUrl,
720
+ We as defaultMapPageUrl,
715
721
  ge as estimatePageReadTime,
716
722
  Oe as estimatePageReadTimeAsHumanizedString,
717
723
  X as findAncestors,
@@ -723,9 +729,9 @@ export {
723
729
  ye as getBlockParent,
724
730
  oe as getBlockParentPage,
725
731
  C as getBlockTitle,
726
- Pe as getCanonicalPageId,
732
+ Ue as getCanonicalPageId,
727
733
  ne as getDateValue,
728
- Ue as getPageBreadcrumbs,
734
+ Pe as getPageBreadcrumbs,
729
735
  D as getPageContentBlockIds,
730
736
  we as getPageContentUserIds,
731
737
  Te as getPageImageUrls,
@@ -733,8 +739,8 @@ export {
733
739
  ue as getPageSync,
734
740
  se as getPageTableOfContents,
735
741
  ve as getPageTitle,
736
- S as getTextContent,
737
- le as idToUuid,
742
+ W as getTextContent,
743
+ ie as idToUuid,
738
744
  qe as isUrl,
739
745
  Ce as mergeRecordMaps,
740
746
  N as normalizeTitle,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/get-text-content.ts","../src/get-block-collection-id.ts","../src/get-block-title.ts","../src/get-block-icon.ts","../src/get-page-title.ts","../src/get-page-property.ts","../src/get-date-value.ts","../src/get-block-parent-page.ts","../src/get-page-table-of-contents.ts","../src/get-page-content-block-ids.ts","../src/id-to-uuid.ts","../src/parse-page-id.ts","../src/uuid-to-id.ts","../src/find-ancestors.ts","../src/get-all-in-space.ts","../src/normalize-title.ts","../src/get-canonical-page-id.ts","../src/get-page-breadcrumbs.ts","../src/get-page-image-urls.ts","../src/normalize-url.ts","../src/merge-record-maps.ts","../src/format-date.ts","../src/format-notion-date-time.ts","../src/estimate-page-read-time.ts","../src/map-image-url.ts","../src/map-page-url.ts"],"sourcesContent":["import type { Decoration } from '@texonom/ntypes'\n\n/**\n * Gets the raw, unformatted text content of a block's content value.\n *\n * This is useful, for instance, for extracting a block's `title` without any\n * rich text formatting.\n */\nexport const getTextContent = (text?: Decoration[]): string => {\n if (!text) return ''\n else if (Array.isArray(text))\n return text?.reduce((prev, current) => prev + (current[0] !== '⁍' && current[0] !== '‣' ? current[0] : ''), '') ?? ''\n else return text\n}\n","import type { Block, CollectionViewBlock, ExtendedRecordMap } from '@texonom/ntypes'\n\nexport function getBlockCollectionId(block: Block, recordMap: ExtendedRecordMap): string | null {\n const collectionId =\n (block as CollectionViewBlock).collection_id || (block as CollectionViewBlock).format?.collection_pointer?.id\n\n if (collectionId) return collectionId\n\n const collectionViewId = (block as CollectionViewBlock)?.view_ids?.[0]\n if (collectionViewId) {\n const collectionView = recordMap.collection_view?.[collectionViewId]?.value\n if (collectionView) {\n const collectionId = collectionView.format?.collection_pointer?.id\n return collectionId\n }\n }\n\n return null\n}\n","import { getBlockCollectionId } from './get-block-collection-id'\nimport { getTextContent } from './get-text-content'\n\nimport type { Block, ExtendedRecordMap } from '@texonom/ntypes'\n\nexport function getBlockTitle(block: Block, recordMap: ExtendedRecordMap) {\n if (block.properties?.title) return getTextContent(block.properties.title)\n\n if (block.type === 'collection_view_page' || block.type === 'collection_view') {\n const collectionId = getBlockCollectionId(block, recordMap)\n if (collectionId) {\n const collection = recordMap.collection[collectionId]?.value\n if (collection) return getTextContent(collection.name)\n }\n }\n return ''\n}\n","import { getBlockCollectionId } from './get-block-collection-id'\n\nimport type { Block, ExtendedRecordMap, PageBlock } from '@texonom/ntypes'\n\nexport function getBlockIcon(block: Block, recordMap: ExtendedRecordMap) {\n if ((block as PageBlock).format?.page_icon) return (block as PageBlock).format?.page_icon\n\n if (block.type === 'collection_view_page' || block.type === 'collection_view') {\n const collectionId = getBlockCollectionId(block, recordMap)\n if (collectionId) {\n const collection = recordMap.collection[collectionId]?.value\n\n if (collection) return collection.icon\n }\n }\n\n return null\n}\n","import type { ExtendedRecordMap } from '@texonom/ntypes'\n\nimport { getBlockTitle } from './get-block-title'\n\nexport function getPageTitle(recordMap: ExtendedRecordMap) {\n const pageBlock = recordMap.block[Object.keys(recordMap.block)[0]]?.value\n\n if (pageBlock) return getBlockTitle(pageBlock, recordMap)\n\n return null\n}\n","import { Block, DateFormat, ExtendedRecordMap } from '@texonom/ntypes'\n\nimport { getTextContent } from './get-text-content'\n\n/**\n * Gets the value of a collection property for a given page (collection item).\n *\n * @param propertyName property name\n * @param block Page block, often be first block in blockMap\n * @param recordMap\n * @returns - The return value types will follow the following principles:\n * 1. if property is date type, it will return `number` or `number[]`(depends on `End Date` switch)\n * 2. property is text-like will return `string`\n * 3. multi select property will return `string[]`\n * 4. checkbox property return `boolean`\n * @todo complete all no-text property type\n */\nexport function getPageProperty<T = string | number | boolean | string[] | number[]>(\n propertyName: string,\n block: Block,\n recordMap: ExtendedRecordMap\n): T\nexport function getPageProperty(propertyName: string, block: Block, recordMap: ExtendedRecordMap) {\n try {\n if (!block.properties || !Object.keys(recordMap.collection))\n // console.warn(\n // `block ${block.id} has no properties or this recordMap has no collection record`\n // )\n return null\n\n const collection = recordMap.collection[block.parent_id]?.value\n\n if (collection) {\n const propertyNameL = propertyName.toLowerCase()\n const propertyId = Object.keys(collection.schema).find(\n key => collection.schema[key]?.name?.toLowerCase() === propertyNameL\n )\n\n if (!propertyId) return null\n\n const { type } = collection.schema[propertyId]\n const content = getTextContent(block.properties[propertyId])\n\n switch (type) {\n case 'created_time':\n return block.created_time\n\n case 'multi_select':\n return content.split(',')\n\n case 'date': {\n const property = block.properties[propertyId] as [['‣', [DateFormat]]]\n const formatDate = property[0][1][0][1]\n\n if (formatDate.type == 'datetime') {\n return new Date(`${formatDate.start_date} ${formatDate.start_time}`).getTime()\n } else if (formatDate.type == 'date') {\n return new Date(formatDate.start_date).getTime()\n } else if (formatDate.type == 'datetimerange') {\n const { start_date, start_time, end_date, end_time } = formatDate\n const startTime = new Date(`${start_date} ${start_time}`).getTime()\n const endTime = new Date(`${end_date} ${end_time}`).getTime()\n return [startTime, endTime]\n } else {\n const startTime = new Date(formatDate.start_date).getTime()\n const endTime = new Date(formatDate.end_date).getTime()\n return [startTime, endTime]\n }\n }\n\n case 'checkbox':\n return content == 'Yes'\n\n case 'last_edited_time':\n return block.last_edited_time\n\n default:\n return content\n }\n }\n } catch {\n // ensure that no matter what, we don't throw errors because of an unexpected\n // collection data format\n }\n\n return null\n}\n","import type { FormattedDate } from '@texonom/ntypes'\n\n/**\n * Attempts to find a valid date from a given property.\n */\nexport const getDateValue = (prop: any[]): FormattedDate | null => {\n if (prop && Array.isArray(prop))\n if (prop[0] === 'd') return prop[1]\n else\n for (const v of prop) {\n const value = getDateValue(v)\n if (value) return value\n }\n\n return null\n}\n","import type { Block, ExtendedRecordMap, PageBlock, Collection, Space } from '@texonom/ntypes'\n\n/**\n * Returns the parent page block containing a given page.\n *\n * Note that many times this will not be the direct parent block since\n * some non-page content blocks can contain sub-blocks.\n */\nexport const getBlockParentPage = (\n block: Block,\n recordMap: ExtendedRecordMap,\n {\n inclusive = false\n }: {\n inclusive?: boolean\n } = {}\n): PageBlock | null => {\n let currentRecord: Block | Collection = block\n\n while (currentRecord != null) {\n if (inclusive && (currentRecord as Block)?.type === 'page') return currentRecord as PageBlock\n\n const parentId: string = currentRecord.parent_id\n const parentTable = currentRecord.parent_table\n\n if (!parentId) break\n\n if (parentTable === 'collection') {\n currentRecord = recordMap.collection[parentId]?.value\n } else {\n currentRecord = recordMap.block[parentId]?.value\n if ((currentRecord as Block)?.type === 'page') return currentRecord as PageBlock\n }\n }\n return null\n}\n\nexport const getBlockParent = (\n block: Block,\n recordMap: ExtendedRecordMap,\n {\n inclusive = false\n }: {\n inclusive?: boolean\n } = {}\n): PageBlock | Collection | Space => {\n let currentRecord: Block | Collection | Space = block\n\n while (currentRecord != null) {\n if (inclusive && (currentRecord as Block)?.type === 'page') return currentRecord as PageBlock\n\n const parentId: string = currentRecord.parent_id\n const parentTable = currentRecord.parent_table\n\n if (!parentId) break\n\n if (parentTable === 'collection') {\n return recordMap.collection[parentId]?.value\n } else if (parentTable === 'space') {\n return recordMap.space?.[parentId]?.value\n } else {\n currentRecord = recordMap.block[parentId]?.value\n if ((currentRecord as Block)?.type === 'page') return currentRecord as PageBlock\n }\n }\n return null\n}\n","import { getTextContent } from './get-text-content'\n\nimport type { ID, BlockType, PageBlock, ExtendedRecordMap } from '@texonom/ntypes'\n\nexport interface TableOfContentsEntry {\n id: ID\n type: BlockType\n text: string\n indentLevel: number\n}\n\nconst indentLevels = {\n header: 0,\n sub_header: 1,\n sub_sub_header: 2\n}\n\n/**\n * Gets the metadata for a table of contents block by parsing the page's\n * H1, H2, and H3 elements.\n */\nexport const getPageTableOfContents = (page: PageBlock, recordMap: ExtendedRecordMap): Array<TableOfContentsEntry> => {\n const toc = (page.content ?? [])\n .map((blockId: string) => {\n const block = recordMap.block[blockId]?.value\n\n if (block) {\n const { type } = block\n\n if (type === 'header' || type === 'sub_header' || type === 'sub_sub_header')\n return {\n id: blockId,\n type,\n text: getTextContent(block.properties?.title),\n indentLevel: indentLevels[type]\n }\n }\n\n return null\n })\n .filter(Boolean) as Array<TableOfContentsEntry>\n\n const indentLevelStack = [\n {\n actual: -1,\n effective: -1\n }\n ]\n\n // Adjust indent levels to always change smoothly.\n // This is a little tricky, but the key is that when increasing indent levels,\n // they should never jump more than one at a time.\n for (const tocItem of toc) {\n const { indentLevel } = tocItem\n const actual = indentLevel\n\n do {\n const prevIndent = indentLevelStack[indentLevelStack.length - 1]\n const { actual: prevActual, effective: prevEffective } = prevIndent\n\n if (actual > prevActual) {\n tocItem.indentLevel = prevEffective + 1\n indentLevelStack.push({\n actual,\n effective: tocItem.indentLevel\n })\n } else if (actual === prevActual) {\n tocItem.indentLevel = prevEffective\n break\n } else {\n indentLevelStack.pop()\n }\n\n // eslint-disable-next-line no-constant-condition\n } while (true)\n }\n\n return toc\n}\n","import type { ExtendedRecordMap, Decoration } from '@texonom/ntypes'\n\n/**\n * Gets the IDs of all blocks contained on a page starting from a root block ID.\n */\nexport const getPageContentBlockIds = (recordMap: ExtendedRecordMap, blockId?: string, locust = false): string[] => {\n const rootBlockId = blockId || Object.keys(recordMap.block)[0]\n const contentBlockIds = new Set<string>()\n\n function addContentBlocks(blockId: string) {\n if (contentBlockIds.has(blockId)) return\n contentBlockIds.add(blockId)\n\n const block = recordMap.block[blockId]?.value\n if (!block) return\n const { content, type, properties, format } = block\n if (properties)\n for (const key of Object.keys(properties)) {\n const p = properties[key]\n p.map((d: Decoration) => {\n const value = d?.[0]?.[1]?.[0]\n if (value?.[0] === 'p' && value[1]) addContentBlocks(value[1])\n })\n p.map((d: Decoration) => {\n const value = d?.[1]?.[0]\n if ((value?.[0] === 'p' || value?.[0] === 'eoi') && value[1]) addContentBlocks(value[1])\n })\n }\n\n if (format) {\n const referenceId = format.transclusion_reference_pointer?.id\n if (referenceId) addContentBlocks(referenceId)\n }\n // no child content blocks to recurse on\n if (!content || !Array.isArray(content)) return\n // ignore the content of other pages and collections\n if (blockId !== rootBlockId && !locust) if (type === 'page' || type === 'collection_view_page') return\n for (const blockId of content) addContentBlocks(blockId)\n }\n addContentBlocks(rootBlockId)\n return Array.from(contentBlockIds)\n}\n\n/**\n * Gets the IDs of all blocks contained on a page starting from a root block ID.\n */\nexport const getPageContentUserIds = (recordMap: ExtendedRecordMap, blockId?: string): string[] => {\n const rootBlockId = blockId || Object.keys(recordMap.block)[0]\n const contentUserIDs = new Set<string>()\n const block = recordMap.block[rootBlockId]?.value\n\n if (block?.created_by_id) contentUserIDs.add(block?.created_by_id)\n if (block?.last_edited_by_id) contentUserIDs.add(block?.last_edited_by_id)\n\n // Property\n const { properties } = block\n if (properties)\n for (const key of Object.keys(properties)) {\n const p = properties[key]\n p.map((d: Decoration) => {\n const value = d?.[1]?.[0]\n if (value?.[0] === 'u' && value[1]) contentUserIDs.add(value[1])\n })\n }\n\n return Array.from(contentUserIDs)\n}\n","export const idToUuid = (id = '') =>\n `${id.substr(0, 8)}-${id.substr(8, 4)}-${id.substr(12, 4)}-${id.substr(16, 4)}-${id.substr(20)}`\n","import { idToUuid } from './id-to-uuid'\n\nconst pageIdRe = /\\b([a-f0-9]{32})\\b/\nconst pageId2Re = /\\b([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})\\b/\n\n/**\n * Robustly extracts the notion page ID from a notion URL or pathname suffix.\n *\n * Defaults to returning a UUID (with dashes).\n */\nexport const parsePageId = (id: string | null = '', { uuid = true }: { uuid?: boolean } = {}) => {\n if (!id) return null\n\n id = id.split('?')[0]\n const match = id.match(pageIdRe)\n\n if (match) return uuid ? idToUuid(match[1]) : match[1]\n\n const match2 = id.match(pageId2Re)\n if (match2) return uuid ? match2[1] : match2[1].replace(/-/g, '')\n\n return null\n}\n","export const uuidToId = (uuid: string) => uuid.replace(/-/g, '')\n","import type { ExtendedRecordMap, Block, Collection } from '@texonom/ntypes'\n\nexport function findAncestors(recordMap: ExtendedRecordMap, block: Block | Collection, list: string[] = []): string[] {\n if (block.parent_id) {\n list.push(block.parent_id)\n const table = block.parent_table as 'block' | 'collection'\n if (recordMap[table]?.[block.parent_id]?.value)\n return findAncestors(recordMap, recordMap[table][block.parent_id].value, list)\n }\n return list\n}\n","import { findAncestors } from './find-ancestors'\nimport { getPageContentBlockIds } from './get-page-content-block-ids'\nimport { getBlockTitle } from './get-block-title'\n\nimport type { ExtendedRecordMap, PageMap, PageChunk, BlockMap } from '@texonom/ntypes'\n\nexport type PageTree = {\n id: string\n type: string\n title: string\n blocks: number\n pages: number\n parent?: PageTree\n children: PageTree[]\n}\n\ntype FetchOption = RequestInit & { timeout?: number }\n\n/**\n * Performs a traversal over a given Notion workspace starting from a seed page.\n *\n * Returns a map containing all of the pages that are reachable from the seed\n * page in the space.\n *\n * If `rootSpaceId` is not defined, the space ID of the root page will be used\n * to scope traversal.\n *\n *\n * @param rootPageId - Page ID to start from.\n * @param rootSpaceId - Space ID to scope traversal.\n * @param getPage - Function used to fetch a single page.\n * @param opts - Optional config\n */\nexport async function getAllInSpace(\n startPageId: string,\n getPage: (pageId: string, { fetchOption }?: { fetchOption?: FetchOption }) => Promise<ExtendedRecordMap>,\n getBlocks: (blockIds: string[], fetchOption?: FetchOption) => Promise<PageChunk>,\n fetchCollections: (\n contentBlockIds: string[],\n recordMap: ExtendedRecordMap,\n pageId?: string,\n {\n fetchOption,\n concurrency,\n collectionConcurrency\n }?: { fetchOption?: FetchOption; concurrency: number; collectionConcurrency?: number }\n ) => Promise<ExtendedRecordMap>,\n {\n startRecordMap,\n fetchOption = { timeout: 100000 },\n maxPage,\n debug,\n concurrency = 100,\n collectionConcurrency = 100\n }: {\n startRecordMap?: ExtendedRecordMap\n fetchOption?: FetchOption\n concurrency?: number\n maxPage?: number\n debug?: boolean\n collectionConcurrency?: number\n } = {}\n): Promise<{ recordMap: ExtendedRecordMap; pageMap: PageMap; pageTree: PageTree }> {\n const pageMap: PageMap = {}\n const recordMap = startRecordMap ? startRecordMap : await getPage(startPageId, { fetchOption })\n\n let tempRecordMap: ExtendedRecordMap = JSON.parse(JSON.stringify(recordMap))\n\n if (debug) console.time('Total fetch time')\n let iteration = 1\n while (true) {\n if (debug) console.debug(`Iteration ${iteration}`)\n if (debug) console.debug('block length ', Object.keys(recordMap.block).length)\n\n if (debug) console.time('getPageContentBlockIds')\n const targetBlocks = Object.keys(tempRecordMap.block)\n const missing = Object.keys(\n targetBlocks.reduce((blockMap, root) => {\n const contentBlockIds = getPageContentBlockIds(recordMap, root, true)\n for (const contentBlockID of contentBlockIds) if (!recordMap.block[contentBlockID]) blockMap[contentBlockID] = true\n return blockMap\n }, {})\n )\n for (const { value: block } of Object.values(tempRecordMap.block))\n if (block && !recordMap.block[block.parent_id] && block.parent_table === 'block') missing.push(block.parent_id)\n if (debug) console.timeEnd('getPageContentBlockIds')\n\n if (debug) console.time('getBlocks')\n tempRecordMap = (await getBlocks(missing, fetchOption)).recordMap as ExtendedRecordMap\n if (debug) console.timeEnd('getBlocks')\n if (!tempRecordMap?.block) break\n\n if (debug) console.time('mapBlocks')\n const contentBlockIds = Object.values(recordMap.block)\n .map(obj => obj.value?.id)\n .filter(Boolean)\n recordMap.block = { ...recordMap.block, ...tempRecordMap.block }\n if (debug) console.timeEnd('mapBlocks')\n\n if (debug) console.time('fetchCollections')\n await fetchCollections(contentBlockIds, recordMap, undefined, { fetchOption, concurrency, collectionConcurrency })\n if (debug) console.timeEnd('fetchCollections')\n if (debug) console.debug('collection query length ' + Object.keys(recordMap.collection_query).length)\n\n if (debug) console.debug('new block length ', Object.keys(tempRecordMap.block).length)\n const pageLength = Object.values(recordMap.block)\n .map(obj => obj.value?.type)\n .filter(type => type === 'page').length\n if (debug) console.debug('page length ', pageLength)\n if (Number.isInteger(maxPage) && pageLength >= maxPage) break\n\n if (debug) console.debug(`memory usage ${process.memoryUsage().rss / 1024 / 1024}MB`)\n iteration += 1\n if (debug) console.debug()\n }\n if (debug) console.timeEnd('Total fetch time')\n\n if (debug) console.time('get page map')\n if (debug) console.debug('Total block length ', Object.keys(recordMap.block).length)\n const blockIds = Object.keys(recordMap.block)\n\n const promises = []\n for (const blockId of blockIds)\n if (recordMap.block[blockId].value?.type === 'page') {\n promises.push(getPageSync(blockId, recordMap, getBlocks).then(pageRecordMap => (pageMap[blockId] = pageRecordMap)))\n await sleep(1)\n }\n await Promise.all(promises)\n\n if (debug) console.timeEnd('get page map')\n if (debug) console.debug('Total page length ', Object.keys(pageMap).length)\n\n if (debug) console.time('get page tree')\n const pageTree = {\n id: startPageId,\n title: getBlockTitle(recordMap.block[startPageId].value, recordMap),\n blocks: 1,\n pages: 1,\n children: [],\n type: 'page'\n }\n recursivePageTree(recordMap, pageTree)\n if (debug) console.timeEnd('get page tree')\n\n return { pageMap, pageTree, recordMap }\n}\n\nexport function recursivePageTree(recordMap: ExtendedRecordMap, pageTree: PageTree): PageTree {\n // Save ancestors to update the count\n const ancestors = [pageTree]\n let ancestor = pageTree\n while (true)\n if (ancestor.parent) {\n ancestors.push(ancestor.parent)\n ancestor = ancestor.parent\n } else {\n break\n }\n\n const current = recordMap.block[pageTree.id]?.value\n if (!current) {\n console.warn(`No block value for ${pageTree.id}`)\n delete pageTree.parent\n return pageTree\n }\n\n if (current.content?.length) {\n for (const ancestor of ancestors) ancestor.blocks += current.content.length\n for (const contentBlockId of current.content) {\n const block = recordMap.block[contentBlockId]?.value\n if (!block) continue\n pageTree.children.push(\n recursivePageTree(recordMap, {\n id: contentBlockId,\n title: getBlockTitle(block, recordMap),\n blocks: 1,\n pages: 0,\n children: [],\n type: block.type,\n parent: pageTree\n })\n )\n if (block.type === 'page') for (const ancestor of ancestors) ancestor.pages++\n }\n } else if (current?.type === 'collection_view') {\n const collectionQuery = recordMap.collection_query[current.collection_id]?.[current.view_ids[0]]\n if (!collectionQuery) {\n console.warn(`No collection query for ${pageTree.id}`)\n delete pageTree.parent\n return pageTree\n }\n const childrenMap = {}\n for (const collectionQuery of Object.values(recordMap.collection_query[current.collection_id]))\n if (collectionQuery.collection_group_results.blockIds)\n for (const blockId of collectionQuery.collection_group_results.blockIds) childrenMap[blockId] = true\n const childrenPages = Object.keys(childrenMap)\n for (const ancestor of ancestors) ancestor.pages += childrenPages.length\n for (const ancestor of ancestors) ancestor.blocks += childrenPages.length\n for (const blockId of childrenPages)\n pageTree.children.push(\n recursivePageTree(recordMap, {\n id: blockId,\n title: getBlockTitle(recordMap.block[blockId].value, recordMap),\n blocks: childrenPages.length,\n pages: childrenPages.length,\n children: [],\n type: current.type,\n parent: pageTree\n })\n )\n }\n delete pageTree.parent\n return pageTree\n}\n\nexport async function getPageSync(\n pageId: string,\n recordMap: ExtendedRecordMap,\n getBlocks: (blockIds: string[], fetchOption?: FetchOption) => Promise<PageChunk>\n): Promise<ExtendedRecordMap> {\n let contentBlockIds = getPageContentBlockIds(recordMap, pageId)\n let blockMap: BlockMap = { [pageId]: { value: recordMap.block[pageId].value, role: 'reader' } }\n const collectionMap = {}\n const collectionViewMap = {}\n const collectionQueryMap = {}\n\n const missing = []\n for (const contentBlockId of contentBlockIds) {\n const block = recordMap.block[contentBlockId]?.value\n if (!block) {\n missing.push(contentBlockId)\n continue\n }\n blockMap[contentBlockId] = { value: block, role: 'reader' }\n if (block.type === 'collection_view' || block.type === 'collection_view_page') {\n if (recordMap.collection[block.collection_id])\n collectionMap[block.collection_id] = recordMap.collection[block.collection_id]\n if (recordMap.collection_query[block.collection_id])\n collectionQueryMap[block.collection_id] = recordMap.collection_query[block.collection_id]\n for (const viewId of block.view_ids)\n if (recordMap.collection_view[viewId]) {\n collectionViewMap[viewId] = recordMap.collection_view[viewId]\n const blockIds = recordMap.collection_query[block?.collection_id]?.[viewId]?.collection_group_results?.blockIds\n if (blockIds?.length)\n for (const blockId of blockIds) {\n const block = recordMap.block[blockId]?.value\n if (block) blockMap[blockId] = { value: block, role: 'reader' }\n else missing.push(blockId)\n }\n }\n }\n }\n\n // Ancestor\n const ancesters = findAncestors(recordMap, recordMap.block[pageId].value)\n for (const ancester of ancesters) {\n const block = recordMap.block[ancester]?.value\n if (block) blockMap[ancester] = { value: block, role: 'reader' }\n const collection = recordMap.collection[ancester]?.value\n if (collection) collectionMap[ancester] = { value: collection }\n }\n\n // Alias\n for (const blockId of Object.keys(blockMap)) {\n const block = blockMap[blockId].value\n let targetBlock = block\n if (block?.type === 'alias')\n while (true) {\n const alias = targetBlock?.format?.alias_pointer?.id\n if (!alias) break\n targetBlock = recordMap.block[alias]?.value\n if (!targetBlock) missing.push(alias)\n else blockMap[alias] = { value: targetBlock, role: 'reader' }\n }\n }\n\n // Missing\n if (missing.length) {\n const responseMap = (await getBlocks(missing).catch(() => ({ recordMap: { block: null } }))).recordMap\n if (responseMap?.block) {\n blockMap = { ...blockMap, ...responseMap.block }\n for (const blockId in responseMap.block) recordMap.block[blockId] = responseMap.block[blockId]\n } else {\n console.warn(`fetching ${missing.length} fail for ${pageId}`)\n }\n }\n\n contentBlockIds = getPageContentBlockIds(recordMap, pageId)\n for (const contentBlockId of contentBlockIds) {\n const block = recordMap.block[contentBlockId]?.value\n if (!block) continue\n blockMap[contentBlockId] = { value: block, role: 'reader' }\n if (block.type === 'collection_view' || block.type === 'collection_view_page') {\n if (recordMap.collection[block.collection_id])\n collectionMap[block.collection_id] = recordMap.collection[block.collection_id]\n if (recordMap.collection_query[block.collection_id])\n collectionQueryMap[block.collection_id] = recordMap.collection_query[block.collection_id]\n for (const viewId of block.view_ids)\n if (recordMap.collection_view[viewId]) {\n collectionViewMap[viewId] = recordMap.collection_view[viewId]\n const blockIds = recordMap.collection_query[block?.collection_id]?.[viewId]?.collection_group_results?.blockIds\n if (blockIds?.length)\n for (const blockId of blockIds) {\n const block = recordMap.block[blockId]?.value\n if (block) blockMap[blockId] = { value: block, role: 'reader' }\n }\n }\n }\n }\n\n return {\n block: blockMap,\n collection: collectionMap,\n collection_view: collectionViewMap,\n collection_query: collectionQueryMap,\n signed_urls: {},\n notion_user: {}\n }\n}\n\nconst sleep = async (ms: number) => new Promise(resolve => setTimeout(resolve, ms))\n","export const normalizeTitle = (title?: string | null): string => {\n return (title || '')\n .replace(/( |\\/)/g, '-') // Replace spaces and slashes with dashes\n .replace(/[^a-zA-Z0-9-\\u4e00-\\u9FFF\\uAC00-\\uD7AF\\u3130-\\u318F\\u3041-\\u3096\\u30A1-\\u30FC\\u3000-\\u303F]/g, '') // Retain Korean characters\n .replace(/--+/g, '-') // Replace multiple dashes with a single dash\n .replace(/^-+|-+$/g, '') // Trim leading and trailing dashes\n .trim()\n .toLowerCase()\n}\n","import { getBlockTitle } from './get-block-title'\nimport { getPageProperty } from './get-page-property'\nimport { normalizeTitle } from './normalize-title'\nimport { getTextContent } from './get-text-content'\nimport { uuidToId } from './uuid-to-id'\n\nimport type { ExtendedRecordMap } from '@texonom/ntypes'\n\n/**\n * Gets the canonical, display-friendly version of a page's ID for use in URLs.\n */\nexport const getCanonicalPageId = (\n pageId: string,\n recordMap: ExtendedRecordMap,\n { uuid = true }: { uuid?: boolean } = {}\n): string | null => {\n if (!pageId || !recordMap) return null\n\n const id = uuidToId(pageId)\n const block = recordMap.block[pageId]?.value\n\n if (block) {\n const slug =\n (getPageProperty('slug', block, recordMap) as string | null) || normalizeTitle(getBlockTitle(block, recordMap))\n\n if (slug)\n if (uuid) return `${slug}-${id}`\n else return slug\n } else {\n const collection = recordMap.collection[pageId]?.value\n if (collection) {\n const slug = normalizeTitle(getTextContent(collection.name))\n if (slug)\n if (uuid) return `${slug}-${id}`\n else return slug\n }\n }\n\n return id\n}\n","import { getBlockIcon } from './get-block-icon'\nimport { getBlockParentPage } from './get-block-parent-page'\nimport { getBlockTitle } from './get-block-title'\n\nimport type { ExtendedRecordMap } from '@texonom/ntypes'\n\nexport const getPageBreadcrumbs = (recordMap: ExtendedRecordMap, activePageId: string): Array<any> | null => {\n const blockMap = recordMap.block\n const breadcrumbs = []\n\n let currentPageId = activePageId\n\n do {\n const block = blockMap[currentPageId]?.value\n if (!block) break\n\n const title = getBlockTitle(block, recordMap)\n const icon = getBlockIcon(block, recordMap)\n\n if (!(title || icon)) break\n\n breadcrumbs.push({\n block,\n active: currentPageId === activePageId,\n pageId: currentPageId,\n title,\n icon\n })\n\n const parentBlock = getBlockParentPage(block, recordMap)\n const parentId = parentBlock?.id\n\n if (!parentId) break\n\n currentPageId = parentId\n\n // eslint-disable-next-line no-constant-condition\n } while (true)\n\n breadcrumbs.reverse()\n\n return breadcrumbs\n}\n","import { getBlockIcon } from './get-block-icon'\nimport { isUrl } from './is-url'\n\nimport type { Block, ExtendedRecordMap } from '@texonom/ntypes'\n\n/**\n * Gets URLs of all images contained on the given page.\n */\nexport const getPageImageUrls = (\n recordMap: ExtendedRecordMap,\n {\n mapImageUrl\n }: {\n mapImageUrl: (url: string, block: Block) => string | null\n }\n): string[] => {\n const blockIds = Object.keys(recordMap.block)\n const imageUrls: string[] = blockIds\n .flatMap(blockId => {\n const block = recordMap.block[blockId]?.value\n const images: Array<{ block: Block; url: string }> = []\n\n if (block) {\n if (block.type === 'image') {\n const signedUrl = recordMap.signed_urls?.[block.id]\n let source = signedUrl || block.properties?.source?.[0]?.[0]\n if (source.includes('file.notion.so')) source = block.properties?.source?.[0]?.[0]\n\n if (source)\n images.push({\n block,\n url: source\n })\n }\n\n if (block.format?.page_cover) {\n const source = block.format.page_cover\n\n images.push({\n block,\n url: source\n })\n }\n\n if (block.format?.bookmark_cover) {\n const source = block.format.bookmark_cover\n\n images.push({\n block,\n url: source\n })\n }\n\n if (block.format?.bookmark_icon) {\n const source = block.format.bookmark_icon\n\n images.push({\n block,\n url: source\n })\n }\n\n const pageIcon = getBlockIcon(block, recordMap)\n if (pageIcon && isUrl(pageIcon))\n images.push({\n block,\n url: pageIcon\n })\n }\n\n return images\n })\n .filter(Boolean)\n .map(({ block, url }) => mapImageUrl(url, block))\n .filter(Boolean)\n\n return Array.from(new Set(imageUrls))\n}\n","import mem from 'mem'\nimport normalizeUrlImpl from 'normalize-url'\n\nexport const normalizeUrl = mem((url?: string) => {\n if (!url) return ''\n\n try {\n if (url.startsWith('https://www.notion.so/image/')) {\n const u = new URL(url)\n const subUrl = decodeURIComponent(u.pathname.substring('/image/'.length))\n const normalizedSubUrl = normalizeUrl(subUrl)\n u.pathname = `/image/${encodeURIComponent(normalizedSubUrl)}`\n url = u.toString()\n }\n\n return normalizeUrlImpl(url, {\n stripProtocol: true,\n stripWWW: true,\n stripHash: true,\n stripTextFragment: true,\n removeQueryParameters: true\n })\n } catch (err) {\n return ''\n }\n})\n","import type { ExtendedRecordMap } from '@texonom/ntypes'\n\nexport function mergeRecordMaps(recordMapA: ExtendedRecordMap, recordMapB: ExtendedRecordMap): ExtendedRecordMap {\n const mergedRecordMap: ExtendedRecordMap = {\n block: {\n ...recordMapA.block,\n ...recordMapB.block\n },\n collection: {\n ...recordMapA.collection,\n ...recordMapB.collection\n },\n collection_view: {\n ...recordMapA.collection_view,\n ...recordMapB.collection_view\n },\n notion_user: {\n ...recordMapA.notion_user,\n ...recordMapB.notion_user\n },\n collection_query: {\n ...recordMapA.collection_query,\n ...recordMapB.collection_query\n },\n signed_urls: {\n ...recordMapA.signed_urls,\n ...recordMapB.signed_urls\n },\n preview_images: {\n ...recordMapA.preview_images,\n ...recordMapB.preview_images\n }\n }\n\n return mergedRecordMap\n}\n","export const formatDate = (input: string | number, { month = 'short' }: { month?: 'long' | 'short' } = {}) => {\n const date = new Date(input)\n const monthLocale = date.toLocaleString('en-US', { month })\n return `${date.getUTCFullYear()} ${monthLocale} ${date.getUTCDate()} ${date.getUTCHours()}:${date.getUTCMinutes()}`\n}\n","import { formatDate } from './format-date'\n\nexport interface NotionDateTime {\n type: 'datetime'\n start_date: string\n start_time?: string\n time_zone?: string\n}\n\nexport const formatNotionDateTime = (datetime: NotionDateTime) => {\n const dateString = `${datetime.start_time || ''} ${datetime.start_date} ${datetime.time_zone || ''}`\n return formatDate(dateString)\n}\n","import { Block, ExtendedRecordMap, PageBlock } from '@texonom/ntypes'\n\nimport { getBlockTitle } from './get-block-title'\nimport { getPageTableOfContents } from './get-page-table-of-contents'\n\ntype EstimatePageReadTimeOptions = {\n wordsPerMinute?: number\n imageReadTimeInSeconds?: number\n}\n\ntype ContentStats = {\n numWords: number\n numImages: number\n}\n\ntype PageReadTimeEstimate = ContentStats & {\n totalWordsReadTimeInMinutes: number\n totalImageReadTimeInMinutes: number\n totalReadTimeInMinutes: number\n}\n\n/**\n * Returns an estimate for the time it would take for a person to read the content\n * in the given Notion page.\n *\n * Uses Medium for inspiration.\n *\n * @see https://blog.medium.com/read-time-and-you-bc2048ab620c\n * @see https://github.com/ngryman/reading-time\n *\n * TODO: handle non-english content.\n */\nexport function estimatePageReadTime(\n block: Block,\n recordMap: ExtendedRecordMap,\n { wordsPerMinute = 275, imageReadTimeInSeconds = 12 }: EstimatePageReadTimeOptions = {}\n): PageReadTimeEstimate {\n const stats = getBlockContentStats(block, recordMap)\n const totalWordsReadTimeInMinutes = stats.numWords / wordsPerMinute\n const totalImageReadTimeInSeconds =\n stats.numImages > 10\n ? (stats.numImages / 2) * (imageReadTimeInSeconds + 3) + (stats.numImages - 10) * 3 // n/2(a+b) + 3 sec/image\n : (stats.numImages / 2) * (2 * imageReadTimeInSeconds + (1 - stats.numImages)) // n/2[2a+(n-1)d]\n const totalImageReadTimeInMinutes = totalImageReadTimeInSeconds / 60\n\n const totalReadTimeInMinutes = totalWordsReadTimeInMinutes + totalImageReadTimeInMinutes\n\n return {\n ...stats,\n totalWordsReadTimeInMinutes,\n totalImageReadTimeInMinutes,\n totalReadTimeInMinutes\n }\n}\n\n/**\n * Same as `estimatePageReadTime`, except it returns the total time estimate as\n * a human-readable string.\n *\n * For example, \"9 minutes\" or \"less than a minute\".\n */\nexport function estimatePageReadTimeAsHumanizedString(\n block: Block,\n recordMap: ExtendedRecordMap,\n opts: EstimatePageReadTimeOptions\n) {\n const estimate = estimatePageReadTime(block, recordMap, opts)\n return humanizeReadTime(estimate.totalReadTimeInMinutes)\n}\n\nfunction getBlockContentStats(block: Block, recordMap: ExtendedRecordMap): ContentStats {\n const stats: ContentStats = {\n numWords: 0,\n numImages: 0\n }\n\n if (!block) return stats\n\n for (const childId of block.content || []) {\n const child = recordMap.block[childId]?.value\n let recurse = false\n if (!child) continue\n\n switch (child.type) {\n case 'quote':\n // fallthrough\n case 'alias':\n // fallthrough\n case 'header':\n // fallthrough\n case 'sub_header':\n // fallthrough\n case 'sub_sub_header': {\n const title = getBlockTitle(child, recordMap)\n stats.numWords += countWordsInText(title)\n break\n }\n\n case 'callout':\n // fallthrough\n case 'toggle':\n // fallthrough\n case 'to_do':\n // fallthrough\n case 'bulleted_list':\n // fallthrough\n case 'numbered_list':\n // fallthrough\n case 'text': {\n const title = getBlockTitle(child, recordMap)\n stats.numWords += countWordsInText(title)\n recurse = true\n break\n }\n\n case 'embed':\n // fallthrough\n case 'tweet':\n // fallthrough\n case 'maps':\n // fallthrough\n case 'pdf':\n // fallthrough\n case 'figma':\n // fallthrough\n case 'typeform':\n // fallthrough\n case 'codepen':\n // fallthrough\n case 'excalidraw':\n // fallthrough\n case 'gist':\n // fallthrough\n case 'video':\n // fallthrough\n case 'drive':\n // fallthrough\n case 'audio':\n // fallthrough\n case 'file':\n // fallthrough\n case 'image':\n // treat all embeds as images\n stats.numImages += 1\n break\n\n case 'bookmark':\n // treat bookmarks as quarter images since they aren't as content-ful as embedd images\n stats.numImages += 0.25\n break\n\n case 'code':\n // treat code blocks as double the complexity of images\n stats.numImages += 2\n break\n\n case 'table':\n // fallthrough\n case 'collection_view':\n // treat collection views as double the complexity of images\n stats.numImages += 2\n break\n\n case 'column':\n // fallthrough\n case 'column_list':\n // fallthrough\n case 'transclusion_container':\n recurse = true\n break\n\n case 'table_of_contents': {\n const page = block as PageBlock\n if (!page) continue\n\n const toc = getPageTableOfContents(page, recordMap)\n for (const tocItem of toc) stats.numWords += countWordsInText(tocItem.text)\n\n break\n }\n\n case 'transclusion_reference': {\n const referencePointerId = child?.format?.transclusion_reference_pointer?.id\n\n if (!referencePointerId) continue\n\n const referenceBlock = recordMap.block[referencePointerId]?.value\n if (referenceBlock) mergeContentStats(stats, getBlockContentStats(referenceBlock, recordMap))\n\n break\n }\n\n default:\n // ignore unrecognized blocks\n break\n }\n\n if (recurse) mergeContentStats(stats, getBlockContentStats(child, recordMap))\n }\n\n return stats\n}\n\nfunction mergeContentStats(statsA: ContentStats, statsB: ContentStats) {\n statsA.numWords += statsB.numWords\n statsA.numImages += statsB.numImages\n}\n\nfunction countWordsInText(text: string): number {\n if (!text) return 0\n\n return (text.match(/\\w+/g) || []).length\n}\n\nfunction humanizeReadTime(time: number): string {\n if (time < 0.5) return 'less than a minute'\n\n if (time < 1.5) return '1 minute'\n\n return `${Math.ceil(time)} minutes`\n}\n","import { Block } from '@texonom/ntypes'\n\nexport const defaultMapImageUrl = (url: string, block: Block): string | null => {\n if (!url) return null\n\n if (url.startsWith('data:')) return url\n\n // more recent versions of notion don't proxy unsplash images\n if (url.startsWith('https://images.unsplash.com')) return url\n\n try {\n const u = new URL(url)\n\n if (u.pathname.startsWith('/secure.notion-static.com') && u.hostname.endsWith('.amazonaws.com'))\n if (\n u.searchParams.has('X-Amz-Credential') &&\n u.searchParams.has('X-Amz-Signature') &&\n u.searchParams.has('X-Amz-Algorithm')\n )\n // if the URL is already signed, then use it as-is\n return url\n } catch {\n // ignore invalid urls\n }\n\n if (url.startsWith('/images')) url = `https://www.notion.so${url}`\n\n url = `https://www.notion.so${url.startsWith('/image') ? url : `/image/${encodeURIComponent(url)}`}`\n\n const notionImageUrlV2 = new URL(url)\n let table = block.parent_table === 'space' ? 'block' : block.parent_table\n if (table === 'collection' || table === 'team') table = 'block'\n\n notionImageUrlV2.searchParams.set('table', table)\n notionImageUrlV2.searchParams.set('id', block.id)\n notionImageUrlV2.searchParams.set('cache', 'v2')\n\n url = notionImageUrlV2.toString()\n\n return url\n}\n","export const defaultMapPageUrl = (rootPageId?: string) => (pageId: string) => {\n pageId = (pageId || '').replace(/-/g, '')\n\n if (rootPageId && pageId === rootPageId) return '/'\n else return `/${pageId}`\n}\n"],"names":["getTextContent","text","_a","prev","current","getBlockCollectionId","block","recordMap","collectionId","_b","collectionViewId","_c","collectionView","_e","_d","_g","_f","getBlockTitle","collection","getBlockIcon","getPageTitle","pageBlock","getPageProperty","propertyName","propertyNameL","propertyId","key","type","content","formatDate","start_date","start_time","end_date","end_time","startTime","endTime","e","getDateValue","prop","v","value","getBlockParentPage","inclusive","currentRecord","parentId","parentTable","getBlockParent","indentLevels","getPageTableOfContents","page","toc","blockId","indentLevelStack","tocItem","indentLevel","actual","prevIndent","prevActual","prevEffective","getPageContentBlockIds","locust","rootBlockId","contentBlockIds","addContentBlocks","properties","format","p","d","referenceId","getPageContentUserIds","contentUserIDs","idToUuid","id","pageIdRe","pageId2Re","parsePageId","uuid","match","match2","uuidToId","findAncestors","list","table","getAllInSpace","_0","_1","_2","_3","__async","startPageId","getPage","getBlocks","fetchCollections","startRecordMap","fetchOption","maxPage","debug","concurrency","collectionConcurrency","pageMap","tempRecordMap","iteration","targetBlocks","missing","blockMap","root","contentBlockID","obj","__spreadValues","pageLength","blockIds","promises","getPageSync","pageRecordMap","sleep","pageTree","recursivePageTree","ancestors","ancestor","contentBlockId","childrenMap","collectionQuery","childrenPages","pageId","collectionMap","collectionViewMap","collectionQueryMap","viewId","ancesters","ancester","targetBlock","alias","_i","_h","_j","responseMap","_k","_n","_m","_l","_o","ms","resolve","normalizeTitle","title","getCanonicalPageId","slug","getPageBreadcrumbs","activePageId","breadcrumbs","currentPageId","icon","parentBlock","getPageImageUrls","mapImageUrl","imageUrls","images","source","pageIcon","isUrl","url","normalizeUrl","mem","u","subUrl","normalizedSubUrl","normalizeUrlImpl","err","mergeRecordMaps","recordMapA","recordMapB","input","month","date","monthLocale","formatNotionDateTime","datetime","dateString","estimatePageReadTime","wordsPerMinute","imageReadTimeInSeconds","stats","getBlockContentStats","totalWordsReadTimeInMinutes","totalImageReadTimeInMinutes","totalReadTimeInMinutes","__spreadProps","estimatePageReadTimeAsHumanizedString","opts","estimate","humanizeReadTime","childId","child","recurse","countWordsInText","referencePointerId","referenceBlock","mergeContentStats","statsA","statsB","time","defaultMapImageUrl","notionImageUrlV2","defaultMapPageUrl","rootPageId"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/get-text-content.ts","../src/get-block-collection-id.ts","../src/get-block-title.ts","../src/get-block-icon.ts","../src/get-page-title.ts","../src/get-page-property.ts","../src/get-date-value.ts","../src/get-block-parent-page.ts","../src/get-page-table-of-contents.ts","../src/get-page-content-block-ids.ts","../src/id-to-uuid.ts","../src/parse-page-id.ts","../src/uuid-to-id.ts","../src/find-ancestors.ts","../src/get-all-in-space.ts","../src/normalize-title.ts","../src/get-canonical-page-id.ts","../src/get-page-breadcrumbs.ts","../src/get-page-image-urls.ts","../src/normalize-url.ts","../src/merge-record-maps.ts","../src/format-date.ts","../src/format-notion-date-time.ts","../src/estimate-page-read-time.ts","../src/map-image-url.ts","../src/map-page-url.ts"],"sourcesContent":["import type { Decoration } from '@texonom/ntypes'\n\n/**\n * Gets the raw, unformatted text content of a block's content value.\n *\n * This is useful, for instance, for extracting a block's `title` without any\n * rich text formatting.\n */\nexport const getTextContent = (text?: Decoration[]): string => {\n if (!text) return ''\n else if (Array.isArray(text))\n return text?.reduce((prev, current) => prev + (current[0] !== '⁍' && current[0] !== '‣' ? current[0] : ''), '') ?? ''\n else return text\n}\n","import type { Block, CollectionViewBlock, ExtendedRecordMap } from '@texonom/ntypes'\n\nexport function getBlockCollectionId(block: Block, recordMap: ExtendedRecordMap): string | null {\n const collectionId =\n (block as CollectionViewBlock).collection_id || (block as CollectionViewBlock).format?.collection_pointer?.id\n\n if (collectionId) return collectionId\n\n const collectionViewId = (block as CollectionViewBlock)?.view_ids?.[0]\n if (collectionViewId) {\n const collectionView = recordMap.collection_view?.[collectionViewId]?.value\n if (collectionView) {\n const collectionId = collectionView.format?.collection_pointer?.id\n return collectionId\n }\n }\n\n return null\n}\n","import { getBlockCollectionId } from './get-block-collection-id'\nimport { getTextContent } from './get-text-content'\n\nimport type { Block, ExtendedRecordMap } from '@texonom/ntypes'\n\nexport function getBlockTitle(block: Block, recordMap: ExtendedRecordMap) {\n if (block.properties?.title) return getTextContent(block.properties.title)\n\n if (block.type === 'collection_view_page' || block.type === 'collection_view') {\n const collectionId = getBlockCollectionId(block, recordMap)\n if (collectionId) {\n const collection = recordMap.collection[collectionId]?.value\n if (collection) return getTextContent(collection.name)\n }\n }\n return ''\n}\n","import { getBlockCollectionId } from './get-block-collection-id'\n\nimport type { Block, ExtendedRecordMap, PageBlock } from '@texonom/ntypes'\n\nexport function getBlockIcon(block: Block, recordMap: ExtendedRecordMap) {\n if ((block as PageBlock).format?.page_icon) return (block as PageBlock).format?.page_icon\n\n if (block.type === 'collection_view_page' || block.type === 'collection_view') {\n const collectionId = getBlockCollectionId(block, recordMap)\n if (collectionId) {\n const collection = recordMap.collection[collectionId]?.value\n\n if (collection) return collection.icon\n }\n }\n\n return null\n}\n","import type { ExtendedRecordMap } from '@texonom/ntypes'\n\nimport { getBlockTitle } from './get-block-title'\n\nexport function getPageTitle(recordMap: ExtendedRecordMap) {\n const pageBlock = recordMap.block[Object.keys(recordMap.block)[0]]?.value\n\n if (pageBlock) return getBlockTitle(pageBlock, recordMap)\n\n return null\n}\n","import { Block, DateFormat, ExtendedRecordMap } from '@texonom/ntypes'\n\nimport { getTextContent } from './get-text-content'\n\n/**\n * Gets the value of a collection property for a given page (collection item).\n *\n * @param propertyName property name\n * @param block Page block, often be first block in blockMap\n * @param recordMap\n * @returns - The return value types will follow the following principles:\n * 1. if property is date type, it will return `number` or `number[]`(depends on `End Date` switch)\n * 2. property is text-like will return `string`\n * 3. multi select property will return `string[]`\n * 4. checkbox property return `boolean`\n * @todo complete all no-text property type\n */\nexport function getPageProperty<T = string | number | boolean | string[] | number[]>(\n propertyName: string,\n block: Block,\n recordMap: ExtendedRecordMap\n): T\nexport function getPageProperty(propertyName: string, block: Block, recordMap: ExtendedRecordMap) {\n try {\n if (!block.properties || !Object.keys(recordMap.collection))\n // console.warn(\n // `block ${block.id} has no properties or this recordMap has no collection record`\n // )\n return null\n\n const collection = recordMap.collection[block.parent_id]?.value\n\n if (collection) {\n const propertyNameL = propertyName.toLowerCase()\n const propertyId = Object.keys(collection.schema).find(\n key => collection.schema[key]?.name?.toLowerCase() === propertyNameL\n )\n\n if (!propertyId) return null\n\n const { type } = collection.schema[propertyId]\n const content = getTextContent(block.properties[propertyId])\n\n switch (type) {\n case 'created_time':\n return block.created_time\n\n case 'multi_select':\n return content.split(',')\n\n case 'date': {\n const property = block.properties[propertyId] as [['‣', [DateFormat]]]\n const formatDate = property[0][1][0][1]\n\n if (formatDate.type == 'datetime') {\n return new Date(`${formatDate.start_date} ${formatDate.start_time}`).getTime()\n } else if (formatDate.type == 'date') {\n return new Date(formatDate.start_date).getTime()\n } else if (formatDate.type == 'datetimerange') {\n const { start_date, start_time, end_date, end_time } = formatDate\n const startTime = new Date(`${start_date} ${start_time}`).getTime()\n const endTime = new Date(`${end_date} ${end_time}`).getTime()\n return [startTime, endTime]\n } else {\n const startTime = new Date(formatDate.start_date).getTime()\n const endTime = new Date(formatDate.end_date).getTime()\n return [startTime, endTime]\n }\n }\n\n case 'checkbox':\n return content == 'Yes'\n\n case 'last_edited_time':\n return block.last_edited_time\n\n default:\n return content\n }\n }\n } catch {\n // ensure that no matter what, we don't throw errors because of an unexpected\n // collection data format\n }\n\n return null\n}\n","import type { FormattedDate } from '@texonom/ntypes'\n\n/**\n * Attempts to find a valid date from a given property.\n */\nexport const getDateValue = (prop: any[]): FormattedDate | null => {\n if (prop && Array.isArray(prop))\n if (prop[0] === 'd') return prop[1]\n else\n for (const v of prop) {\n const value = getDateValue(v)\n if (value) return value\n }\n\n return null\n}\n","import type { Block, ExtendedRecordMap, PageBlock, Collection, Space } from '@texonom/ntypes'\n\n/**\n * Returns the parent page block containing a given page.\n *\n * Note that many times this will not be the direct parent block since\n * some non-page content blocks can contain sub-blocks.\n */\nexport const getBlockParentPage = (\n block: Block,\n recordMap: ExtendedRecordMap,\n {\n inclusive = false\n }: {\n inclusive?: boolean\n } = {}\n): PageBlock | null => {\n let currentRecord: Block | Collection = block\n\n while (currentRecord != null) {\n if (inclusive && (currentRecord as Block)?.type === 'page') return currentRecord as PageBlock\n\n const parentId: string = currentRecord.parent_id\n const parentTable = currentRecord.parent_table\n\n if (!parentId) break\n\n if (parentTable === 'collection') {\n currentRecord = recordMap.collection[parentId]?.value\n } else {\n currentRecord = recordMap.block[parentId]?.value\n if ((currentRecord as Block)?.type === 'page') return currentRecord as PageBlock\n }\n }\n return null\n}\n\nexport const getBlockParent = (\n block: Block,\n recordMap: ExtendedRecordMap,\n {\n inclusive = false\n }: {\n inclusive?: boolean\n } = {}\n): PageBlock | Collection | Space => {\n let currentRecord: Block | Collection | Space = block\n\n while (currentRecord != null) {\n if (inclusive && (currentRecord as Block)?.type === 'page') return currentRecord as PageBlock\n\n const parentId: string = currentRecord.parent_id\n const parentTable = currentRecord.parent_table\n\n if (!parentId) break\n\n if (parentTable === 'collection') {\n return recordMap.collection[parentId]?.value\n } else if (parentTable === 'space') {\n return recordMap.space?.[parentId]?.value\n } else {\n currentRecord = recordMap.block[parentId]?.value\n if ((currentRecord as Block)?.type === 'page') return currentRecord as PageBlock\n }\n }\n return null\n}\n","import { getTextContent } from './get-text-content'\n\nimport type { ID, BlockType, PageBlock, ExtendedRecordMap } from '@texonom/ntypes'\n\nexport interface TableOfContentsEntry {\n id: ID\n type: BlockType\n text: string\n indentLevel: number\n}\n\nconst indentLevels = {\n header: 0,\n sub_header: 1,\n sub_sub_header: 2\n}\n\n/**\n * Gets the metadata for a table of contents block by parsing the page's\n * H1, H2, and H3 elements.\n */\nexport const getPageTableOfContents = (page: PageBlock, recordMap: ExtendedRecordMap): Array<TableOfContentsEntry> => {\n const toc = (page.content ?? [])\n .map((blockId: string) => {\n const block = recordMap.block[blockId]?.value\n\n if (block) {\n const { type } = block\n\n if (type === 'header' || type === 'sub_header' || type === 'sub_sub_header')\n return {\n id: blockId,\n type,\n text: getTextContent(block.properties?.title),\n indentLevel: indentLevels[type]\n }\n }\n\n return null\n })\n .filter(Boolean) as Array<TableOfContentsEntry>\n\n const indentLevelStack = [\n {\n actual: -1,\n effective: -1\n }\n ]\n\n // Adjust indent levels to always change smoothly.\n // This is a little tricky, but the key is that when increasing indent levels,\n // they should never jump more than one at a time.\n for (const tocItem of toc) {\n const { indentLevel } = tocItem\n const actual = indentLevel\n\n do {\n const prevIndent = indentLevelStack[indentLevelStack.length - 1]\n const { actual: prevActual, effective: prevEffective } = prevIndent\n\n if (actual > prevActual) {\n tocItem.indentLevel = prevEffective + 1\n indentLevelStack.push({\n actual,\n effective: tocItem.indentLevel\n })\n } else if (actual === prevActual) {\n tocItem.indentLevel = prevEffective\n break\n } else {\n indentLevelStack.pop()\n }\n\n // eslint-disable-next-line no-constant-condition\n } while (true)\n }\n\n return toc\n}\n","import type { ExtendedRecordMap, Decoration } from '@texonom/ntypes'\n\n/**\n * Gets the IDs of all blocks contained on a page starting from a root block ID.\n */\nexport const getPageContentBlockIds = (recordMap: ExtendedRecordMap, blockId?: string, locust = false): string[] => {\n const rootBlockId = blockId || Object.keys(recordMap.block)[0]\n const contentBlockIds = new Set<string>()\n\n function addContentBlocks(blockId: string) {\n if (contentBlockIds.has(blockId)) return\n contentBlockIds.add(blockId)\n\n const block = recordMap.block[blockId]?.value\n if (!block) return\n const { content, type, properties, format } = block\n if (properties)\n for (const key of Object.keys(properties)) {\n const p = properties[key]\n p.map((d: Decoration) => {\n const value = d?.[0]?.[1]?.[0]\n if (value?.[0] === 'p' && value[1]) addContentBlocks(value[1])\n })\n p.map((d: Decoration) => {\n const value = d?.[1]?.[0]\n if ((value?.[0] === 'p' || value?.[0] === 'eoi') && value[1]) addContentBlocks(value[1])\n })\n }\n\n if (format) {\n const referenceId = format.transclusion_reference_pointer?.id\n if (referenceId) addContentBlocks(referenceId)\n }\n // no child content blocks to recurse on\n if (!content || !Array.isArray(content)) return\n // ignore the content of other pages and collections\n if (blockId !== rootBlockId && !locust) if (type === 'page' || type === 'collection_view_page') return\n for (const blockId of content) addContentBlocks(blockId)\n }\n addContentBlocks(rootBlockId)\n return Array.from(contentBlockIds)\n}\n\n/**\n * Gets the IDs of all blocks contained on a page starting from a root block ID.\n */\nexport const getPageContentUserIds = (recordMap: ExtendedRecordMap, blockId?: string): string[] => {\n const rootBlockId = blockId || Object.keys(recordMap.block)[0]\n const contentUserIDs = new Set<string>()\n const block = recordMap.block[rootBlockId]?.value\n\n if (block?.created_by_id) contentUserIDs.add(block?.created_by_id)\n if (block?.last_edited_by_id) contentUserIDs.add(block?.last_edited_by_id)\n\n // Property\n const { properties } = block\n if (properties)\n for (const key of Object.keys(properties)) {\n const p = properties[key]\n p.map((d: Decoration) => {\n const value = d?.[1]?.[0]\n if (value?.[0] === 'u' && value[1]) contentUserIDs.add(value[1])\n })\n }\n\n return Array.from(contentUserIDs)\n}\n","export const idToUuid = (id = '') =>\n `${id.substr(0, 8)}-${id.substr(8, 4)}-${id.substr(12, 4)}-${id.substr(16, 4)}-${id.substr(20)}`\n","import { idToUuid } from './id-to-uuid'\n\nconst pageIdRe = /\\b([a-f0-9]{32})\\b/\nconst pageId2Re = /\\b([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})\\b/\n\n/**\n * Robustly extracts the notion page ID from a notion URL or pathname suffix.\n *\n * Defaults to returning a UUID (with dashes).\n */\nexport const parsePageId = (id: string | null = '', { uuid = true }: { uuid?: boolean } = {}) => {\n if (!id) return null\n\n id = id.split('?')[0]\n const match = id.match(pageIdRe)\n\n if (match) return uuid ? idToUuid(match[1]) : match[1]\n\n const match2 = id.match(pageId2Re)\n if (match2) return uuid ? match2[1] : match2[1].replace(/-/g, '')\n\n return null\n}\n","export const uuidToId = (uuid: string) => uuid.replace(/-/g, '')\n","import type { ExtendedRecordMap, Block, Collection } from '@texonom/ntypes'\n\nexport function findAncestors(recordMap: ExtendedRecordMap, block: Block | Collection, list: string[] = []): string[] {\n if (block.parent_id) {\n list.push(block.parent_id)\n const table = block.parent_table as 'block' | 'collection'\n if (recordMap[table]?.[block.parent_id]?.value)\n return findAncestors(recordMap, recordMap[table][block.parent_id].value, list)\n }\n return list\n}\n","import { findAncestors } from './find-ancestors'\nimport { getPageContentBlockIds } from './get-page-content-block-ids'\nimport { getBlockTitle } from './get-block-title'\n\nimport type { ExtendedRecordMap, PageMap, PageChunk, BlockMap } from '@texonom/ntypes'\n\nexport type PageTree = {\n id: string\n type: string\n title: string\n blocks: number\n pages: number\n parent?: PageTree\n children: PageTree[]\n}\n\ntype FetchOption = RequestInit & { timeout?: number }\n\n/**\n * Performs a traversal over a given Notion workspace starting from a seed page.\n *\n * Returns a map containing all of the pages that are reachable from the seed\n * page in the space.\n *\n * If `rootSpaceId` is not defined, the space ID of the root page will be used\n * to scope traversal.\n *\n *\n * @param rootPageId - Page ID to start from.\n * @param rootSpaceId - Space ID to scope traversal.\n * @param getPage - Function used to fetch a single page.\n * @param opts - Optional config\n */\nexport async function getAllInSpace(\n startPageId: string,\n getPage: (pageId: string, { fetchOption }?: { fetchOption?: FetchOption }) => Promise<ExtendedRecordMap>,\n getBlocks: (blockIds: string[], fetchOption?: FetchOption) => Promise<PageChunk>,\n fetchCollections: (\n contentBlockIds: string[],\n recordMap: ExtendedRecordMap,\n pageId?: string,\n {\n fetchOption,\n concurrency,\n collectionConcurrency\n }?: { fetchOption?: FetchOption; concurrency: number; collectionConcurrency?: number }\n ) => Promise<ExtendedRecordMap>,\n {\n startRecordMap,\n fetchOption = { timeout: 100000 },\n maxPage,\n debug,\n concurrency = 100,\n collectionConcurrency = 100\n }: {\n startRecordMap?: ExtendedRecordMap\n fetchOption?: FetchOption\n concurrency?: number\n maxPage?: number\n debug?: boolean\n collectionConcurrency?: number\n } = {}\n): Promise<{ recordMap: ExtendedRecordMap; pageMap: PageMap; pageTree: PageTree }> {\n const pageMap: PageMap = {}\n const recordMap = startRecordMap ? startRecordMap : await getPage(startPageId, { fetchOption })\n\n let tempRecordMap: ExtendedRecordMap = JSON.parse(JSON.stringify(recordMap))\n\n if (debug) console.time('Total fetch time')\n let iteration = 1\n while (true) {\n if (debug) console.debug(`Iteration ${iteration}`)\n if (debug) console.debug('block length ', Object.keys(recordMap.block).length)\n\n if (debug) console.time('getPageContentBlockIds')\n const targetBlocks = Object.keys(tempRecordMap.block)\n const missing = Object.keys(\n targetBlocks.reduce((blockMap, root) => {\n const contentBlockIds = getPageContentBlockIds(recordMap, root, true)\n for (const contentBlockID of contentBlockIds) if (!recordMap.block[contentBlockID]) blockMap[contentBlockID] = true\n return blockMap\n }, {})\n )\n for (const { value: block } of Object.values(tempRecordMap.block))\n if (block && !recordMap.block[block.parent_id] && block.parent_table === 'block') missing.push(block.parent_id)\n if (debug) console.timeEnd('getPageContentBlockIds')\n\n if (debug) console.time('getBlocks')\n tempRecordMap = (await getBlocks(missing, fetchOption)).recordMap as ExtendedRecordMap\n if (debug) console.timeEnd('getBlocks')\n if (!tempRecordMap?.block) break\n\n if (debug) console.time('mapBlocks')\n const contentBlockIds = Object.values(recordMap.block)\n .map(obj => obj.value?.id)\n .filter(Boolean)\n recordMap.block = { ...recordMap.block, ...tempRecordMap.block }\n if (debug) console.timeEnd('mapBlocks')\n\n if (debug) console.time('fetchCollections')\n await fetchCollections(contentBlockIds, recordMap, undefined, { fetchOption, concurrency, collectionConcurrency })\n if (debug) console.timeEnd('fetchCollections')\n if (debug) console.debug('collection query length ' + Object.keys(recordMap.collection_query).length)\n\n if (debug) console.debug('new block length ', Object.keys(tempRecordMap.block).length)\n const pageLength = Object.values(recordMap.block)\n .map(obj => obj.value?.type)\n .filter(type => type === 'page').length\n if (debug) console.debug('page length ', pageLength)\n if (Number.isInteger(maxPage) && pageLength >= maxPage) break\n\n if (debug) console.debug(`memory usage ${process.memoryUsage().rss / 1024 / 1024}MB`)\n iteration += 1\n if (debug) console.debug()\n }\n if (debug) console.timeEnd('Total fetch time')\n\n if (debug) console.time('get page map')\n if (debug) console.debug('Total block length ', Object.keys(recordMap.block).length)\n const blockIds = Object.keys(recordMap.block)\n\n const promises = []\n for (const blockId of blockIds)\n if (recordMap.block[blockId].value?.type === 'page') {\n promises.push(getPageSync(blockId, recordMap, getBlocks).then(pageRecordMap => (pageMap[blockId] = pageRecordMap)))\n await sleep(1)\n }\n await Promise.all(promises)\n\n if (debug) console.timeEnd('get page map')\n if (debug) console.debug('Total page length ', Object.keys(pageMap).length)\n\n if (debug) console.time('get page tree')\n const pageTree = {\n id: startPageId,\n title: getBlockTitle(recordMap.block[startPageId].value, recordMap),\n blocks: 1,\n pages: 1,\n children: [],\n type: 'page'\n }\n recursivePageTree(recordMap, pageTree)\n if (debug) console.timeEnd('get page tree')\n\n return { pageMap, pageTree, recordMap }\n}\n\nexport function recursivePageTree(recordMap: ExtendedRecordMap, pageTree: PageTree): PageTree {\n // Save ancestors to update the count\n const ancestors = [pageTree]\n let ancestor = pageTree\n while (true)\n if (ancestor.parent) {\n ancestors.push(ancestor.parent)\n ancestor = ancestor.parent\n } else {\n break\n }\n\n const current = recordMap.block[pageTree.id]?.value\n if (!current) {\n console.warn(`No block value for ${pageTree.id}`)\n delete pageTree.parent\n return pageTree\n }\n\n if (current.content?.length) {\n for (const ancestor of ancestors) ancestor.blocks += current.content.length\n for (const contentBlockId of current.content) {\n const block = recordMap.block[contentBlockId]?.value\n if (!block) continue\n pageTree.children.push(\n recursivePageTree(recordMap, {\n id: contentBlockId,\n title: getBlockTitle(block, recordMap),\n blocks: 1,\n pages: 0,\n children: [],\n type: block.type,\n parent: pageTree\n })\n )\n if (block.type === 'page') for (const ancestor of ancestors) ancestor.pages++\n }\n } else if (current?.type === 'collection_view') {\n const collectionQuery = recordMap.collection_query[current.collection_id]?.[current.view_ids[0]]\n if (!collectionQuery) {\n console.warn(`No collection query for ${pageTree.id}`)\n delete pageTree.parent\n return pageTree\n }\n const childrenMap = {}\n for (const collectionQuery of Object.values(recordMap.collection_query[current.collection_id]))\n if (collectionQuery.collection_group_results.blockIds)\n for (const blockId of collectionQuery.collection_group_results.blockIds) childrenMap[blockId] = true\n const childrenPages = Object.keys(childrenMap)\n for (const ancestor of ancestors) ancestor.pages += childrenPages.length\n for (const ancestor of ancestors) ancestor.blocks += childrenPages.length\n for (const blockId of childrenPages)\n pageTree.children.push(\n recursivePageTree(recordMap, {\n id: blockId,\n title: getBlockTitle(recordMap.block[blockId].value, recordMap),\n blocks: childrenPages.length,\n pages: childrenPages.length,\n children: [],\n type: current.type,\n parent: pageTree\n })\n )\n }\n delete pageTree.parent\n return pageTree\n}\n\nexport async function getPageSync(\n pageId: string,\n recordMap: ExtendedRecordMap,\n getBlocks: (blockIds: string[], fetchOption?: FetchOption) => Promise<PageChunk>\n): Promise<ExtendedRecordMap> {\n let contentBlockIds = getPageContentBlockIds(recordMap, pageId)\n let blockMap: BlockMap = { [pageId]: { value: recordMap.block[pageId].value, role: 'reader' } }\n const collectionMap = {}\n const collectionViewMap = {}\n const collectionQueryMap = {}\n\n const missing = []\n for (const contentBlockId of contentBlockIds) {\n const block = recordMap.block[contentBlockId]?.value\n if (!block) {\n missing.push(contentBlockId)\n continue\n }\n blockMap[contentBlockId] = { value: block, role: 'reader' }\n if (block.type === 'collection_view' || block.type === 'collection_view_page') {\n if (recordMap.collection[block.collection_id])\n collectionMap[block.collection_id] = recordMap.collection[block.collection_id]\n if (recordMap.collection_query[block.collection_id])\n collectionQueryMap[block.collection_id] = recordMap.collection_query[block.collection_id]\n for (const viewId of block.view_ids)\n if (recordMap.collection_view[viewId]) {\n collectionViewMap[viewId] = recordMap.collection_view[viewId]\n const blockIds = recordMap.collection_query[block?.collection_id]?.[viewId]?.collection_group_results?.blockIds\n if (blockIds?.length)\n for (const blockId of blockIds) {\n const block = recordMap.block[blockId]?.value\n if (block) blockMap[blockId] = { value: block, role: 'reader' }\n else missing.push(blockId)\n }\n }\n }\n }\n\n // Ancestor\n const ancesters = findAncestors(recordMap, recordMap.block[pageId].value)\n for (const ancester of ancesters) {\n const block = recordMap.block[ancester]?.value\n if (block) blockMap[ancester] = { value: block, role: 'reader' }\n const collection = recordMap.collection[ancester]?.value\n if (collection) collectionMap[ancester] = { value: collection }\n }\n\n // Alias\n for (const blockId of Object.keys(blockMap)) {\n const block = blockMap[blockId].value\n let targetBlock = block\n if (block?.type === 'alias')\n while (true) {\n const alias = targetBlock?.format?.alias_pointer?.id\n if (!alias) break\n targetBlock = recordMap.block[alias]?.value\n if (!targetBlock) missing.push(alias)\n else blockMap[alias] = { value: targetBlock, role: 'reader' }\n }\n }\n\n // Missing\n if (missing.length) {\n const responseMap = (await getBlocks(missing).catch(() => ({ recordMap: { block: null } }))).recordMap\n if (responseMap?.block) {\n blockMap = { ...blockMap, ...responseMap.block }\n for (const blockId in responseMap.block) recordMap.block[blockId] = responseMap.block[blockId]\n } else {\n console.warn(`fetching ${missing.length} fail for ${pageId}`)\n }\n }\n\n contentBlockIds = getPageContentBlockIds(recordMap, pageId)\n for (const contentBlockId of contentBlockIds) {\n const block = recordMap.block[contentBlockId]?.value\n if (!block) continue\n blockMap[contentBlockId] = { value: block, role: 'reader' }\n if (block.type === 'collection_view' || block.type === 'collection_view_page') {\n if (recordMap.collection[block.collection_id])\n collectionMap[block.collection_id] = recordMap.collection[block.collection_id]\n if (recordMap.collection_query[block.collection_id])\n collectionQueryMap[block.collection_id] = recordMap.collection_query[block.collection_id]\n for (const viewId of block.view_ids)\n if (recordMap.collection_view[viewId]) {\n collectionViewMap[viewId] = recordMap.collection_view[viewId]\n const blockIds = recordMap.collection_query[block?.collection_id]?.[viewId]?.collection_group_results?.blockIds\n if (blockIds?.length)\n for (const blockId of blockIds) {\n const block = recordMap.block[blockId]?.value\n if (block) blockMap[blockId] = { value: block, role: 'reader' }\n }\n }\n }\n }\n\n return {\n block: blockMap,\n collection: collectionMap,\n collection_view: collectionViewMap,\n collection_query: collectionQueryMap,\n signed_urls: {},\n notion_user: {}\n }\n}\n\nconst sleep = async (ms: number) => new Promise(resolve => setTimeout(resolve, ms))\n","export const normalizeTitle = (title?: string | null): string => {\n return (title || '')\n .replace(/( |\\/)/g, '-') // Replace spaces and slashes with dashes\n .replace(/[^a-zA-Z0-9-\\u4e00-\\u9FFF\\uAC00-\\uD7AF\\u3130-\\u318F\\u3041-\\u3096\\u30A1-\\u30FC\\u3000-\\u303F]/g, '') // Retain Korean characters\n .replace(/--+/g, '-') // Replace multiple dashes with a single dash\n .replace(/^-+|-+$/g, '') // Trim leading and trailing dashes\n .trim()\n .toLowerCase()\n}\n","import { getBlockTitle } from './get-block-title'\nimport { getPageProperty } from './get-page-property'\nimport { normalizeTitle } from './normalize-title'\nimport { getTextContent } from './get-text-content'\nimport { uuidToId } from './uuid-to-id'\n\nimport type { ExtendedRecordMap } from '@texonom/ntypes'\n\n/**\n * Gets the canonical, display-friendly version of a page's ID for use in URLs.\n */\nexport const getCanonicalPageId = (\n pageId: string,\n recordMap: ExtendedRecordMap,\n { uuid = true }: { uuid?: boolean } = {}\n): string | null => {\n if (!pageId || !recordMap) return null\n\n const id = uuidToId(pageId)\n const block = recordMap.block[pageId]?.value\n\n if (block) {\n const slug =\n (getPageProperty('slug', block, recordMap) as string | null) || normalizeTitle(getBlockTitle(block, recordMap))\n\n if (slug)\n if (uuid) return `${slug}-${id}`\n else return slug\n } else {\n const collection = recordMap.collection[pageId]?.value\n if (collection) {\n const slug = normalizeTitle(getTextContent(collection.name))\n if (slug)\n if (uuid) return `${slug}-${id}`\n else return slug\n }\n }\n\n return id\n}\n","import { getBlockIcon } from './get-block-icon'\nimport { getBlockParentPage } from './get-block-parent-page'\nimport { getBlockTitle } from './get-block-title'\n\nimport type { ExtendedRecordMap } from '@texonom/ntypes'\n\nexport const getPageBreadcrumbs = (recordMap: ExtendedRecordMap, activePageId: string): Array<any> | null => {\n const blockMap = recordMap.block\n const breadcrumbs = []\n\n let currentPageId = activePageId\n\n do {\n const block = blockMap[currentPageId]?.value\n if (!block) break\n\n const title = getBlockTitle(block, recordMap)\n const icon = getBlockIcon(block, recordMap)\n\n if (!(title || icon)) break\n\n breadcrumbs.push({\n block,\n active: currentPageId === activePageId,\n pageId: currentPageId,\n title,\n icon\n })\n\n const parentBlock = getBlockParentPage(block, recordMap)\n const parentId = parentBlock?.id\n\n if (!parentId) break\n\n currentPageId = parentId\n\n // eslint-disable-next-line no-constant-condition\n } while (true)\n\n breadcrumbs.reverse()\n\n return breadcrumbs\n}\n","import { getBlockIcon } from './get-block-icon'\nimport { isUrl } from './is-url'\n\nimport type { Block, ExtendedRecordMap } from '@texonom/ntypes'\n\n/**\n * Gets URLs of all images contained on the given page.\n */\nexport const getPageImageUrls = (\n recordMap: ExtendedRecordMap,\n {\n mapImageUrl\n }: {\n mapImageUrl: (url: string, block: Block) => string | null\n }\n): string[] => {\n const blockIds = Object.keys(recordMap.block)\n const imageUrls: string[] = blockIds\n .flatMap(blockId => {\n const block = recordMap.block[blockId]?.value\n const images: Array<{ block: Block; url: string }> = []\n\n if (block) {\n if (block.type === 'image') {\n const signedUrl = recordMap.signed_urls?.[block.id]\n let source = signedUrl || block.properties?.source?.[0]?.[0]\n if (source.includes('file.notion.so')) source = block.properties?.source?.[0]?.[0]\n\n if (source)\n images.push({\n block,\n url: source\n })\n }\n\n if (block.format?.page_cover) {\n const source = block.format.page_cover\n\n images.push({\n block,\n url: source\n })\n }\n\n if (block.format?.bookmark_cover) {\n const source = block.format.bookmark_cover\n\n images.push({\n block,\n url: source\n })\n }\n\n if (block.format?.bookmark_icon) {\n const source = block.format.bookmark_icon\n\n images.push({\n block,\n url: source\n })\n }\n\n const pageIcon = getBlockIcon(block, recordMap)\n if (pageIcon && isUrl(pageIcon))\n images.push({\n block,\n url: pageIcon\n })\n }\n\n return images\n })\n .filter(Boolean)\n .map(({ block, url }) => mapImageUrl(url, block))\n .filter(Boolean)\n\n return Array.from(new Set(imageUrls))\n}\n","import mem from 'mem'\nimport normalizeUrlImpl from 'normalize-url'\n\nexport const normalizeUrl = mem((url?: string) => {\n if (!url) return ''\n\n try {\n if (url.startsWith('https://www.notion.so/image/')) {\n const u = new URL(url)\n const subUrl = decodeURIComponent(u.pathname.substring('/image/'.length))\n const normalizedSubUrl = normalizeUrl(subUrl)\n u.pathname = `/image/${encodeURIComponent(normalizedSubUrl)}`\n url = u.toString()\n }\n\n return normalizeUrlImpl(url, {\n stripProtocol: true,\n stripWWW: true,\n stripHash: true,\n stripTextFragment: true,\n removeQueryParameters: true\n })\n } catch (err) {\n return ''\n }\n})\n","import type { ExtendedRecordMap } from '@texonom/ntypes'\n\nexport function mergeRecordMaps(recordMapA: ExtendedRecordMap, recordMapB: ExtendedRecordMap): ExtendedRecordMap {\n const mergedRecordMap: ExtendedRecordMap = {\n block: {\n ...recordMapA.block,\n ...recordMapB.block\n },\n collection: {\n ...recordMapA.collection,\n ...recordMapB.collection\n },\n collection_view: {\n ...recordMapA.collection_view,\n ...recordMapB.collection_view\n },\n notion_user: {\n ...recordMapA.notion_user,\n ...recordMapB.notion_user\n },\n collection_query: {\n ...recordMapA.collection_query,\n ...recordMapB.collection_query\n },\n signed_urls: {\n ...recordMapA.signed_urls,\n ...recordMapB.signed_urls\n },\n preview_images: {\n ...recordMapA.preview_images,\n ...recordMapB.preview_images\n }\n }\n\n return mergedRecordMap\n}\n","export const formatDate = (input: string | number, { month = 'short' }: { month?: 'long' | 'short' } = {}) => {\n const date = new Date(input)\n const monthLocale = date.toLocaleString('en-US', { month })\n return `${date.getUTCFullYear()} ${monthLocale} ${date.getUTCDate()} ${date.getUTCHours()}:${date.getUTCMinutes()}`\n}\n","import { formatDate } from './format-date'\n\nexport interface NotionDateTime {\n type: 'datetime'\n start_date: string\n start_time?: string\n time_zone?: string\n}\n\nexport const formatNotionDateTime = (datetime: NotionDateTime) => {\n const dateString = `${datetime.start_time || ''} ${datetime.start_date} ${datetime.time_zone || ''}`\n return formatDate(dateString)\n}\n","import { Block, ExtendedRecordMap, PageBlock } from '@texonom/ntypes'\n\nimport { getBlockTitle } from './get-block-title'\nimport { getPageTableOfContents } from './get-page-table-of-contents'\n\ntype EstimatePageReadTimeOptions = {\n wordsPerMinute?: number\n imageReadTimeInSeconds?: number\n}\n\ntype ContentStats = {\n numWords: number\n numImages: number\n}\n\ntype PageReadTimeEstimate = ContentStats & {\n totalWordsReadTimeInMinutes: number\n totalImageReadTimeInMinutes: number\n totalReadTimeInMinutes: number\n}\n\n/**\n * Returns an estimate for the time it would take for a person to read the content\n * in the given Notion page.\n *\n * Uses Medium for inspiration.\n *\n * @see https://blog.medium.com/read-time-and-you-bc2048ab620c\n * @see https://github.com/ngryman/reading-time\n *\n * TODO: handle non-english content.\n */\nexport function estimatePageReadTime(\n block: Block,\n recordMap: ExtendedRecordMap,\n { wordsPerMinute = 275, imageReadTimeInSeconds = 12 }: EstimatePageReadTimeOptions = {}\n): PageReadTimeEstimate {\n const stats = getBlockContentStats(block, recordMap)\n const totalWordsReadTimeInMinutes = stats.numWords / wordsPerMinute\n const totalImageReadTimeInSeconds =\n stats.numImages > 10\n ? (stats.numImages / 2) * (imageReadTimeInSeconds + 3) + (stats.numImages - 10) * 3 // n/2(a+b) + 3 sec/image\n : (stats.numImages / 2) * (2 * imageReadTimeInSeconds + (1 - stats.numImages)) // n/2[2a+(n-1)d]\n const totalImageReadTimeInMinutes = totalImageReadTimeInSeconds / 60\n\n const totalReadTimeInMinutes = totalWordsReadTimeInMinutes + totalImageReadTimeInMinutes\n\n return {\n ...stats,\n totalWordsReadTimeInMinutes,\n totalImageReadTimeInMinutes,\n totalReadTimeInMinutes\n }\n}\n\n/**\n * Same as `estimatePageReadTime`, except it returns the total time estimate as\n * a human-readable string.\n *\n * For example, \"9 minutes\" or \"less than a minute\".\n */\nexport function estimatePageReadTimeAsHumanizedString(\n block: Block,\n recordMap: ExtendedRecordMap,\n opts: EstimatePageReadTimeOptions\n) {\n const estimate = estimatePageReadTime(block, recordMap, opts)\n return humanizeReadTime(estimate.totalReadTimeInMinutes)\n}\n\nfunction getBlockContentStats(block: Block, recordMap: ExtendedRecordMap): ContentStats {\n const stats: ContentStats = {\n numWords: 0,\n numImages: 0\n }\n\n if (!block) return stats\n\n for (const childId of block.content || []) {\n const child = recordMap.block[childId]?.value\n let recurse = false\n if (!child) continue\n\n switch (child.type) {\n case 'quote':\n // fallthrough\n case 'alias':\n // fallthrough\n case 'header':\n // fallthrough\n case 'sub_header':\n // fallthrough\n case 'sub_sub_header': {\n const title = getBlockTitle(child, recordMap)\n stats.numWords += countWordsInText(title)\n break\n }\n\n case 'callout':\n // fallthrough\n case 'toggle':\n // fallthrough\n case 'to_do':\n // fallthrough\n case 'bulleted_list':\n // fallthrough\n case 'numbered_list':\n // fallthrough\n case 'text': {\n const title = getBlockTitle(child, recordMap)\n stats.numWords += countWordsInText(title)\n recurse = true\n break\n }\n\n case 'embed':\n // fallthrough\n case 'tweet':\n // fallthrough\n case 'maps':\n // fallthrough\n case 'pdf':\n // fallthrough\n case 'figma':\n // fallthrough\n case 'typeform':\n // fallthrough\n case 'codepen':\n // fallthrough\n case 'excalidraw':\n // fallthrough\n case 'gist':\n // fallthrough\n case 'video':\n // fallthrough\n case 'drive':\n // fallthrough\n case 'audio':\n // fallthrough\n case 'file':\n // fallthrough\n case 'image':\n // treat all embeds as images\n stats.numImages += 1\n break\n\n case 'bookmark':\n // treat bookmarks as quarter images since they aren't as content-ful as embedd images\n stats.numImages += 0.25\n break\n\n case 'code':\n // treat code blocks as double the complexity of images\n stats.numImages += 2\n break\n\n case 'table':\n // fallthrough\n case 'collection_view':\n // treat collection views as double the complexity of images\n stats.numImages += 2\n break\n\n case 'column':\n // fallthrough\n case 'column_list':\n // fallthrough\n case 'transclusion_container':\n recurse = true\n break\n\n case 'table_of_contents': {\n const page = block as PageBlock\n if (!page) continue\n\n const toc = getPageTableOfContents(page, recordMap)\n for (const tocItem of toc) stats.numWords += countWordsInText(tocItem.text)\n\n break\n }\n\n case 'transclusion_reference': {\n const referencePointerId = child?.format?.transclusion_reference_pointer?.id\n\n if (!referencePointerId) continue\n\n const referenceBlock = recordMap.block[referencePointerId]?.value\n if (referenceBlock) mergeContentStats(stats, getBlockContentStats(referenceBlock, recordMap))\n\n break\n }\n\n default:\n // ignore unrecognized blocks\n break\n }\n\n if (recurse) mergeContentStats(stats, getBlockContentStats(child, recordMap))\n }\n\n return stats\n}\n\nfunction mergeContentStats(statsA: ContentStats, statsB: ContentStats) {\n statsA.numWords += statsB.numWords\n statsA.numImages += statsB.numImages\n}\n\nfunction countWordsInText(text: string): number {\n if (!text) return 0\n\n return (text.match(/\\w+/g) || []).length\n}\n\nfunction humanizeReadTime(time: number): string {\n if (time < 0.5) return 'less than a minute'\n\n if (time < 1.5) return '1 minute'\n\n return `${Math.ceil(time)} minutes`\n}\n","import { Block } from '@texonom/ntypes'\n\nexport const defaultMapImageUrl = (url: string, block: Block): string | null => {\n if (!url) return null\n\n if (url.startsWith('data:')) return url\n\n // more recent versions of notion don't proxy unsplash images\n if (url.startsWith('https://images.unsplash.com')) return url\n\n // Don't proxy external URLs that aren't from Notion or AWS S3\n // The notion.so/image/ proxy frequently fails for arbitrary external URLs\n try {\n const u = new URL(url)\n if (\n (u.protocol === 'https:' || u.protocol === 'http:') &&\n !u.hostname.endsWith('.notion.so') &&\n !u.hostname.endsWith('.amazonaws.com') &&\n u.hostname !== 'www.notion.so' &&\n u.hostname !== 'notion.so'\n )\n return url\n } catch {\n // ignore invalid urls\n }\n\n try {\n const u = new URL(url)\n\n if (u.pathname.startsWith('/secure.notion-static.com') && u.hostname.endsWith('.amazonaws.com'))\n if (\n u.searchParams.has('X-Amz-Credential') &&\n u.searchParams.has('X-Amz-Signature') &&\n u.searchParams.has('X-Amz-Algorithm')\n )\n // if the URL is already signed, then use it as-is\n return url\n } catch {\n // ignore invalid urls\n }\n\n if (url.startsWith('/images')) url = `https://www.notion.so${url}`\n\n url = `https://www.notion.so${url.startsWith('/image') ? url : `/image/${encodeURIComponent(url)}`}`\n\n const notionImageUrlV2 = new URL(url)\n let table = block.parent_table === 'space' ? 'block' : block.parent_table\n if (table === 'collection' || table === 'team') table = 'block'\n\n notionImageUrlV2.searchParams.set('table', table)\n notionImageUrlV2.searchParams.set('id', block.id)\n notionImageUrlV2.searchParams.set('cache', 'v2')\n\n url = notionImageUrlV2.toString()\n\n return url\n}\n","export const defaultMapPageUrl = (rootPageId?: string) => (pageId: string) => {\n pageId = (pageId || '').replace(/-/g, '')\n\n if (rootPageId && pageId === rootPageId) return '/'\n else return `/${pageId}`\n}\n"],"names":["getTextContent","text","_a","prev","current","getBlockCollectionId","block","recordMap","collectionId","_b","collectionViewId","_c","collectionView","_e","_d","_g","_f","getBlockTitle","collection","getBlockIcon","getPageTitle","pageBlock","getPageProperty","propertyName","propertyNameL","propertyId","key","type","content","formatDate","start_date","start_time","end_date","end_time","startTime","endTime","e","getDateValue","prop","v","value","getBlockParentPage","inclusive","currentRecord","parentId","parentTable","getBlockParent","indentLevels","getPageTableOfContents","page","toc","blockId","indentLevelStack","tocItem","indentLevel","actual","prevIndent","prevActual","prevEffective","getPageContentBlockIds","locust","rootBlockId","contentBlockIds","addContentBlocks","properties","format","p","d","referenceId","getPageContentUserIds","contentUserIDs","idToUuid","id","pageIdRe","pageId2Re","parsePageId","uuid","match","match2","uuidToId","findAncestors","list","table","getAllInSpace","_0","_1","_2","_3","__async","startPageId","getPage","getBlocks","fetchCollections","startRecordMap","fetchOption","maxPage","debug","concurrency","collectionConcurrency","pageMap","tempRecordMap","iteration","targetBlocks","missing","blockMap","root","contentBlockID","obj","__spreadValues","pageLength","blockIds","promises","getPageSync","pageRecordMap","sleep","pageTree","recursivePageTree","ancestors","ancestor","contentBlockId","childrenMap","collectionQuery","childrenPages","pageId","collectionMap","collectionViewMap","collectionQueryMap","viewId","ancesters","ancester","targetBlock","alias","_i","_h","_j","responseMap","_k","_n","_m","_l","_o","ms","resolve","normalizeTitle","title","getCanonicalPageId","slug","getPageBreadcrumbs","activePageId","breadcrumbs","currentPageId","icon","parentBlock","getPageImageUrls","mapImageUrl","imageUrls","images","source","pageIcon","isUrl","url","normalizeUrl","mem","u","subUrl","normalizedSubUrl","normalizeUrlImpl","err","mergeRecordMaps","recordMapA","recordMapB","input","month","date","monthLocale","formatNotionDateTime","datetime","dateString","estimatePageReadTime","wordsPerMinute","imageReadTimeInSeconds","stats","getBlockContentStats","totalWordsReadTimeInMinutes","totalImageReadTimeInMinutes","totalReadTimeInMinutes","__spreadProps","estimatePageReadTimeAsHumanizedString","opts","estimate","humanizeReadTime","childId","child","recurse","countWordsInText","referencePointerId","referenceBlock","mergeContentStats","statsA","statsB","time","defaultMapImageUrl","notionImageUrlV2","defaultMapPageUrl","rootPageId"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"map-image-url.d.ts","sourceRoot":"","sources":["../src/map-image-url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAEvC,eAAO,MAAM,kBAAkB,GAAI,KAAK,MAAM,EAAE,OAAO,KAAK,KAAG,MAAM,GAAG,IAsCvE,CAAA"}
1
+ {"version":3,"file":"map-image-url.d.ts","sourceRoot":"","sources":["../src/map-image-url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAEvC,eAAO,MAAM,kBAAkB,GAAI,KAAK,MAAM,EAAE,OAAO,KAAK,KAAG,MAAM,GAAG,IAsDvE,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@texonom/nutils",
3
- "version": "1.5.1",
3
+ "version": "1.5.3",
4
4
  "type": "module",
5
5
  "description": "Useful utilities for working with Notion data. Isomorphic.",
6
6
  "repository": "texonom/notion-node",
@@ -30,7 +30,7 @@
30
30
  "mem": "^10.0.0",
31
31
  "normalize-url": "^8.1.1",
32
32
  "p-queue": "^9.1.0",
33
- "@texonom/ntypes": "^1.5.1"
33
+ "@texonom/ntypes": "^1.5.3"
34
34
  },
35
35
  "standard-version": {
36
36
  "skip": {