@bendyline/squisq-formats 2.0.0 → 2.1.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 (82) hide show
  1. package/dist/{chunk-CX3LH47J.js → chunk-74GO3FVS.js} +3 -3
  2. package/dist/{chunk-4HJ6AK2Q.js → chunk-7ARKUCQT.js} +52 -13
  3. package/dist/chunk-7ARKUCQT.js.map +1 -0
  4. package/dist/{chunk-LXYLOOST.js → chunk-DTDF6QDP.js} +3 -3
  5. package/dist/chunk-DTDF6QDP.js.map +1 -0
  6. package/dist/{chunk-ZZ7D4DN6.js → chunk-EW54IRRS.js} +39 -9
  7. package/dist/chunk-EW54IRRS.js.map +1 -0
  8. package/dist/{chunk-H7T5DXUU.js → chunk-FE6OJV6O.js} +95 -14
  9. package/dist/chunk-FE6OJV6O.js.map +1 -0
  10. package/dist/{chunk-XTLQXR4U.js → chunk-KURGXM4I.js} +3 -3
  11. package/dist/{chunk-2CSZJEAL.js → chunk-NNHKUXKA.js} +292 -70
  12. package/dist/chunk-NNHKUXKA.js.map +1 -0
  13. package/dist/{chunk-2PRVLAU3.js → chunk-QFLDYKCR.js} +55 -17
  14. package/dist/chunk-QFLDYKCR.js.map +1 -0
  15. package/dist/{chunk-CVNVD7VH.js → chunk-RLU7UFYU.js} +5 -5
  16. package/dist/{chunk-X4USWOQ2.js → chunk-SC67HYQJ.js} +2 -2
  17. package/dist/{chunk-HBSCRS5P.js → chunk-UGYF5AZE.js} +3 -3
  18. package/dist/{chunk-2EFDWKC6.js → chunk-WQSHGBLN.js} +86 -23
  19. package/dist/chunk-WQSHGBLN.js.map +1 -0
  20. package/dist/container/index.d.ts +10 -4
  21. package/dist/container/index.js +9 -4
  22. package/dist/container/index.js.map +1 -1
  23. package/dist/docx/index.d.ts +2 -2
  24. package/dist/docx/index.js +5 -4
  25. package/dist/{export-Djev9BLU.d.ts → export-D2NkylDT.d.ts} +1 -1
  26. package/dist/{extract-LNOA7DBK.js → extract-OJ7ZQV6P.js} +5 -5
  27. package/dist/html/index.js +1 -1
  28. package/dist/{import-Yivc3kZM.d.ts → import-K8mfc0fz.d.ts} +1 -1
  29. package/dist/index.d.ts +8 -7
  30. package/dist/index.js +15 -13
  31. package/dist/infer/index.d.ts +4 -4
  32. package/dist/infer/index.js +5 -5
  33. package/dist/{layouts-7OUUVAGU.js → layouts-5VDIRPIJ.js} +4 -4
  34. package/dist/{layouts-CZ0bdsNL.d.ts → layouts-BHrgZ5FS.d.ts} +1 -1
  35. package/dist/ooxml/index.d.ts +4 -4
  36. package/dist/ooxml/index.js +4 -4
  37. package/dist/pptx/index.d.ts +5 -5
  38. package/dist/pptx/index.js +5 -5
  39. package/dist/{reader-Gof6OrJX.d.ts → reader-B9L8Ucbj.d.ts} +3 -3
  40. package/dist/registry/index.d.ts +20 -6
  41. package/dist/registry/index.js +6 -4
  42. package/dist/{themeReader-DPw4J5Ss.d.ts → themeReader-DJKErl_j.d.ts} +1 -1
  43. package/dist/xlsx/index.d.ts +4 -4
  44. package/dist/xlsx/index.js +4 -4
  45. package/dist/{zipLimits-bGYMS9cI.d.ts → zipLimits-BOKCB7qk.d.ts} +2 -0
  46. package/package.json +2 -2
  47. package/src/__tests__/convert.test.ts +143 -1
  48. package/src/__tests__/docxExport.test.ts +34 -0
  49. package/src/__tests__/docxImport.test.ts +121 -0
  50. package/src/__tests__/html.test.ts +4 -0
  51. package/src/__tests__/ooxml.test.ts +17 -0
  52. package/src/__tests__/ooxmlCancellation.test.ts +113 -0
  53. package/src/container/index.ts +17 -3
  54. package/src/docx/export.ts +113 -5
  55. package/src/docx/import.ts +324 -69
  56. package/src/html/htmlTemplate.ts +2 -2
  57. package/src/index.ts +3 -0
  58. package/src/infer/index.ts +35 -4
  59. package/src/ooxml/namespaces.ts +21 -0
  60. package/src/ooxml/reader.ts +55 -14
  61. package/src/pptx/layouts.ts +68 -14
  62. package/src/registry/convert.ts +115 -31
  63. package/src/registry/defaultFormats.ts +5 -2
  64. package/src/registry/index.ts +3 -1
  65. package/src/registry/types.ts +18 -1
  66. package/src/shared/boundedZipArchive.ts +49 -8
  67. package/src/shared/zipEntryCount.ts +59 -5
  68. package/src/shared/zipLimits.ts +10 -0
  69. package/dist/chunk-2CSZJEAL.js.map +0 -1
  70. package/dist/chunk-2EFDWKC6.js.map +0 -1
  71. package/dist/chunk-2PRVLAU3.js.map +0 -1
  72. package/dist/chunk-4HJ6AK2Q.js.map +0 -1
  73. package/dist/chunk-H7T5DXUU.js.map +0 -1
  74. package/dist/chunk-LXYLOOST.js.map +0 -1
  75. package/dist/chunk-ZZ7D4DN6.js.map +0 -1
  76. /package/dist/{chunk-CX3LH47J.js.map → chunk-74GO3FVS.js.map} +0 -0
  77. /package/dist/{chunk-XTLQXR4U.js.map → chunk-KURGXM4I.js.map} +0 -0
  78. /package/dist/{chunk-CVNVD7VH.js.map → chunk-RLU7UFYU.js.map} +0 -0
  79. /package/dist/{chunk-X4USWOQ2.js.map → chunk-SC67HYQJ.js.map} +0 -0
  80. /package/dist/{chunk-HBSCRS5P.js.map → chunk-UGYF5AZE.js.map} +0 -0
  81. /package/dist/{extract-LNOA7DBK.js.map → extract-OJ7ZQV6P.js.map} +0 -0
  82. /package/dist/{layouts-7OUUVAGU.js.map → layouts-5VDIRPIJ.js.map} +0 -0
@@ -2,12 +2,12 @@ import {
2
2
  ZipSafetyError,
3
3
  assertSafeZipPath,
4
4
  openBoundedZipArchive
5
- } from "../chunk-H7T5DXUU.js";
5
+ } from "../chunk-FE6OJV6O.js";
6
6
 
7
7
  // src/container/index.ts
8
8
  import JSZip from "jszip";
9
9
  import { MemoryContentContainer } from "@bendyline/squisq/storage";
10
- async function containerToZip(container) {
10
+ async function containerToZip(container, options = {}) {
11
11
  const zip = new JSZip();
12
12
  const entries = await container.listFiles();
13
13
  for (const entry of entries) {
@@ -17,10 +17,15 @@ async function containerToZip(container) {
17
17
  zip.file(entry.path, new Uint8Array(data));
18
18
  }
19
19
  }
20
+ const compression = options.compression ?? "DEFLATE";
21
+ const compressionLevel = options.compressionLevel ?? 6;
22
+ if (!Number.isSafeInteger(compressionLevel) || compressionLevel < 1 || compressionLevel > 9) {
23
+ throw new Error("ZIP compression level must be an integer between 1 and 9");
24
+ }
20
25
  return zip.generateAsync({
21
26
  type: "blob",
22
- compression: "DEFLATE",
23
- compressionOptions: { level: 6 }
27
+ compression,
28
+ ...compression === "DEFLATE" ? { compressionOptions: { level: compressionLevel } } : {}
24
29
  });
25
30
  }
26
31
  async function zipToContainer(zipData, options = {}) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/container/index.ts"],"sourcesContent":["/**\n * Container ZIP serialization — convert between ContentContainer and ZIP archives.\n *\n * Uses JSZip (already a formats dependency) to serialize a ContentContainer to\n * a ZIP blob and to deserialize a ZIP blob into a MemoryContentContainer.\n *\n * ZIP structure mirrors the container's flat path hierarchy directly:\n * index.md\n * images/hero.jpg\n * audio/narration.mp3\n * timing.json\n */\n\nimport JSZip from 'jszip';\nimport type { ContentContainer } from '@bendyline/squisq/storage';\nimport { MemoryContentContainer } from '@bendyline/squisq/storage';\nimport {\n assertSafeZipPath,\n openBoundedZipArchive,\n ZipSafetyError,\n type ZipSafetyLimits,\n type ZipSafetyErrorCode,\n type ZipSafetyErrorOptions,\n} from '../shared/zipSafety.js';\n\nexport type ZipToContainerOptions = ZipSafetyLimits;\nexport { ZipSafetyError };\nexport type { ZipSafetyLimits, ZipSafetyErrorCode, ZipSafetyErrorOptions };\n\n/**\n * Serialize a ContentContainer to a ZIP blob.\n *\n * All files in the container are written to the ZIP archive preserving\n * their path structure. The resulting blob can be saved as a .zip file.\n *\n * @param container — The container to serialize\n * @returns A Blob containing the ZIP archive\n */\nexport async function containerToZip(container: ContentContainer): Promise<Blob> {\n const zip = new JSZip();\n const entries = await container.listFiles();\n\n for (const entry of entries) {\n assertSafeZipPath(entry.path);\n const data = await container.readFile(entry.path);\n if (data) {\n zip.file(entry.path, new Uint8Array(data));\n }\n }\n\n return zip.generateAsync({\n type: 'blob',\n compression: 'DEFLATE',\n compressionOptions: { level: 6 },\n });\n}\n\n/**\n * Deserialize a ZIP archive into a MemoryContentContainer.\n *\n * Reads all files from the ZIP and writes them into a new MemoryContentContainer.\n * Directory entries are skipped. The resulting container can be used immediately\n * for rendering, editing, or saving to persistent storage.\n *\n * @param zipData — The ZIP archive as ArrayBuffer, Uint8Array, or Blob\n * @returns A MemoryContentContainer populated with the ZIP's contents\n */\nexport async function zipToContainer(\n zipData: ArrayBuffer | Uint8Array | Blob,\n options: ZipToContainerOptions = {},\n): Promise<MemoryContentContainer> {\n const archive = await openBoundedZipArchive(zipData, options);\n const container = new MemoryContentContainer();\n for (const { path } of archive.entries) {\n const data = await archive.read(path);\n if (data) await container.writeFile(path, data);\n archive.release(path);\n }\n return container;\n}\n"],"mappings":";;;;;;;AAaA,OAAO,WAAW;AAElB,SAAS,8BAA8B;AAuBvC,eAAsB,eAAe,WAA4C;AAC/E,QAAM,MAAM,IAAI,MAAM;AACtB,QAAM,UAAU,MAAM,UAAU,UAAU;AAE1C,aAAW,SAAS,SAAS;AAC3B,sBAAkB,MAAM,IAAI;AAC5B,UAAM,OAAO,MAAM,UAAU,SAAS,MAAM,IAAI;AAChD,QAAI,MAAM;AACR,UAAI,KAAK,MAAM,MAAM,IAAI,WAAW,IAAI,CAAC;AAAA,IAC3C;AAAA,EACF;AAEA,SAAO,IAAI,cAAc;AAAA,IACvB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,oBAAoB,EAAE,OAAO,EAAE;AAAA,EACjC,CAAC;AACH;AAYA,eAAsB,eACpB,SACA,UAAiC,CAAC,GACD;AACjC,QAAM,UAAU,MAAM,sBAAsB,SAAS,OAAO;AAC5D,QAAM,YAAY,IAAI,uBAAuB;AAC7C,aAAW,EAAE,KAAK,KAAK,QAAQ,SAAS;AACtC,UAAM,OAAO,MAAM,QAAQ,KAAK,IAAI;AACpC,QAAI,KAAM,OAAM,UAAU,UAAU,MAAM,IAAI;AAC9C,YAAQ,QAAQ,IAAI;AAAA,EACtB;AACA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/container/index.ts"],"sourcesContent":["/**\n * Container ZIP serialization — convert between ContentContainer and ZIP archives.\n *\n * Uses JSZip (already a formats dependency) to serialize a ContentContainer to\n * a ZIP blob and to deserialize a ZIP blob into a MemoryContentContainer.\n *\n * ZIP structure mirrors the container's flat path hierarchy directly:\n * index.md\n * images/hero.jpg\n * audio/narration.mp3\n * timing.json\n */\n\nimport JSZip from 'jszip';\nimport type { ContentContainer } from '@bendyline/squisq/storage';\nimport { MemoryContentContainer } from '@bendyline/squisq/storage';\nimport {\n assertSafeZipPath,\n openBoundedZipArchive,\n ZipSafetyError,\n type ZipSafetyLimits,\n type ZipSafetyErrorCode,\n type ZipSafetyErrorOptions,\n} from '../shared/zipSafety.js';\n\nexport type ZipToContainerOptions = ZipSafetyLimits;\nexport interface ContainerToZipOptions {\n /** STORE avoids producing archives that violate strict import compression-ratio policies. */\n compression?: 'STORE' | 'DEFLATE';\n /** JSZip DEFLATE level; ignored for STORE. */\n compressionLevel?: number;\n}\nexport { ZipSafetyError };\nexport type { ZipSafetyLimits, ZipSafetyErrorCode, ZipSafetyErrorOptions };\n\n/**\n * Serialize a ContentContainer to a ZIP blob.\n *\n * All files in the container are written to the ZIP archive preserving\n * their path structure. The resulting blob can be saved as a .zip file.\n *\n * @param container — The container to serialize\n * @returns A Blob containing the ZIP archive\n */\nexport async function containerToZip(\n container: ContentContainer,\n options: ContainerToZipOptions = {},\n): Promise<Blob> {\n const zip = new JSZip();\n const entries = await container.listFiles();\n\n for (const entry of entries) {\n assertSafeZipPath(entry.path);\n const data = await container.readFile(entry.path);\n if (data) {\n zip.file(entry.path, new Uint8Array(data));\n }\n }\n\n const compression = options.compression ?? 'DEFLATE';\n const compressionLevel = options.compressionLevel ?? 6;\n if (!Number.isSafeInteger(compressionLevel) || compressionLevel < 1 || compressionLevel > 9) {\n throw new Error('ZIP compression level must be an integer between 1 and 9');\n }\n return zip.generateAsync({\n type: 'blob',\n compression,\n ...(compression === 'DEFLATE' ? { compressionOptions: { level: compressionLevel } } : {}),\n });\n}\n\n/**\n * Deserialize a ZIP archive into a MemoryContentContainer.\n *\n * Reads all files from the ZIP and writes them into a new MemoryContentContainer.\n * Directory entries are skipped. The resulting container can be used immediately\n * for rendering, editing, or saving to persistent storage.\n *\n * @param zipData — The ZIP archive as ArrayBuffer, Uint8Array, or Blob\n * @returns A MemoryContentContainer populated with the ZIP's contents\n */\nexport async function zipToContainer(\n zipData: ArrayBuffer | Uint8Array | Blob,\n options: ZipToContainerOptions = {},\n): Promise<MemoryContentContainer> {\n const archive = await openBoundedZipArchive(zipData, options);\n const container = new MemoryContentContainer();\n for (const { path } of archive.entries) {\n const data = await archive.read(path);\n if (data) await container.writeFile(path, data);\n archive.release(path);\n }\n return container;\n}\n"],"mappings":";;;;;;;AAaA,OAAO,WAAW;AAElB,SAAS,8BAA8B;AA6BvC,eAAsB,eACpB,WACA,UAAiC,CAAC,GACnB;AACf,QAAM,MAAM,IAAI,MAAM;AACtB,QAAM,UAAU,MAAM,UAAU,UAAU;AAE1C,aAAW,SAAS,SAAS;AAC3B,sBAAkB,MAAM,IAAI;AAC5B,UAAM,OAAO,MAAM,UAAU,SAAS,MAAM,IAAI;AAChD,QAAI,MAAM;AACR,UAAI,KAAK,MAAM,MAAM,IAAI,WAAW,IAAI,CAAC;AAAA,IAC3C;AAAA,EACF;AAEA,QAAM,cAAc,QAAQ,eAAe;AAC3C,QAAM,mBAAmB,QAAQ,oBAAoB;AACrD,MAAI,CAAC,OAAO,cAAc,gBAAgB,KAAK,mBAAmB,KAAK,mBAAmB,GAAG;AAC3F,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AACA,SAAO,IAAI,cAAc;AAAA,IACvB,MAAM;AAAA,IACN;AAAA,IACA,GAAI,gBAAgB,YAAY,EAAE,oBAAoB,EAAE,OAAO,iBAAiB,EAAE,IAAI,CAAC;AAAA,EACzF,CAAC;AACH;AAYA,eAAsB,eACpB,SACA,UAAiC,CAAC,GACD;AACjC,QAAM,UAAU,MAAM,sBAAsB,SAAS,OAAO;AAC5D,QAAM,YAAY,IAAI,uBAAuB;AAC7C,aAAW,EAAE,KAAK,KAAK,QAAQ,SAAS;AACtC,UAAM,OAAO,MAAM,QAAQ,KAAK,IAAI;AACpC,QAAI,KAAM,OAAM,UAAU,UAAU,MAAM,IAAI;AAC9C,YAAQ,QAAQ,IAAI;AAAA,EACtB;AACA,SAAO;AACT;","names":[]}
@@ -1,8 +1,8 @@
1
1
  import { ThemeRegistry, Doc } from '@bendyline/squisq/schemas';
2
2
  import { MarkdownDocument } from '@bendyline/squisq/markdown';
3
- import { O as OoxmlOpenOptions } from '../reader-Gof6OrJX.js';
3
+ import { O as OoxmlOpenOptions } from '../reader-B9L8Ucbj.js';
4
4
  import { ContentContainer } from '@bendyline/squisq/storage';
5
- import '../zipLimits-bGYMS9cI.js';
5
+ import '../zipLimits-BOKCB7qk.js';
6
6
 
7
7
  /**
8
8
  * DOCX Export
@@ -4,13 +4,14 @@ import {
4
4
  docxToDoc,
5
5
  docxToMarkdownDoc,
6
6
  markdownDocToDocx
7
- } from "../chunk-2CSZJEAL.js";
7
+ } from "../chunk-NNHKUXKA.js";
8
8
  import "../chunk-6M7Z25LA.js";
9
9
  import "../chunk-PN52A5AA.js";
10
- import "../chunk-XTLQXR4U.js";
10
+ import "../chunk-YRT7GQ5Y.js";
11
+ import "../chunk-KURGXM4I.js";
11
12
  import "../chunk-U4MRIFKL.js";
12
- import "../chunk-4HJ6AK2Q.js";
13
- import "../chunk-H7T5DXUU.js";
13
+ import "../chunk-7ARKUCQT.js";
14
+ import "../chunk-FE6OJV6O.js";
14
15
  import "../chunk-SSUPBUF5.js";
15
16
  import "../chunk-O3GVVND4.js";
16
17
  export {
@@ -1,5 +1,5 @@
1
1
  import { MarkdownDocument } from '@bendyline/squisq/markdown';
2
- import { O as OoxmlOpenOptions } from './reader-Gof6OrJX.js';
2
+ import { O as OoxmlOpenOptions } from './reader-B9L8Ucbj.js';
3
3
  import { Doc } from '@bendyline/squisq/schemas';
4
4
 
5
5
  /**
@@ -2,14 +2,14 @@ import {
2
2
  extractDocxTheme,
3
3
  extractPptxTheme,
4
4
  extractXlsxTheme
5
- } from "./chunk-CX3LH47J.js";
6
- import "./chunk-X4USWOQ2.js";
5
+ } from "./chunk-74GO3FVS.js";
6
+ import "./chunk-SC67HYQJ.js";
7
7
  import "./chunk-YRT7GQ5Y.js";
8
- import "./chunk-4HJ6AK2Q.js";
9
- import "./chunk-H7T5DXUU.js";
8
+ import "./chunk-7ARKUCQT.js";
9
+ import "./chunk-FE6OJV6O.js";
10
10
  export {
11
11
  extractDocxTheme,
12
12
  extractPptxTheme,
13
13
  extractXlsxTheme
14
14
  };
15
- //# sourceMappingURL=extract-LNOA7DBK.js.map
15
+ //# sourceMappingURL=extract-OJ7ZQV6P.js.map
@@ -9,7 +9,7 @@ import {
9
9
  markdownDocToPlainHtml,
10
10
  markdownDocsToHtmlBundle,
11
11
  markdownDocsToPlainHtmlBundle
12
- } from "../chunk-LXYLOOST.js";
12
+ } from "../chunk-DTDF6QDP.js";
13
13
  import {
14
14
  arrayBufferToBase64DataUrl,
15
15
  extractFilename,
@@ -1,6 +1,6 @@
1
1
  import { ThemeRegistry, Doc } from '@bendyline/squisq/schemas';
2
2
  import { MarkdownDocument } from '@bendyline/squisq/markdown';
3
- import { O as OoxmlOpenOptions } from './reader-Gof6OrJX.js';
3
+ import { O as OoxmlOpenOptions } from './reader-B9L8Ucbj.js';
4
4
  import { ContentContainer } from '@bendyline/squisq/storage';
5
5
 
6
6
  /**
package/dist/index.d.ts CHANGED
@@ -6,15 +6,16 @@ export { PdfExportOptions, PdfImportOptions, configurePdfWorker, docToPdf, markd
6
6
  export { HtmlZipExportOptions, docToHtml, docToHtmlZip } from './html/index.js';
7
7
  export { EpubExportOptions, docToEpub, markdownDocToEpub } from './epub/index.js';
8
8
  export { ExtractedFileTheme, InferSourceFormat, InferThemeOptions, InferredFileTheme, compileExtractedTheme, inferThemeFromFile } from './infer/index.js';
9
- export { BUILTIN_FORMAT_IDS, BuiltinFormatOptions, ConversionError, ConversionErrorCode, ConversionErrorOptions, ConversionResult, ConvertOptions, ConvertSource, DbkFormatOptions, FormatDefinition, FormatId, FormatRegistry, MarkdownFormatOptions, NormalizedInput, convert, createRegistry, defaultFormats, defaultRegistry } from './registry/index.js';
10
- export { Z as ZipSafetyError, a as ZipSafetyErrorCode, b as ZipSafetyErrorOptions, c as ZipSafetyLimits } from './zipLimits-bGYMS9cI.js';
9
+ export { BUILTIN_FORMAT_IDS, BuiltinFormatOptions, ConversionError, ConversionErrorCode, ConversionErrorOptions, ConversionResult, ConvertOptions, ConvertSource, DbkFormatOptions, FormatDefinition, FormatId, FormatRegistry, MarkdownFormatOptions, NormalizedInput, PreparedConversion, PreparedExportOptions, convert, createRegistry, defaultFormats, defaultRegistry, prepareConversion } from './registry/index.js';
10
+ export { Z as ZipSafetyError, a as ZipSafetyErrorCode, b as ZipSafetyErrorOptions, c as ZipSafetyLimits } from './zipLimits-BOKCB7qk.js';
11
11
  export { H as HtmlExportOptions, a as HtmlImportOptions, c as collectImagePaths, h as htmlToMarkdown, b as htmlToMarkdownDoc, d as htmlToMarkdownDocSync } from './import-DTkDxHmZ.js';
12
- export { P as PptxExportOptions, a as PptxImportOptions, d as docToPptx, m as markdownDocToPptx, p as pptxToMarkdownDoc } from './import-Yivc3kZM.js';
13
- export { X as XlsxExportOptions, a as XlsxImportOptions, d as docToXlsx, m as markdownDocToXlsx, x as xlsxToMarkdownDoc } from './export-Djev9BLU.js';
12
+ export { P as PptxExportOptions, a as PptxImportOptions, d as docToPptx, m as markdownDocToPptx, p as pptxToMarkdownDoc } from './import-K8mfc0fz.js';
13
+ export { X as XlsxExportOptions, a as XlsxImportOptions, d as docToXlsx, m as markdownDocToXlsx, x as xlsxToMarkdownDoc } from './export-D2NkylDT.js';
14
14
  import '@bendyline/squisq/schemas';
15
15
  import '@bendyline/squisq/markdown';
16
- import './reader-Gof6OrJX.js';
16
+ import './reader-B9L8Ucbj.js';
17
17
  import '@bendyline/squisq/storage';
18
- import './layouts-CZ0bdsNL.js';
19
- import './themeReader-DPw4J5Ss.js';
18
+ import './layouts-BHrgZ5FS.js';
19
+ import './themeReader-DJKErl_j.js';
20
20
  import '@bendyline/squisq/transform';
21
+ import './container/index.js';
package/dist/index.js CHANGED
@@ -7,15 +7,16 @@ import {
7
7
  convert,
8
8
  createRegistry,
9
9
  defaultFormats,
10
- defaultRegistry
11
- } from "./chunk-2EFDWKC6.js";
10
+ defaultRegistry,
11
+ prepareConversion
12
+ } from "./chunk-WQSHGBLN.js";
12
13
  import {
13
14
  inferThemeFromFile
14
- } from "./chunk-ZZ7D4DN6.js";
15
+ } from "./chunk-EW54IRRS.js";
15
16
  import {
16
17
  ConversionError
17
18
  } from "./chunk-ODL3SSPT.js";
18
- import "./chunk-CX3LH47J.js";
19
+ import "./chunk-74GO3FVS.js";
19
20
  import {
20
21
  compileExtractedTheme
21
22
  } from "./chunk-NKAJPJ4G.js";
@@ -24,21 +25,21 @@ import {
24
25
  docxToDoc,
25
26
  docxToMarkdownDoc,
26
27
  markdownDocToDocx
27
- } from "./chunk-2CSZJEAL.js";
28
+ } from "./chunk-NNHKUXKA.js";
28
29
  import {
29
30
  docToPptx,
30
31
  markdownDocToPptx,
31
32
  pptxToDoc,
32
33
  pptxToMarkdownDoc
33
- } from "./chunk-CVNVD7VH.js";
34
- import "./chunk-2PRVLAU3.js";
34
+ } from "./chunk-RLU7UFYU.js";
35
+ import "./chunk-QFLDYKCR.js";
35
36
  import "./chunk-6M7Z25LA.js";
36
37
  import {
37
38
  docToXlsx,
38
39
  markdownDocToXlsx,
39
40
  xlsxToDoc,
40
41
  xlsxToMarkdownDoc
41
- } from "./chunk-HBSCRS5P.js";
42
+ } from "./chunk-UGYF5AZE.js";
42
43
  import "./chunk-PN52A5AA.js";
43
44
  import {
44
45
  csvToDoc,
@@ -46,14 +47,14 @@ import {
46
47
  markdownDocToCsv,
47
48
  parseCsv
48
49
  } from "./chunk-RFAPOKHJ.js";
49
- import "./chunk-X4USWOQ2.js";
50
+ import "./chunk-SC67HYQJ.js";
50
51
  import "./chunk-YRT7GQ5Y.js";
51
- import "./chunk-XTLQXR4U.js";
52
+ import "./chunk-KURGXM4I.js";
52
53
  import "./chunk-U4MRIFKL.js";
53
- import "./chunk-4HJ6AK2Q.js";
54
+ import "./chunk-7ARKUCQT.js";
54
55
  import {
55
56
  ZipSafetyError
56
- } from "./chunk-H7T5DXUU.js";
57
+ } from "./chunk-FE6OJV6O.js";
57
58
  import {
58
59
  configurePdfWorker,
59
60
  docToPdf,
@@ -69,7 +70,7 @@ import {
69
70
  htmlToMarkdown,
70
71
  htmlToMarkdownDoc,
71
72
  htmlToMarkdownDocSync
72
- } from "./chunk-LXYLOOST.js";
73
+ } from "./chunk-DTDF6QDP.js";
73
74
  import "./chunk-MLX2BOJC.js";
74
75
  import "./chunk-O3GVVND4.js";
75
76
  export {
@@ -109,6 +110,7 @@ export {
109
110
  pdfToMarkdownDoc,
110
111
  pptxToDoc,
111
112
  pptxToMarkdownDoc,
113
+ prepareConversion,
112
114
  xlsxToDoc,
113
115
  xlsxToMarkdownDoc
114
116
  };
@@ -1,8 +1,8 @@
1
1
  import { Theme, DeepPartial, CustomTemplateDefinition } from '@bendyline/squisq/schemas';
2
- import { a as OoxmlPackage, O as OoxmlOpenOptions } from '../reader-Gof6OrJX.js';
3
- import { O as OoxmlColorScheme, a as OoxmlFontScheme } from '../themeReader-DPw4J5Ss.js';
4
- import { P as PptxColorHints } from '../layouts-CZ0bdsNL.js';
5
- import '../zipLimits-bGYMS9cI.js';
2
+ import { a as OoxmlPackage, O as OoxmlOpenOptions } from '../reader-B9L8Ucbj.js';
3
+ import { O as OoxmlColorScheme, a as OoxmlFontScheme } from '../themeReader-DJKErl_j.js';
4
+ import { P as PptxColorHints } from '../layouts-BHrgZ5FS.js';
5
+ import '../zipLimits-BOKCB7qk.js';
6
6
 
7
7
  /**
8
8
  * Shared types for file-import theme inference.
@@ -1,21 +1,21 @@
1
1
  import {
2
2
  inferThemeFromFile
3
- } from "../chunk-ZZ7D4DN6.js";
3
+ } from "../chunk-EW54IRRS.js";
4
4
  import "../chunk-ODL3SSPT.js";
5
5
  import {
6
6
  extractDocxTheme,
7
7
  extractPptxTheme,
8
8
  extractXlsxTheme
9
- } from "../chunk-CX3LH47J.js";
9
+ } from "../chunk-74GO3FVS.js";
10
10
  import {
11
11
  colorHintsFromExtraction,
12
12
  compileExtractedTheme,
13
13
  extractedThemeToPartial
14
14
  } from "../chunk-NKAJPJ4G.js";
15
- import "../chunk-X4USWOQ2.js";
15
+ import "../chunk-SC67HYQJ.js";
16
16
  import "../chunk-YRT7GQ5Y.js";
17
- import "../chunk-4HJ6AK2Q.js";
18
- import "../chunk-H7T5DXUU.js";
17
+ import "../chunk-7ARKUCQT.js";
18
+ import "../chunk-FE6OJV6O.js";
19
19
  export {
20
20
  colorHintsFromExtraction,
21
21
  compileExtractedTheme,
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  analyzePptxLayouts,
3
3
  inspectPptxLayouts
4
- } from "./chunk-2PRVLAU3.js";
4
+ } from "./chunk-QFLDYKCR.js";
5
5
  import "./chunk-YRT7GQ5Y.js";
6
- import "./chunk-4HJ6AK2Q.js";
7
- import "./chunk-H7T5DXUU.js";
6
+ import "./chunk-7ARKUCQT.js";
7
+ import "./chunk-FE6OJV6O.js";
8
8
  export {
9
9
  analyzePptxLayouts,
10
10
  inspectPptxLayouts
11
11
  };
12
- //# sourceMappingURL=layouts-7OUUVAGU.js.map
12
+ //# sourceMappingURL=layouts-5VDIRPIJ.js.map
@@ -1,5 +1,5 @@
1
1
  import { CustomTemplateDefinition } from '@bendyline/squisq/schemas';
2
- import { O as OoxmlOpenOptions, a as OoxmlPackage } from './reader-Gof6OrJX.js';
2
+ import { O as OoxmlOpenOptions, a as OoxmlPackage } from './reader-B9L8Ucbj.js';
3
3
 
4
4
  /**
5
5
  * PPTX slide-layout inference — reads the layouts/masters a deck actually
@@ -1,7 +1,7 @@
1
- import { R as Relationship, C as CoreProperties } from '../reader-Gof6OrJX.js';
2
- export { b as ContentTypeMap, O as OoxmlOpenOptions, a as OoxmlPackage, P as PackagePart, c as PendingRelationship, g as getCoreProperties, d as getPartBinary, e as getPartRelationships, f as getPartXml, o as openPackage } from '../reader-Gof6OrJX.js';
3
- export { Z as ZipSafetyError, a as ZipSafetyErrorCode, b as ZipSafetyErrorOptions, c as ZipSafetyLimits } from '../zipLimits-bGYMS9cI.js';
4
- export { O as OoxmlColorScheme, a as OoxmlFontScheme, b as OoxmlTheme, p as parseThemeXml, r as readThemePart } from '../themeReader-DPw4J5Ss.js';
1
+ import { R as Relationship, C as CoreProperties } from '../reader-B9L8Ucbj.js';
2
+ export { b as ContentTypeMap, O as OoxmlOpenOptions, a as OoxmlPackage, P as PackagePart, c as PendingRelationship, g as getCoreProperties, d as getPartBinary, e as getPartRelationships, f as getPartXml, o as openPackage } from '../reader-B9L8Ucbj.js';
3
+ export { Z as ZipSafetyError, a as ZipSafetyErrorCode, b as ZipSafetyErrorOptions, c as ZipSafetyLimits } from '../zipLimits-BOKCB7qk.js';
4
+ export { O as OoxmlColorScheme, a as OoxmlFontScheme, b as OoxmlTheme, p as parseThemeXml, r as readThemePart } from '../themeReader-DJKErl_j.js';
5
5
 
6
6
  /**
7
7
  * Shared DOM-read helpers for OOXML importers.
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  parseThemeXml,
3
3
  readThemePart
4
- } from "../chunk-X4USWOQ2.js";
4
+ } from "../chunk-SC67HYQJ.js";
5
5
  import {
6
6
  attrNS,
7
7
  baseDirOf,
@@ -10,7 +10,7 @@ import {
10
10
  } from "../chunk-YRT7GQ5Y.js";
11
11
  import {
12
12
  createPackage
13
- } from "../chunk-XTLQXR4U.js";
13
+ } from "../chunk-KURGXM4I.js";
14
14
  import {
15
15
  attrString,
16
16
  escapeXml,
@@ -70,10 +70,10 @@ import {
70
70
  getPartRelationships,
71
71
  getPartXml,
72
72
  openPackage
73
- } from "../chunk-4HJ6AK2Q.js";
73
+ } from "../chunk-7ARKUCQT.js";
74
74
  import {
75
75
  ZipSafetyError
76
- } from "../chunk-H7T5DXUU.js";
76
+ } from "../chunk-FE6OJV6O.js";
77
77
  export {
78
78
  CONTENT_TYPE_CORE_PROPERTIES,
79
79
  CONTENT_TYPE_DOCX_DOCUMENT,
@@ -1,10 +1,10 @@
1
- import { a as PptxImportOptions } from '../import-Yivc3kZM.js';
2
- export { P as PptxExportOptions, d as docToPptx, m as markdownDocToPptx, b as pptxToContainer, p as pptxToMarkdownDoc } from '../import-Yivc3kZM.js';
1
+ import { a as PptxImportOptions } from '../import-K8mfc0fz.js';
2
+ export { P as PptxExportOptions, d as docToPptx, m as markdownDocToPptx, b as pptxToContainer, p as pptxToMarkdownDoc } from '../import-K8mfc0fz.js';
3
3
  import { Doc } from '@bendyline/squisq/schemas';
4
- export { A as AnalyzePptxLayoutsOptions, a as AnalyzedLayout, E as ExtractedPlaceholder, b as ExtractedSlideLayout, I as InspectPptxLayoutsOptions, L as LayoutVerdict, P as PptxColorHints, c as PptxLayoutInference, d as PptxLayoutSummary, e as analyzePptxLayouts, i as inspectPptxLayouts } from '../layouts-CZ0bdsNL.js';
4
+ export { A as AnalyzePptxLayoutsOptions, a as AnalyzedLayout, E as ExtractedPlaceholder, b as ExtractedSlideLayout, I as InspectPptxLayoutsOptions, L as LayoutVerdict, P as PptxColorHints, c as PptxLayoutInference, d as PptxLayoutSummary, e as analyzePptxLayouts, i as inspectPptxLayouts } from '../layouts-BHrgZ5FS.js';
5
5
  import '@bendyline/squisq/markdown';
6
- import '../reader-Gof6OrJX.js';
7
- import '../zipLimits-bGYMS9cI.js';
6
+ import '../reader-B9L8Ucbj.js';
7
+ import '../zipLimits-BOKCB7qk.js';
8
8
  import '@bendyline/squisq/storage';
9
9
 
10
10
  /**
@@ -4,18 +4,18 @@ import {
4
4
  pptxToContainer,
5
5
  pptxToDoc,
6
6
  pptxToMarkdownDoc
7
- } from "../chunk-CVNVD7VH.js";
7
+ } from "../chunk-RLU7UFYU.js";
8
8
  import {
9
9
  analyzePptxLayouts,
10
10
  inspectPptxLayouts
11
- } from "../chunk-2PRVLAU3.js";
11
+ } from "../chunk-QFLDYKCR.js";
12
12
  import "../chunk-6M7Z25LA.js";
13
13
  import "../chunk-PN52A5AA.js";
14
14
  import "../chunk-YRT7GQ5Y.js";
15
- import "../chunk-XTLQXR4U.js";
15
+ import "../chunk-KURGXM4I.js";
16
16
  import "../chunk-U4MRIFKL.js";
17
- import "../chunk-4HJ6AK2Q.js";
18
- import "../chunk-H7T5DXUU.js";
17
+ import "../chunk-7ARKUCQT.js";
18
+ import "../chunk-FE6OJV6O.js";
19
19
  import "../chunk-SSUPBUF5.js";
20
20
  import "../chunk-MLX2BOJC.js";
21
21
  import "../chunk-O3GVVND4.js";
@@ -1,4 +1,4 @@
1
- import { c as ZipSafetyLimits } from './zipLimits-bGYMS9cI.js';
1
+ import { c as ZipSafetyLimits } from './zipLimits-BOKCB7qk.js';
2
2
 
3
3
  /**
4
4
  * OOXML Types
@@ -89,8 +89,8 @@ interface PendingRelationship {
89
89
  * structural metadata: [Content_Types].xml, relationships, and
90
90
  * core properties.
91
91
  *
92
- * Uses bounded JSZip member streams and a platform DOMParser (with an xmldom
93
- * fallback in bare Node/SSR) to parse XML.
92
+ * Uses bounded JSZip member streams and a platform DOMParser (with the
93
+ * package-owned xmldom parser in Node/SSR) to parse XML.
94
94
  */
95
95
 
96
96
  type OoxmlOpenOptions = ZipSafetyLimits;
@@ -3,14 +3,15 @@ import { TransformStyleInput, TransformStyleRegistry } from '@bendyline/squisq/t
3
3
  import { ParseOptions, StringifyOptions, MarkdownDocument } from '@bendyline/squisq/markdown';
4
4
  import { ContentContainer } from '@bendyline/squisq/storage';
5
5
  import { DocxImportOptions, DocxExportOptions } from '../docx/index.js';
6
- import { a as PptxImportOptions, P as PptxExportOptions } from '../import-Yivc3kZM.js';
7
- import { a as XlsxImportOptions, X as XlsxExportOptions } from '../export-Djev9BLU.js';
6
+ import { a as PptxImportOptions, P as PptxExportOptions } from '../import-K8mfc0fz.js';
7
+ import { a as XlsxImportOptions, X as XlsxExportOptions } from '../export-D2NkylDT.js';
8
8
  import { CsvImportOptions, CsvExportOptions } from '../csv/index.js';
9
9
  import { PdfImportOptions, PdfExportOptions } from '../pdf/index.js';
10
10
  import { a as HtmlImportOptions, H as HtmlExportOptions } from '../import-DTkDxHmZ.js';
11
11
  import { EpubExportOptions } from '../epub/index.js';
12
- import { c as ZipSafetyLimits } from '../zipLimits-bGYMS9cI.js';
13
- import '../reader-Gof6OrJX.js';
12
+ import { ContainerToZipOptions } from '../container/index.js';
13
+ import { c as ZipSafetyLimits } from '../zipLimits-BOKCB7qk.js';
14
+ import '../reader-B9L8Ucbj.js';
14
15
 
15
16
  /**
16
17
  * Format registry — shared types.
@@ -42,7 +43,7 @@ interface MarkdownFormatOptions {
42
43
  stringify?: StringifyOptions;
43
44
  }
44
45
  /** Resource limits applied when importing a DBK/ZIP container. */
45
- type DbkFormatOptions = ZipSafetyLimits;
46
+ type DbkFormatOptions = ZipSafetyLimits & ContainerToZipOptions;
46
47
  /**
47
48
  * Strongly typed option bags for built-in formats. Import and export options
48
49
  * share a bag because a single conversion may use the format on either side.
@@ -74,6 +75,8 @@ interface NormalizedInput {
74
75
  }
75
76
  /** Options threaded through `convert()` and into every format method. */
76
77
  interface ConvertOptions {
78
+ /** Cancel normalization, transformation, or export at the next bounded work boundary. */
79
+ signal?: AbortSignal;
77
80
  /** Registry to resolve formats against. Defaults to `defaultRegistry()`. */
78
81
  registry?: FormatRegistry;
79
82
  /** Explicit source format id (skips extension/byte sniffing). */
@@ -95,6 +98,15 @@ interface ConvertOptions {
95
98
  /** Typed per-format options for built-ins; custom format ids remain extensible. */
96
99
  formatOptions?: Partial<BuiltinFormatOptions> & Record<FormatId, unknown>;
97
100
  }
101
+ /** Target-only options accepted after a source has already been normalized and transformed. */
102
+ type PreparedExportOptions = Pick<ConvertOptions, 'signal' | 'title' | 'resolvePlayerScript' | 'formatOptions'>;
103
+ /**
104
+ * An opaque normalized conversion snapshot. The source and transform pipeline
105
+ * has already completed; each call exports that same snapshot to one target.
106
+ */
107
+ interface PreparedConversion {
108
+ convert(to: FormatId, options?: PreparedExportOptions): Promise<ConversionResult>;
109
+ }
98
110
  /** Describes how a single format imports to / exports from the squisq model. */
99
111
  interface FormatDefinition {
100
112
  id: FormatId;
@@ -192,6 +204,8 @@ declare function defaultFormats(): FormatDefinition[];
192
204
  * an optional transform, then hands off to the target format's exporter.
193
205
  */
194
206
 
207
+ /** Normalize and transform a source once, then safely export that snapshot many times. */
208
+ declare function prepareConversion(source: ConvertSource, options?: ConvertOptions): Promise<PreparedConversion>;
195
209
  /**
196
210
  * Convert a source document to a target format.
197
211
  *
@@ -202,4 +216,4 @@ declare function defaultFormats(): FormatDefinition[];
202
216
  */
203
217
  declare function convert(source: ConvertSource, to: FormatId, options?: ConvertOptions): Promise<ConversionResult>;
204
218
 
205
- export { BUILTIN_FORMAT_IDS, type BuiltinFormatOptions, ConversionError, type ConversionErrorCode, type ConversionErrorOptions, type ConversionResult, type ConvertOptions, type ConvertSource, type DbkFormatOptions, type FormatDefinition, type FormatId, type FormatRegistry, type MarkdownFormatOptions, type NormalizedInput, convert, createRegistry, defaultFormats, defaultRegistry };
219
+ export { BUILTIN_FORMAT_IDS, type BuiltinFormatOptions, ConversionError, type ConversionErrorCode, type ConversionErrorOptions, type ConversionResult, type ConvertOptions, type ConvertSource, type DbkFormatOptions, type FormatDefinition, type FormatId, type FormatRegistry, type MarkdownFormatOptions, type NormalizedInput, type PreparedConversion, type PreparedExportOptions, convert, createRegistry, defaultFormats, defaultRegistry, prepareConversion };
@@ -3,18 +3,20 @@ import {
3
3
  convert,
4
4
  createRegistry,
5
5
  defaultFormats,
6
- defaultRegistry
7
- } from "../chunk-2EFDWKC6.js";
6
+ defaultRegistry,
7
+ prepareConversion
8
+ } from "../chunk-WQSHGBLN.js";
8
9
  import {
9
10
  ConversionError
10
11
  } from "../chunk-ODL3SSPT.js";
11
- import "../chunk-H7T5DXUU.js";
12
+ import "../chunk-FE6OJV6O.js";
12
13
  export {
13
14
  BUILTIN_FORMAT_IDS,
14
15
  ConversionError,
15
16
  convert,
16
17
  createRegistry,
17
18
  defaultFormats,
18
- defaultRegistry
19
+ defaultRegistry,
20
+ prepareConversion
19
21
  };
20
22
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- import { a as OoxmlPackage } from './reader-Gof6OrJX.js';
1
+ import { a as OoxmlPackage } from './reader-B9L8Ucbj.js';
2
2
 
3
3
  /**
4
4
  * OOXML theme reader — parses a `theme1.xml` part (DrawingML `a:theme`)
@@ -1,9 +1,9 @@
1
1
  import { Doc } from '@bendyline/squisq/schemas';
2
- import { a as XlsxImportOptions } from '../export-Djev9BLU.js';
3
- export { X as XlsxExportOptions, d as docToXlsx, m as markdownDocToXlsx, x as xlsxToMarkdownDoc } from '../export-Djev9BLU.js';
2
+ import { a as XlsxImportOptions } from '../export-D2NkylDT.js';
3
+ export { X as XlsxExportOptions, d as docToXlsx, m as markdownDocToXlsx, x as xlsxToMarkdownDoc } from '../export-D2NkylDT.js';
4
4
  import '@bendyline/squisq/markdown';
5
- import '../reader-Gof6OrJX.js';
6
- import '../zipLimits-bGYMS9cI.js';
5
+ import '../reader-B9L8Ucbj.js';
6
+ import '../zipLimits-BOKCB7qk.js';
7
7
 
8
8
  /**
9
9
  * @bendyline/squisq-formats XLSX Module
@@ -3,12 +3,12 @@ import {
3
3
  markdownDocToXlsx,
4
4
  xlsxToDoc,
5
5
  xlsxToMarkdownDoc
6
- } from "../chunk-HBSCRS5P.js";
6
+ } from "../chunk-UGYF5AZE.js";
7
7
  import "../chunk-PN52A5AA.js";
8
- import "../chunk-XTLQXR4U.js";
8
+ import "../chunk-KURGXM4I.js";
9
9
  import "../chunk-U4MRIFKL.js";
10
- import "../chunk-4HJ6AK2Q.js";
11
- import "../chunk-H7T5DXUU.js";
10
+ import "../chunk-7ARKUCQT.js";
11
+ import "../chunk-FE6OJV6O.js";
12
12
  export {
13
13
  docToXlsx,
14
14
  markdownDocToXlsx,
@@ -1,6 +1,8 @@
1
1
  /** ZIP safety policy, structured errors, path checks, and metadata validation. */
2
2
 
3
3
  interface ZipSafetyLimits {
4
+ /** Cooperatively cancel archive opening, validation, and member traversal. */
5
+ signal?: AbortSignal;
4
6
  /** Maximum number of archive records, including directories. Default: 10,000. */
5
7
  maxEntries?: number;
6
8
  /** Maximum uncompressed bytes for one member. Defaults to maxUncompressedBytes. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bendyline/squisq-formats",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "Document format converters — DOCX, PDF, OOXML import/export",
5
5
  "license": "MIT",
6
6
  "author": "Bendyline",
@@ -100,7 +100,7 @@
100
100
  },
101
101
  "dependencies": {
102
102
  "@xmldom/xmldom": "0.9.10",
103
- "@bendyline/squisq": "2.0.0",
103
+ "@bendyline/squisq": "2.1.0",
104
104
  "jszip": "3.10.1",
105
105
  "pdf-lib": "1.17.1",
106
106
  "pdfjs-dist": "4.10.38"