@intentic/fileq 1.317.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +46 -0
  3. package/dist/app.d.ts +2 -0
  4. package/dist/app.d.ts.map +1 -0
  5. package/dist/app.js +43 -0
  6. package/dist/app.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +4 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/commands/derive.command.d.ts +5 -0
  12. package/dist/commands/derive.command.d.ts.map +1 -0
  13. package/dist/commands/derive.command.js +53 -0
  14. package/dist/commands/derive.command.js.map +1 -0
  15. package/dist/commands/git-attributes.command.d.ts +3 -0
  16. package/dist/commands/git-attributes.command.d.ts.map +1 -0
  17. package/dist/commands/git-attributes.command.js +12 -0
  18. package/dist/commands/git-attributes.command.js.map +1 -0
  19. package/dist/commands/read.command.d.ts +3 -0
  20. package/dist/commands/read.command.d.ts.map +1 -0
  21. package/dist/commands/read.command.js +126 -0
  22. package/dist/commands/read.command.js.map +1 -0
  23. package/dist/commands/sweep.command.d.ts +3 -0
  24. package/dist/commands/sweep.command.d.ts.map +1 -0
  25. package/dist/commands/sweep.command.js +41 -0
  26. package/dist/commands/sweep.command.js.map +1 -0
  27. package/dist/lib/archives.d.ts +18 -0
  28. package/dist/lib/archives.d.ts.map +1 -0
  29. package/dist/lib/archives.js +133 -0
  30. package/dist/lib/archives.js.map +1 -0
  31. package/dist/lib/derive.d.ts +32 -0
  32. package/dist/lib/derive.d.ts.map +1 -0
  33. package/dist/lib/derive.js +99 -0
  34. package/dist/lib/derive.js.map +1 -0
  35. package/dist/lib/derivers/archive.d.ts +3 -0
  36. package/dist/lib/derivers/archive.d.ts.map +1 -0
  37. package/dist/lib/derivers/archive.js +132 -0
  38. package/dist/lib/derivers/archive.js.map +1 -0
  39. package/dist/lib/derivers/deriver.d.ts +13 -0
  40. package/dist/lib/derivers/deriver.d.ts.map +1 -0
  41. package/dist/lib/derivers/deriver.js +8 -0
  42. package/dist/lib/derivers/deriver.js.map +1 -0
  43. package/dist/lib/derivers/docx.d.ts +6 -0
  44. package/dist/lib/derivers/docx.d.ts.map +1 -0
  45. package/dist/lib/derivers/docx.js +29 -0
  46. package/dist/lib/derivers/docx.js.map +1 -0
  47. package/dist/lib/derivers/epub.d.ts +3 -0
  48. package/dist/lib/derivers/epub.d.ts.map +1 -0
  49. package/dist/lib/derivers/epub.js +102 -0
  50. package/dist/lib/derivers/epub.js.map +1 -0
  51. package/dist/lib/derivers/html.d.ts +3 -0
  52. package/dist/lib/derivers/html.d.ts.map +1 -0
  53. package/dist/lib/derivers/html.js +18 -0
  54. package/dist/lib/derivers/html.js.map +1 -0
  55. package/dist/lib/derivers/image.d.ts +3 -0
  56. package/dist/lib/derivers/image.d.ts.map +1 -0
  57. package/dist/lib/derivers/image.js +42 -0
  58. package/dist/lib/derivers/image.js.map +1 -0
  59. package/dist/lib/derivers/ipynb.d.ts +3 -0
  60. package/dist/lib/derivers/ipynb.d.ts.map +1 -0
  61. package/dist/lib/derivers/ipynb.js +75 -0
  62. package/dist/lib/derivers/ipynb.js.map +1 -0
  63. package/dist/lib/derivers/media.d.ts +3 -0
  64. package/dist/lib/derivers/media.d.ts.map +1 -0
  65. package/dist/lib/derivers/media.js +45 -0
  66. package/dist/lib/derivers/media.js.map +1 -0
  67. package/dist/lib/derivers/odp.d.ts +3 -0
  68. package/dist/lib/derivers/odp.d.ts.map +1 -0
  69. package/dist/lib/derivers/odp.js +41 -0
  70. package/dist/lib/derivers/odp.js.map +1 -0
  71. package/dist/lib/derivers/ods.d.ts +3 -0
  72. package/dist/lib/derivers/ods.d.ts.map +1 -0
  73. package/dist/lib/derivers/ods.js +86 -0
  74. package/dist/lib/derivers/ods.js.map +1 -0
  75. package/dist/lib/derivers/odt.d.ts +4 -0
  76. package/dist/lib/derivers/odt.d.ts.map +1 -0
  77. package/dist/lib/derivers/odt.js +77 -0
  78. package/dist/lib/derivers/odt.js.map +1 -0
  79. package/dist/lib/derivers/pdf-furniture.d.ts +7 -0
  80. package/dist/lib/derivers/pdf-furniture.d.ts.map +1 -0
  81. package/dist/lib/derivers/pdf-furniture.js +76 -0
  82. package/dist/lib/derivers/pdf-furniture.js.map +1 -0
  83. package/dist/lib/derivers/pdf.d.ts +4 -0
  84. package/dist/lib/derivers/pdf.d.ts.map +1 -0
  85. package/dist/lib/derivers/pdf.js +79 -0
  86. package/dist/lib/derivers/pdf.js.map +1 -0
  87. package/dist/lib/derivers/pptx.d.ts +4 -0
  88. package/dist/lib/derivers/pptx.d.ts.map +1 -0
  89. package/dist/lib/derivers/pptx.js +51 -0
  90. package/dist/lib/derivers/pptx.js.map +1 -0
  91. package/dist/lib/derivers/profile.d.ts +3 -0
  92. package/dist/lib/derivers/profile.d.ts.map +1 -0
  93. package/dist/lib/derivers/profile.js +115 -0
  94. package/dist/lib/derivers/profile.js.map +1 -0
  95. package/dist/lib/derivers/rtf.d.ts +4 -0
  96. package/dist/lib/derivers/rtf.d.ts.map +1 -0
  97. package/dist/lib/derivers/rtf.js +187 -0
  98. package/dist/lib/derivers/rtf.js.map +1 -0
  99. package/dist/lib/derivers/xlsx.d.ts +3 -0
  100. package/dist/lib/derivers/xlsx.d.ts.map +1 -0
  101. package/dist/lib/derivers/xlsx.js +68 -0
  102. package/dist/lib/derivers/xlsx.js.map +1 -0
  103. package/dist/lib/env.d.ts +2 -0
  104. package/dist/lib/env.d.ts.map +1 -0
  105. package/dist/lib/env.js +5 -0
  106. package/dist/lib/env.js.map +1 -0
  107. package/dist/lib/flags.d.ts +2 -0
  108. package/dist/lib/flags.d.ts.map +1 -0
  109. package/dist/lib/flags.js +8 -0
  110. package/dist/lib/flags.js.map +1 -0
  111. package/dist/lib/formats.d.ts +6 -0
  112. package/dist/lib/formats.d.ts.map +1 -0
  113. package/dist/lib/formats.js +110 -0
  114. package/dist/lib/formats.js.map +1 -0
  115. package/dist/lib/sidecar.d.ts +30 -0
  116. package/dist/lib/sidecar.d.ts.map +1 -0
  117. package/dist/lib/sidecar.js +108 -0
  118. package/dist/lib/sidecar.js.map +1 -0
  119. package/dist/lib/sweep.d.ts +7 -0
  120. package/dist/lib/sweep.d.ts.map +1 -0
  121. package/dist/lib/sweep.js +56 -0
  122. package/dist/lib/sweep.js.map +1 -0
  123. package/dist/lib/tools.d.ts +2 -0
  124. package/dist/lib/tools.d.ts.map +1 -0
  125. package/dist/lib/tools.js +15 -0
  126. package/dist/lib/tools.js.map +1 -0
  127. package/dist/lib/xml.d.ts +3 -0
  128. package/dist/lib/xml.d.ts.map +1 -0
  129. package/dist/lib/xml.js +16 -0
  130. package/dist/lib/xml.js.map +1 -0
  131. package/dist/skill.d.ts +5 -0
  132. package/dist/skill.d.ts.map +1 -0
  133. package/dist/skill.js +75 -0
  134. package/dist/skill.js.map +1 -0
  135. package/dist/testing.d.ts +25 -0
  136. package/dist/testing.d.ts.map +1 -0
  137. package/dist/testing.js +220 -0
  138. package/dist/testing.js.map +1 -0
  139. package/dist/version.d.ts +2 -0
  140. package/dist/version.d.ts.map +1 -0
  141. package/dist/version.js +3 -0
  142. package/dist/version.js.map +1 -0
  143. package/package.json +89 -0
  144. package/src/app.ts +48 -0
  145. package/src/cli.integration.test.ts +200 -0
  146. package/src/cli.ts +6 -0
  147. package/src/commands/derive.command.ts +59 -0
  148. package/src/commands/git-attributes.command.ts +13 -0
  149. package/src/commands/read.command.ts +158 -0
  150. package/src/commands/sweep.command.ts +48 -0
  151. package/src/derivers.integration.test.ts +415 -0
  152. package/src/lib/archives.test.ts +72 -0
  153. package/src/lib/archives.ts +209 -0
  154. package/src/lib/derive.ts +132 -0
  155. package/src/lib/derivers/archive.ts +168 -0
  156. package/src/lib/derivers/deriver.ts +33 -0
  157. package/src/lib/derivers/docx.test.ts +38 -0
  158. package/src/lib/derivers/docx.ts +44 -0
  159. package/src/lib/derivers/epub.ts +130 -0
  160. package/src/lib/derivers/html.ts +21 -0
  161. package/src/lib/derivers/image.ts +54 -0
  162. package/src/lib/derivers/ipynb.ts +113 -0
  163. package/src/lib/derivers/load-cost.test.ts +44 -0
  164. package/src/lib/derivers/media.ts +51 -0
  165. package/src/lib/derivers/odp.ts +52 -0
  166. package/src/lib/derivers/ods.ts +104 -0
  167. package/src/lib/derivers/odt.ts +101 -0
  168. package/src/lib/derivers/pdf-furniture.test.ts +60 -0
  169. package/src/lib/derivers/pdf-furniture.ts +121 -0
  170. package/src/lib/derivers/pdf.ts +102 -0
  171. package/src/lib/derivers/pptx.ts +61 -0
  172. package/src/lib/derivers/profile.ts +172 -0
  173. package/src/lib/derivers/rtf.ts +233 -0
  174. package/src/lib/derivers/xlsx.ts +82 -0
  175. package/src/lib/env.ts +7 -0
  176. package/src/lib/formats.test.ts +50 -0
  177. package/src/lib/formats.ts +141 -0
  178. package/src/lib/sidecar.test.ts +60 -0
  179. package/src/lib/sidecar.ts +156 -0
  180. package/src/lib/sweep.ts +72 -0
  181. package/src/lib/tools.ts +16 -0
  182. package/src/lib/xml.ts +20 -0
  183. package/src/skill.ts +90 -0
  184. package/src/testing.ts +333 -0
@@ -0,0 +1,75 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { plural } from "@intentic/base/format";
3
+ const MAX_OUTPUT_LINES = 40;
4
+ const joined = (value) => (Array.isArray(value) ? value.join("") : (value ?? ""));
5
+ const linesOf = (value) => joined(value).trimEnd().split("\n");
6
+ const outputLines = (output, counters) => {
7
+ if (output.output_type === "stream") {
8
+ return linesOf(output.text);
9
+ }
10
+ if (output.output_type === "error") {
11
+ return [`${output.ename ?? "Error"}: ${output.evalue ?? ""}`.trimEnd()];
12
+ }
13
+ if (output.data === undefined) {
14
+ return [];
15
+ }
16
+ const plain = output.data["text/plain"];
17
+ if (plain !== undefined) {
18
+ return linesOf(plain);
19
+ }
20
+ counters.rich += 1;
21
+ return [`[${Object.keys(output.data).join(", ")} output omitted]`];
22
+ };
23
+ const codeCell = (cell, source, language, counters) => {
24
+ const block = [`\`\`\`${language}`, source, "```"];
25
+ const lines = (cell.outputs ?? []).flatMap((output) => outputLines(output, counters));
26
+ if (lines.length === 0) {
27
+ return block.join("\n");
28
+ }
29
+ const kept = lines.slice(0, MAX_OUTPUT_LINES);
30
+ if (lines.length > MAX_OUTPUT_LINES) {
31
+ counters.clipped += 1;
32
+ kept.push(`… ${lines.length - MAX_OUTPUT_LINES} more output lines`);
33
+ }
34
+ return [...block, "", "```text", ...kept, "```"].join("\n");
35
+ };
36
+ const sectionOf = (cell, language, counters) => {
37
+ const source = joined(cell.source).trimEnd();
38
+ if (cell.cell_type === "code") {
39
+ return codeCell(cell, source, language, counters);
40
+ }
41
+ if (source === "") {
42
+ return undefined;
43
+ }
44
+ return cell.cell_type === "markdown" ? source : ["```text", source, "```"].join("\n");
45
+ };
46
+ const notesOf = (cellCount, counters) => {
47
+ const notes = [];
48
+ if (cellCount === 0) {
49
+ notes.push("no cells in this notebook");
50
+ }
51
+ if (counters.clipped > 0) {
52
+ notes.push(`${plural(counters.clipped, "cell")}: output cut at ${MAX_OUTPUT_LINES} lines`);
53
+ }
54
+ if (counters.rich > 0) {
55
+ notes.push(`${plural(counters.rich, "rich output")} (images, HTML) omitted: a notebook's pictures need the notebook itself`);
56
+ }
57
+ return notes;
58
+ };
59
+ export const ipynbDeriver = {
60
+ name: "ipynb",
61
+ version: 1,
62
+ derive: async (absPath) => {
63
+ const notebook = JSON.parse(await readFile(absPath, "utf8"));
64
+ const language = notebook.metadata?.language_info?.name ?? notebook.metadata?.kernelspec?.language ?? "python";
65
+ const cells = Array.isArray(notebook.cells) ? notebook.cells : [];
66
+ const counters = { rich: 0, clipped: 0 };
67
+ const sections = cells.map((cell) => sectionOf(cell, language, counters)).filter((section) => section !== undefined);
68
+ const title = cells
69
+ .filter((cell) => cell.cell_type === "markdown")
70
+ .map((cell) => /^#\s+(.+)$/m.exec(joined(cell.source))?.[1]?.trim())
71
+ .find((heading) => heading !== undefined);
72
+ return { markdown: sections.join("\n\n"), title, notes: notesOf(cells.length, counters) };
73
+ },
74
+ };
75
+ //# sourceMappingURL=ipynb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipynb.js","sourceRoot":"","sources":["../../../src/lib/derivers/ipynb.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Deriver } from "./deriver.js";
2
+ export declare const mediaDeriver: Deriver;
3
+ //# sourceMappingURL=media.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../../src/lib/derivers/media.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,OAAO,EAAE,MAAM,cAAc,CAAC;AAYxD,eAAO,MAAM,YAAY,EAAE,OAsC1B,CAAC"}
@@ -0,0 +1,45 @@
1
+ const formatDuration = (seconds) => {
2
+ const whole = Math.round(seconds);
3
+ const minutes = Math.floor(whole / 60);
4
+ return minutes === 0 ? `${whole}s` : `${minutes}m ${String(whole % 60).padStart(2, "0")}s`;
5
+ };
6
+ export const mediaDeriver = {
7
+ name: "media",
8
+ version: 1,
9
+ derive: async (absPath) => {
10
+ const { parseFile } = await import("music-metadata");
11
+ const meta = await parseFile(absPath, { duration: true });
12
+ const lines = [];
13
+ const { format, common } = meta;
14
+ if (format.container !== undefined) {
15
+ lines.push(`- Container: ${format.container}${format.codec === undefined ? "" : ` (${format.codec})`}`);
16
+ }
17
+ if (format.duration !== undefined) {
18
+ lines.push(`- Duration: ${formatDuration(format.duration)}`);
19
+ }
20
+ if (format.sampleRate !== undefined) {
21
+ lines.push(`- Sample rate: ${format.sampleRate} Hz${format.numberOfChannels === undefined ? "" : `, ${format.numberOfChannels}ch`}`);
22
+ }
23
+ if (format.bitrate !== undefined) {
24
+ lines.push(`- Bitrate: ${Math.round(format.bitrate / 1000)} kbit/s`);
25
+ }
26
+ const tags = [
27
+ ["Title", common.title],
28
+ ["Artist", common.artist],
29
+ ["Album", common.album],
30
+ ["Year", common.year],
31
+ ["Genre", common.genre?.join(", ")],
32
+ ];
33
+ for (const [label, value] of tags) {
34
+ if (value !== undefined && value !== "") {
35
+ lines.push(`- ${label}: ${value}`);
36
+ }
37
+ }
38
+ return {
39
+ markdown: lines.join("\n"),
40
+ title: common.title,
41
+ notes: ["no transcript: audio transcription is a later, whisper-backed tier"],
42
+ };
43
+ },
44
+ };
45
+ //# sourceMappingURL=media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.js","sourceRoot":"","sources":["../../../src/lib/derivers/media.ts"],"names":[],"mappings":"AAMA,MAAM,cAAc,GAAG,CAAC,OAAe,EAAU,EAAE;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACvC,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;AAC/F,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAY;IACjC,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,CAAC;IACV,MAAM,EAAE,KAAK,EAAE,OAAO,EAAuB,EAAE;QAC3C,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAChC,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QAC5G,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,eAAe,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,UAAU,MAAM,MAAM,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;QACzI,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,IAAI,GAAgE;YACtE,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;YACvB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;YACzB,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;YACvB,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC;YACrB,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;SACtC,CAAC;QACF,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;YAChC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;gBACtC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC;YACvC,CAAC;QACL,CAAC;QACD,OAAO;YACH,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YAC1B,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,KAAK,EAAE,CAAC,oEAAoE,CAAC;SAChF,CAAC;IACN,CAAC;CACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Deriver } from "./deriver.js";
2
+ export declare const odpDeriver: Deriver;
3
+ //# sourceMappingURL=odp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"odp.d.ts","sourceRoot":"","sources":["../../../src/lib/derivers/odp.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAc,OAAO,EAAE,MAAM,cAAc,CAAC;AAuBxD,eAAO,MAAM,UAAU,EAAE,OA0BxB,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { unzipSync } from "fflate";
3
+ import { attributeOf, decodeEntities } from "../xml.js";
4
+ const PAGE = /<draw:page\b([^>]*)>([\s\S]*?)<\/draw:page>/g;
5
+ const NOTES = /<presentation:notes\b[^>]*>[\s\S]*?<\/presentation:notes>/g;
6
+ const PARAGRAPH = /<text:(p|h)\b[^>]*(?:\/>|>([\s\S]*?)<\/text:\1>)/g;
7
+ const lineOf = (inner) => decodeEntities(inner
8
+ .replaceAll(/<text:s\b[^>]*\/>/g, " ")
9
+ .replaceAll(/<text:tab\b[^>]*\/>/g, " ")
10
+ .replaceAll(/<text:line-break\b[^>]*\/>/g, " ")
11
+ .replaceAll(/<[^>]+>/g, ""))
12
+ .replaceAll(/\s+/g, " ")
13
+ .trim();
14
+ const linesOf = (xml) => [...xml.matchAll(PARAGRAPH)].map((match) => lineOf(match[2] ?? "")).filter((line) => line !== "");
15
+ export const odpDeriver = {
16
+ name: "odp",
17
+ version: 1,
18
+ derive: async (absPath) => {
19
+ const zip = unzipSync(new Uint8Array(await readFile(absPath)), { filter: (file) => file.name === "content.xml" });
20
+ const content = zip["content.xml"];
21
+ if (content === undefined) {
22
+ return { markdown: "", notes: ["no content.xml in this OpenDocument container"] };
23
+ }
24
+ const xml = new TextDecoder().decode(content);
25
+ const sections = [];
26
+ for (const page of xml.matchAll(PAGE)) {
27
+ const body = page[2] ?? "";
28
+ const slide = body.replaceAll(NOTES, "");
29
+ const notes = (body.match(NOTES) ?? []).flatMap((part) => linesOf(part)).filter((line) => !/^\d+$/.test(line));
30
+ const name = attributeOf(page[1] ?? "", "draw:name");
31
+ const heading = `## Slide ${sections.length + 1}${name === undefined || name === "" ? "" : `: ${name}`}`;
32
+ const section = [heading, ...linesOf(slide)];
33
+ if (notes.length > 0) {
34
+ section.push("", "Notes:", ...notes.map((line) => `> ${line}`));
35
+ }
36
+ sections.push(section.join("\n"));
37
+ }
38
+ return { markdown: sections.join("\n\n"), notes: sections.length === 0 ? ["no slides in this presentation"] : [] };
39
+ },
40
+ };
41
+ //# sourceMappingURL=odp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"odp.js","sourceRoot":"","sources":["../../../src/lib/derivers/odp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Deriver } from "./deriver.js";
2
+ export declare const odsDeriver: Deriver;
3
+ //# sourceMappingURL=ods.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ods.d.ts","sourceRoot":"","sources":["../../../src/lib/derivers/ods.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAc,OAAO,EAAE,MAAM,cAAc,CAAC;AAmFxD,eAAO,MAAM,UAAU,EAAE,OAkBxB,CAAC"}
@@ -0,0 +1,86 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { unzipSync } from "fflate";
3
+ import { attributeOf, decodeEntities } from "../xml.js";
4
+ const MAX_ROWS_PER_SHEET = 200;
5
+ const MAX_COLUMNS = 30;
6
+ const TABLE = /<table:table\b([^>]*)>([\s\S]*?)<\/table:table>/g;
7
+ const ROW = /<table:table-row\b([^>]*?)(?:\/>|>([\s\S]*?)<\/table:table-row>)/g;
8
+ const CELL = /<table:(covered-table-cell|table-cell)\b([^>]*?)(?:\/>|>([\s\S]*?)<\/table:\1>)/g;
9
+ const repeatOf = (attributes, name, limit) => {
10
+ const value = Number.parseInt(attributeOf(attributes, name) ?? "1", 10);
11
+ return Number.isFinite(value) && value > 0 ? Math.min(value, limit) : 1;
12
+ };
13
+ const cellText = (attributes, inner) => {
14
+ const shown = decodeEntities(inner
15
+ .replaceAll(/<text:s\b[^>]*\/>/g, " ")
16
+ .replaceAll(/<text:tab\b[^>]*\/>/g, " ")
17
+ .replaceAll(/<\/text:p>/g, " ")
18
+ .replaceAll(/<[^>]+>/g, ""))
19
+ .replaceAll(/\s+/g, " ")
20
+ .trim();
21
+ return shown === "" ? (attributeOf(attributes, "office:value") ?? "") : shown;
22
+ };
23
+ const trimEnd = (items, empty) => {
24
+ let end = items.length;
25
+ while (end > 0 && empty(items[end - 1])) {
26
+ end -= 1;
27
+ }
28
+ return items.slice(0, end);
29
+ };
30
+ const cellsOf = (xml) => {
31
+ const cells = [];
32
+ for (const cell of xml.matchAll(CELL)) {
33
+ const attributes = cell[2] ?? "";
34
+ const text = cell[1] === "covered-table-cell" ? "" : cellText(attributes, cell[3] ?? "");
35
+ for (let repeat = 0; repeat < repeatOf(attributes, "table:number-columns-repeated", MAX_COLUMNS); repeat += 1) {
36
+ cells.push(text);
37
+ }
38
+ }
39
+ return trimEnd(cells, (cell) => cell === "");
40
+ };
41
+ const rowsOf = (xml) => {
42
+ const rows = [];
43
+ for (const row of xml.matchAll(ROW)) {
44
+ const cells = cellsOf(row[2] ?? "");
45
+ for (let repeat = 0; repeat < repeatOf(row[1] ?? "", "table:number-rows-repeated", MAX_ROWS_PER_SHEET); repeat += 1) {
46
+ rows.push(cells);
47
+ }
48
+ }
49
+ return trimEnd(rows, (row) => row.length === 0);
50
+ };
51
+ const tableRow = (cells) => `| ${cells.map((cell) => cell.replaceAll("|", "\\|")).join(" | ")} |`;
52
+ const sectionOf = (name, rows, notes) => {
53
+ if (rows.length === 0) {
54
+ return `## ${name}\n\n(empty sheet)`;
55
+ }
56
+ const width = Math.min(MAX_COLUMNS, Math.max(...rows.map((row) => row.length)));
57
+ if (Math.max(...rows.map((row) => row.length)) > MAX_COLUMNS) {
58
+ notes.push(`sheet "${name}": showing ${MAX_COLUMNS} of ${Math.max(...rows.map((row) => row.length))} columns`);
59
+ }
60
+ if (rows.length > MAX_ROWS_PER_SHEET) {
61
+ notes.push(`sheet "${name}": showing ${MAX_ROWS_PER_SHEET} of ${rows.length} rows`);
62
+ }
63
+ const kept = rows.slice(0, MAX_ROWS_PER_SHEET).map((row) => Array.from({ length: width }, (_, index) => row[index] ?? ""));
64
+ const [header, ...body] = kept;
65
+ return `## ${name}\n\n${[tableRow(header), tableRow(header.map(() => "---")), ...body.map(tableRow)].join("\n")}`;
66
+ };
67
+ export const odsDeriver = {
68
+ name: "ods",
69
+ version: 1,
70
+ derive: async (absPath) => {
71
+ const zip = unzipSync(new Uint8Array(await readFile(absPath)), { filter: (file) => file.name === "content.xml" });
72
+ const content = zip["content.xml"];
73
+ if (content === undefined) {
74
+ return { markdown: "", notes: ["no content.xml in this OpenDocument container"] };
75
+ }
76
+ const xml = new TextDecoder().decode(content);
77
+ const notes = [];
78
+ const sections = [];
79
+ for (const table of xml.matchAll(TABLE)) {
80
+ const name = attributeOf(table[1] ?? "", "table:name") ?? `Sheet ${sections.length + 1}`;
81
+ sections.push(sectionOf(name, rowsOf(table[2] ?? ""), notes));
82
+ }
83
+ return { markdown: sections.join("\n\n"), notes: sections.length === 0 ? [...notes, "no sheets in this spreadsheet"] : notes };
84
+ },
85
+ };
86
+ //# sourceMappingURL=ods.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ods.js","sourceRoot":"","sources":["../../../src/lib/derivers/ods.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Deriver } from "./deriver.js";
2
+ export declare const odfToHtml: (xml: string) => string;
3
+ export declare const odtDeriver: Deriver;
4
+ //# sourceMappingURL=odt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"odt.d.ts","sourceRoot":"","sources":["../../../src/lib/derivers/odt.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAc,OAAO,EAAE,MAAM,cAAc,CAAC;AAyCxD,eAAO,MAAM,SAAS,QAAS,MAAM,KAAG,MAqCvC,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,OAgBxB,CAAC"}
@@ -0,0 +1,77 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { unzipSync } from "fflate";
3
+ import { bodyOf, parseHtml } from "@intentic/webq/dom";
4
+ import { renderMarkdown } from "@intentic/webq/markdown";
5
+ import { attributeOf, decodeEntities } from "../xml.js";
6
+ const TAG = {
7
+ "text:p": "p",
8
+ "text:list": "ul",
9
+ "text:list-item": "li",
10
+ "text:list-header": "li",
11
+ "text:span": "span",
12
+ "text:a": "a",
13
+ "text:line-break": "br",
14
+ "text:note-citation": "sup",
15
+ "table:table": "table",
16
+ "table:table-header-rows": "thead",
17
+ "table:table-row": "tr",
18
+ "table:table-cell": "td",
19
+ "table:covered-table-cell": "td",
20
+ "table:table-column": "col",
21
+ "table:table-columns": "colgroup",
22
+ };
23
+ const DROP_SUBTREE = [
24
+ "office:annotation",
25
+ "text:tracked-changes",
26
+ "draw:frame",
27
+ "text:table-of-content-source",
28
+ "text:index-title-template",
29
+ "text:alphabetical-index-source",
30
+ ];
31
+ const dropSubtrees = (xml) => DROP_SUBTREE.reduce((text, tag) => text.replaceAll(new RegExp(`<${tag}\\b[^>]*?(?:/>|>[\\s\\S]*?</${tag}>)`, "g"), ""), xml);
32
+ export const odfToHtml = (xml) => {
33
+ const start = xml.indexOf("<office:text");
34
+ const end = xml.lastIndexOf("</office:text>");
35
+ const body = dropSubtrees(start === -1 || end === -1 ? xml : xml.slice(start, end));
36
+ return (body
37
+ .replaceAll(/<text:h\b([^>]*)>([\s\S]*?)<\/text:h>/g, (_, attributes, inner) => {
38
+ const level = Math.min(6, Math.max(1, Number(attributeOf(attributes, "text:outline-level") ?? "1") || 1));
39
+ return `<h${level}>${inner}</h${level}>`;
40
+ })
41
+ .replaceAll(/<text:s\b([^>]*)\/>/g, (_, attributes) => " ".repeat(Number(attributeOf(attributes, "text:c") ?? "1") || 1))
42
+ .replaceAll(/<text:tab\b[^>]*\/>/g, " ")
43
+ .replaceAll(/<(\/?)([a-zA-Z0-9]+:[a-zA-Z0-9-]+)((?:\s[^>]*?)?)(\/?)>/g, (_, close, name, attributes, selfClosing) => {
44
+ const mapped = TAG[name];
45
+ if (mapped === undefined) {
46
+ return "";
47
+ }
48
+ if (close === "/") {
49
+ return `</${mapped}>`;
50
+ }
51
+ if (mapped === "a") {
52
+ const href = attributeOf(attributes, "xlink:href");
53
+ return href === undefined ? "<a>" : `<a href="${href.replaceAll('"', "&quot;")}">`;
54
+ }
55
+ return selfClosing === "/" && mapped !== "br" && mapped !== "col" ? `<${mapped}></${mapped}>` : `<${mapped}>`;
56
+ })
57
+ .replaceAll(/<li>\s*<p>/g, "<li>")
58
+ .replaceAll(/<\/p>\s*<\/li>/g, "</li>"));
59
+ };
60
+ export const odtDeriver = {
61
+ name: "odt",
62
+ version: 1,
63
+ derive: async (absPath) => {
64
+ const zip = unzipSync(new Uint8Array(await readFile(absPath)));
65
+ const decoder = new TextDecoder();
66
+ const content = zip["content.xml"];
67
+ if (content === undefined) {
68
+ return { markdown: "", notes: ["no content.xml in this OpenDocument container"] };
69
+ }
70
+ const meta = zip["meta.xml"];
71
+ const titleMatch = meta === undefined ? null : /<dc:title>([\s\S]*?)<\/dc:title>/.exec(decoder.decode(meta));
72
+ const title = titleMatch?.[1] === undefined || titleMatch[1].trim() === "" ? undefined : decodeEntities(titleMatch[1].trim());
73
+ const body = bodyOf(parseHtml(`<html><body>${odfToHtml(decoder.decode(content))}</body></html>`));
74
+ return { markdown: body === undefined ? "" : renderMarkdown(body), title, notes: [] };
75
+ },
76
+ };
77
+ //# sourceMappingURL=odt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"odt.js","sourceRoot":"","sources":["../../../src/lib/derivers/odt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface Destripped {
2
+ readonly pages: string[];
3
+ readonly removed: number;
4
+ readonly example: string | undefined;
5
+ }
6
+ export declare const stripRunningFurniture: (pages: readonly string[]) => Destripped;
7
+ //# sourceMappingURL=pdf-furniture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-furniture.d.ts","sourceRoot":"","sources":["../../../src/lib/derivers/pdf-furniture.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAEzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC;AA2DD,eAAO,MAAM,qBAAqB,UAAW,SAAS,MAAM,EAAE,KAAG,UAmChE,CAAC"}
@@ -0,0 +1,76 @@
1
+ const EDGE_LINES = 3;
2
+ const RECUR_SHARE = 0.6;
3
+ const MIN_PAGES = 4;
4
+ const PAGE_NUMBER = [
5
+ /^page\s+\d{1,4}(?:\s+of\s+\d{1,4})?$/i,
6
+ /^\d{1,4}\s*(?:of|\/)\s*\d{1,4}$/i,
7
+ /^[-–—]\s*\d{1,4}\s*[-–—]$/,
8
+ ];
9
+ const signaturesOf = (line, page) => {
10
+ const exact = line.replaceAll(/\s+/g, " ").trim().toLowerCase();
11
+ return [`=${exact}`, `~${exact.replaceAll(/\d+/g, (n) => `#${Number(n) - page}`)}`];
12
+ };
13
+ const edgesOf = (lines) => {
14
+ const filled = lines.flatMap((line, index) => (line.trim() === "" ? [] : [index]));
15
+ const edge = Math.min(EDGE_LINES, Math.floor(filled.length / 2));
16
+ return edge === 0 ? { top: [], bottom: [] } : { top: filled.slice(0, edge), bottom: filled.slice(-edge) };
17
+ };
18
+ const recurringAt = (split, side, needed) => {
19
+ const recurrence = new Map();
20
+ for (const [page, lines] of split.entries()) {
21
+ for (const signature of new Set(edgesOf(lines)[side].flatMap((index) => signaturesOf(lines[index] ?? "", page)))) {
22
+ recurrence.set(signature, (recurrence.get(signature) ?? 0) + 1);
23
+ }
24
+ }
25
+ return new Set([...recurrence].filter(([signature, count]) => count >= needed && !/^[=~]#?-?\d+$/.test(signature)).map(([signature]) => signature));
26
+ };
27
+ const BARE_NUMBER = /^\d{1,4}$/;
28
+ const folioOffset = (split, needed) => {
29
+ const votes = new Map();
30
+ split.forEach((lines, page) => {
31
+ const offsets = new Set([...edgesOf(lines).top, ...edgesOf(lines).bottom]
32
+ .map((index) => (lines[index] ?? "").trim())
33
+ .filter((line) => BARE_NUMBER.test(line))
34
+ .map((line) => Number(line) - page));
35
+ for (const offset of offsets) {
36
+ votes.set(offset, (votes.get(offset) ?? 0) + 1);
37
+ }
38
+ });
39
+ const [offset, count] = [...votes].toSorted((a, b) => b[1] - a[1])[0] ?? [0, 0];
40
+ return count >= needed ? offset : undefined;
41
+ };
42
+ export const stripRunningFurniture = (pages) => {
43
+ if (pages.length < MIN_PAGES) {
44
+ return { pages: [...pages], removed: 0, example: undefined };
45
+ }
46
+ const split = pages.map((page) => page.split("\n"));
47
+ const needed = Math.ceil(pages.length * RECUR_SHARE);
48
+ const headers = recurringAt(split, "top", needed);
49
+ const footers = recurringAt(split, "bottom", needed);
50
+ const offset = folioOffset(split, needed);
51
+ const seen = new Map();
52
+ let removed = 0;
53
+ const out = split.map((lines, page) => {
54
+ const { top, bottom } = edgesOf(lines);
55
+ const furniture = (running) => (index) => {
56
+ const line = (lines[index] ?? "").trim();
57
+ const folio = offset !== undefined && BARE_NUMBER.test(line) && Number(line) - page === offset;
58
+ return folio || signaturesOf(line, page).some((signature) => running.has(signature)) || PAGE_NUMBER.some((shape) => shape.test(line));
59
+ };
60
+ const drop = new Set([...top.filter(furniture(headers)), ...bottom.filter(furniture(footers))]);
61
+ for (const index of drop) {
62
+ const line = (lines[index] ?? "").trim();
63
+ if (!/^\d+$/.test(line)) {
64
+ seen.set(line, (seen.get(line) ?? 0) + 1);
65
+ }
66
+ }
67
+ removed += drop.size;
68
+ return lines
69
+ .filter((_, index) => !drop.has(index))
70
+ .join("\n")
71
+ .trim();
72
+ });
73
+ const example = [...seen].toSorted((a, b) => b[1] - a[1])[0]?.[0];
74
+ return { pages: out, removed, example };
75
+ };
76
+ //# sourceMappingURL=pdf-furniture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-furniture.js","sourceRoot":"","sources":["../../../src/lib/derivers/pdf-furniture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Deriver } from "./deriver.js";
2
+ export declare const ocrAvailable: () => boolean;
3
+ export declare const pdfDeriver: Deriver;
4
+ //# sourceMappingURL=pdf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf.d.ts","sourceRoot":"","sources":["../../../src/lib/derivers/pdf.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAc,OAAO,EAAE,MAAM,cAAc,CAAC;AAmBxD,eAAO,MAAM,YAAY,QAAO,OAAoD,CAAC;AAsCrF,eAAO,MAAM,UAAU,EAAE,OAqCxB,CAAC"}
@@ -0,0 +1,79 @@
1
+ import { execFile } from "node:child_process";
2
+ import { mkdtemp, readdir, readFile, rm } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { promisify } from "node:util";
6
+ import { extractText, getDocumentProxy, getMeta } from "unpdf";
7
+ import { onPath } from "../tools.js";
8
+ import { stripRunningFurniture } from "./pdf-furniture.js";
9
+ const SCAN_THRESHOLD_CHARS_PER_PAGE = 24;
10
+ const MAX_OCR_PAGES = 20;
11
+ const OCR_DPI = "200";
12
+ const run = promisify(execFile);
13
+ export const ocrAvailable = () => onPath("tesseract") && onPath("pdftoppm");
14
+ const recognisePages = async (absPath, totalPages) => {
15
+ const dir = await mkdtemp(join(tmpdir(), "fileq-ocr-"));
16
+ try {
17
+ await run("pdftoppm", ["-r", OCR_DPI, "-png", "-f", "1", "-l", String(Math.min(totalPages, MAX_OCR_PAGES)), absPath, join(dir, "page")], {
18
+ timeout: 120_000,
19
+ });
20
+ const images = (await readdir(dir)).filter((name) => name.endsWith(".png")).toSorted();
21
+ const pages = [];
22
+ for (const image of images) {
23
+ const { stdout } = await run("tesseract", [join(dir, image), "stdout", "-l", "eng"], { timeout: 120_000, maxBuffer: 16 * 1024 * 1024 });
24
+ pages.push(stdout.replaceAll(/[ \t]+/g, " ").trim());
25
+ }
26
+ return pages;
27
+ }
28
+ finally {
29
+ await rm(dir, { recursive: true, force: true });
30
+ }
31
+ };
32
+ const pagesToMarkdown = (pages) => pages.length === 1
33
+ ? (pages[0] ?? "")
34
+ : pages.map((page, index) => `## Page ${index + 1}\n\n${page === "" ? "(no text on this page)" : page}`).join("\n\n");
35
+ const furnitureNotes = (removed, example) => removed === 0
36
+ ? []
37
+ : [
38
+ `removed ${removed} running header, footer and page-number line${removed === 1 ? "" : "s"}${example === undefined ? "" : ` (such as "${example}")`}`,
39
+ ];
40
+ const withoutFurniture = (pages) => {
41
+ const { pages: kept, removed, example } = stripRunningFurniture(pages);
42
+ return { markdown: pagesToMarkdown(kept), notes: furnitureNotes(removed, example) };
43
+ };
44
+ export const pdfDeriver = {
45
+ get name() {
46
+ return ocrAvailable() ? "pdf+ocr" : "pdf";
47
+ },
48
+ version: 2,
49
+ derive: async (absPath) => {
50
+ const pdf = await getDocumentProxy(new Uint8Array(await readFile(absPath)));
51
+ const { totalPages, text } = await extractText(pdf, { mergePages: false });
52
+ const meta = await getMeta(pdf).catch(() => undefined);
53
+ const info = meta?.info;
54
+ const title = typeof info?.["Title"] === "string" && info["Title"] !== "" ? info["Title"] : undefined;
55
+ const pages = text.map((page) => page.replaceAll(/[ \t]+/g, " ").trim());
56
+ const totalChars = pages.reduce((sum, page) => sum + page.length, 0);
57
+ if (totalChars < SCAN_THRESHOLD_CHARS_PER_PAGE * totalPages) {
58
+ const plural = totalPages === 1 ? "" : "s";
59
+ if (!ocrAvailable()) {
60
+ return {
61
+ markdown: "",
62
+ title,
63
+ notes: [`no usable text layer across ${totalPages} page${plural} (a scan?): OCR is not part of this tier`],
64
+ };
65
+ }
66
+ const recognised = await recognisePages(absPath, totalPages);
67
+ const notes = [
68
+ `scanned: text recognised by OCR (tesseract) on ${recognised.length} of ${totalPages} page${plural} — recognised, not exact; check figures against the page image`,
69
+ ];
70
+ if (totalPages > MAX_OCR_PAGES) {
71
+ notes.push(`OCR stops at ${MAX_OCR_PAGES} pages: run tesseract over the rest yourself if they matter`);
72
+ }
73
+ const { markdown, notes: stripped } = withoutFurniture(recognised);
74
+ return { markdown, title, notes: [...notes, ...stripped] };
75
+ }
76
+ return { title, ...withoutFurniture(pages) };
77
+ },
78
+ };
79
+ //# sourceMappingURL=pdf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf.js","sourceRoot":"","sources":["../../../src/lib/derivers/pdf.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Deriver } from "./deriver.js";
2
+ export declare const slideParagraphs: (xml: string) => string[];
3
+ export declare const pptxDeriver: Deriver;
4
+ //# sourceMappingURL=pptx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pptx.d.ts","sourceRoot":"","sources":["../../../src/lib/derivers/pptx.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAc,OAAO,EAAE,MAAM,cAAc,CAAC;AASxD,eAAO,MAAM,eAAe,QAAS,MAAM,KAAG,MAAM,EAQd,CAAC;AAavC,eAAO,MAAM,WAAW,EAAE,OA4BzB,CAAC"}