@jsonpdf/plugins 0.1.0-alpha.1

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 (135) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +59 -0
  3. package/dist/barcode/barcode-generator.d.ts +18 -0
  4. package/dist/barcode/barcode-generator.d.ts.map +1 -0
  5. package/dist/barcode/barcode-generator.js +94 -0
  6. package/dist/barcode/barcode-generator.js.map +1 -0
  7. package/dist/barcode/barcode-plugin.d.ts +4 -0
  8. package/dist/barcode/barcode-plugin.d.ts.map +1 -0
  9. package/dist/barcode/barcode-plugin.js +70 -0
  10. package/dist/barcode/barcode-plugin.js.map +1 -0
  11. package/dist/barcode/barcode-types.d.ts +29 -0
  12. package/dist/barcode/barcode-types.d.ts.map +1 -0
  13. package/dist/barcode/barcode-types.js +60 -0
  14. package/dist/barcode/barcode-types.js.map +1 -0
  15. package/dist/chart/chart-generator.d.ts +17 -0
  16. package/dist/chart/chart-generator.d.ts.map +1 -0
  17. package/dist/chart/chart-generator.js +77 -0
  18. package/dist/chart/chart-generator.js.map +1 -0
  19. package/dist/chart/chart-plugin.d.ts +4 -0
  20. package/dist/chart/chart-plugin.d.ts.map +1 -0
  21. package/dist/chart/chart-plugin.js +65 -0
  22. package/dist/chart/chart-plugin.js.map +1 -0
  23. package/dist/chart/chart-types.d.ts +18 -0
  24. package/dist/chart/chart-types.d.ts.map +1 -0
  25. package/dist/chart/chart-types.js +18 -0
  26. package/dist/chart/chart-types.js.map +1 -0
  27. package/dist/container/container-plugin.d.ts +15 -0
  28. package/dist/container/container-plugin.d.ts.map +1 -0
  29. package/dist/container/container-plugin.js +190 -0
  30. package/dist/container/container-plugin.js.map +1 -0
  31. package/dist/frame/frame-plugin.d.ts +4 -0
  32. package/dist/frame/frame-plugin.d.ts.map +1 -0
  33. package/dist/frame/frame-plugin.js +52 -0
  34. package/dist/frame/frame-plugin.js.map +1 -0
  35. package/dist/frame/frame-types.d.ts +8 -0
  36. package/dist/frame/frame-types.d.ts.map +1 -0
  37. package/dist/frame/frame-types.js +17 -0
  38. package/dist/frame/frame-types.js.map +1 -0
  39. package/dist/image/image-loader.d.ts +13 -0
  40. package/dist/image/image-loader.d.ts.map +1 -0
  41. package/dist/image/image-loader.js +73 -0
  42. package/dist/image/image-loader.js.map +1 -0
  43. package/dist/image/image-plugin.d.ts +19 -0
  44. package/dist/image/image-plugin.d.ts.map +1 -0
  45. package/dist/image/image-plugin.js +112 -0
  46. package/dist/image/image-plugin.js.map +1 -0
  47. package/dist/image/svg-rasterizer.d.ts +30 -0
  48. package/dist/image/svg-rasterizer.d.ts.map +1 -0
  49. package/dist/image/svg-rasterizer.js +97 -0
  50. package/dist/image/svg-rasterizer.js.map +1 -0
  51. package/dist/index.d.ts +32 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +38 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/line/line-plugin.d.ts +11 -0
  56. package/dist/line/line-plugin.d.ts.map +1 -0
  57. package/dist/line/line-plugin.js +68 -0
  58. package/dist/line/line-plugin.js.map +1 -0
  59. package/dist/list/list-plugin.d.ts +13 -0
  60. package/dist/list/list-plugin.d.ts.map +1 -0
  61. package/dist/list/list-plugin.js +194 -0
  62. package/dist/list/list-plugin.js.map +1 -0
  63. package/dist/list/list-types.d.ts +9 -0
  64. package/dist/list/list-types.d.ts.map +1 -0
  65. package/dist/list/list-types.js +9 -0
  66. package/dist/list/list-types.js.map +1 -0
  67. package/dist/platform/base64.d.ts +7 -0
  68. package/dist/platform/base64.d.ts.map +1 -0
  69. package/dist/platform/base64.js +17 -0
  70. package/dist/platform/base64.js.map +1 -0
  71. package/dist/platform/font-store.d.ts +3 -0
  72. package/dist/platform/font-store.d.ts.map +1 -0
  73. package/dist/platform/font-store.js +8 -0
  74. package/dist/platform/font-store.js.map +1 -0
  75. package/dist/platform/fs.browser.d.ts +6 -0
  76. package/dist/platform/fs.browser.d.ts.map +1 -0
  77. package/dist/platform/fs.browser.js +10 -0
  78. package/dist/platform/fs.browser.js.map +1 -0
  79. package/dist/platform/fs.d.ts +5 -0
  80. package/dist/platform/fs.d.ts.map +1 -0
  81. package/dist/platform/fs.js +10 -0
  82. package/dist/platform/fs.js.map +1 -0
  83. package/dist/platform/init.browser.d.ts +10 -0
  84. package/dist/platform/init.browser.d.ts.map +1 -0
  85. package/dist/platform/init.browser.js +24 -0
  86. package/dist/platform/init.browser.js.map +1 -0
  87. package/dist/platform/init.d.ts +6 -0
  88. package/dist/platform/init.d.ts.map +1 -0
  89. package/dist/platform/init.js +12 -0
  90. package/dist/platform/init.js.map +1 -0
  91. package/dist/platform/svg-rasterizer.browser.d.ts +2 -0
  92. package/dist/platform/svg-rasterizer.browser.d.ts.map +1 -0
  93. package/dist/platform/svg-rasterizer.browser.js +2 -0
  94. package/dist/platform/svg-rasterizer.browser.js.map +1 -0
  95. package/dist/platform/svg-rasterizer.d.ts +2 -0
  96. package/dist/platform/svg-rasterizer.d.ts.map +1 -0
  97. package/dist/platform/svg-rasterizer.js +2 -0
  98. package/dist/platform/svg-rasterizer.js.map +1 -0
  99. package/dist/registry.d.ts +32 -0
  100. package/dist/registry.d.ts.map +1 -0
  101. package/dist/registry.js +67 -0
  102. package/dist/registry.js.map +1 -0
  103. package/dist/shape/shape-plugin.d.ts +21 -0
  104. package/dist/shape/shape-plugin.d.ts.map +1 -0
  105. package/dist/shape/shape-plugin.js +148 -0
  106. package/dist/shape/shape-plugin.js.map +1 -0
  107. package/dist/table/table-plugin.d.ts +4 -0
  108. package/dist/table/table-plugin.d.ts.map +1 -0
  109. package/dist/table/table-plugin.js +232 -0
  110. package/dist/table/table-plugin.js.map +1 -0
  111. package/dist/table/table-types.d.ts +50 -0
  112. package/dist/table/table-types.d.ts.map +1 -0
  113. package/dist/table/table-types.js +129 -0
  114. package/dist/table/table-types.js.map +1 -0
  115. package/dist/text/text-decoration.d.ts +22 -0
  116. package/dist/text/text-decoration.d.ts.map +1 -0
  117. package/dist/text/text-decoration.js +43 -0
  118. package/dist/text/text-decoration.js.map +1 -0
  119. package/dist/text/text-plugin.d.ts +9 -0
  120. package/dist/text/text-plugin.d.ts.map +1 -0
  121. package/dist/text/text-plugin.js +496 -0
  122. package/dist/text/text-plugin.js.map +1 -0
  123. package/dist/text/word-wrap.d.ts +41 -0
  124. package/dist/text/word-wrap.d.ts.map +1 -0
  125. package/dist/text/word-wrap.js +149 -0
  126. package/dist/text/word-wrap.js.map +1 -0
  127. package/dist/types.d.ts +96 -0
  128. package/dist/types.d.ts.map +1 -0
  129. package/dist/types.js +5 -0
  130. package/dist/types.js.map +1 -0
  131. package/dist/utils.d.ts +8 -0
  132. package/dist/utils.d.ts.map +1 -0
  133. package/dist/utils.js +27 -0
  134. package/dist/utils.js.map +1 -0
  135. package/package.json +62 -0
@@ -0,0 +1,97 @@
1
+ import { Resvg } from '#platform/svg-rasterizer';
2
+ import { getFontBuffers } from '../platform/font-store.js';
3
+ /** Default scale factor for SVG rasterization (2x for HiDPI). */
4
+ export const DEFAULT_SVG_SCALE = 2;
5
+ /**
6
+ * Check if raw bytes look like SVG content.
7
+ * Examines the first 1024 bytes (after BOM/whitespace) for `<svg` or `<?xml`.
8
+ */
9
+ export function isSvgBytes(bytes) {
10
+ if (bytes.length === 0)
11
+ return false;
12
+ // Decode up to 1024 bytes as UTF-8
13
+ const sample = new TextDecoder('utf-8', { fatal: false }).decode(bytes.slice(0, 1024));
14
+ // Strip BOM and leading whitespace
15
+ const trimmed = sample
16
+ .replace(/^\uFEFF/, '')
17
+ .trimStart()
18
+ .toLowerCase();
19
+ return trimmed.startsWith('<svg') || trimmed.startsWith('<?xml');
20
+ }
21
+ /**
22
+ * Parse intrinsic dimensions from an SVG string.
23
+ * Uses regex to extract width/height attributes or viewBox from the `<svg>` tag.
24
+ * Falls back to 300×150 (HTML spec default for replaced elements).
25
+ */
26
+ export function parseSvgDimensions(svg) {
27
+ const DEFAULT_WIDTH = 300;
28
+ const DEFAULT_HEIGHT = 150;
29
+ // Match the opening <svg ...> tag (non-greedy)
30
+ const svgTagMatch = svg.match(/<svg\s[^>]*>/i);
31
+ if (!svgTagMatch)
32
+ return { width: DEFAULT_WIDTH, height: DEFAULT_HEIGHT };
33
+ const tag = svgTagMatch[0];
34
+ // Try explicit width/height attributes (strip optional units like px, pt, em)
35
+ const widthMatch = tag.match(/\bwidth\s*=\s*["']([^"']+)["']/i);
36
+ const heightMatch = tag.match(/\bheight\s*=\s*["']([^"']+)["']/i);
37
+ if (widthMatch && heightMatch) {
38
+ const w = parseFloat(widthMatch[1]);
39
+ const h = parseFloat(heightMatch[1]);
40
+ if (!isNaN(w) && !isNaN(h) && w > 0 && h > 0) {
41
+ return { width: w, height: h };
42
+ }
43
+ }
44
+ // Fall back to viewBox
45
+ const viewBoxMatch = tag.match(/\bviewBox\s*=\s*["']([^"']+)["']/i);
46
+ if (viewBoxMatch) {
47
+ const parts = viewBoxMatch[1].trim().split(/[\s,]+/);
48
+ if (parts.length === 4) {
49
+ const vbW = parseFloat(parts[2]);
50
+ const vbH = parseFloat(parts[3]);
51
+ if (!isNaN(vbW) && !isNaN(vbH) && vbW > 0 && vbH > 0) {
52
+ return { width: vbW, height: vbH };
53
+ }
54
+ }
55
+ }
56
+ return { width: DEFAULT_WIDTH, height: DEFAULT_HEIGHT };
57
+ }
58
+ /**
59
+ * Rasterize an SVG string to PNG bytes using @resvg/resvg-js.
60
+ *
61
+ * @param svg SVG markup string
62
+ * @param scale Scale factor (default {@link DEFAULT_SVG_SCALE}).
63
+ * The SVG intrinsic dimensions are multiplied by this value.
64
+ * @returns PNG bytes and intrinsic (pre-scale) dimensions for aspect ratio calculations.
65
+ */
66
+ export function rasterizeSvg(svg, scale = DEFAULT_SVG_SCALE) {
67
+ try {
68
+ const buffers = getFontBuffers();
69
+ // When font buffers are provided (browser), pass them to Resvg so <text>
70
+ // elements render correctly. The `fontBuffers` property exists on the WASM
71
+ // variant's types (CustomFontsOptions) but not the Node variant's, hence
72
+ // the FontOptionsWithBuffers assertion.
73
+ const resvg = new Resvg(svg, {
74
+ fitTo: { mode: 'zoom', value: scale },
75
+ logLevel: 'off',
76
+ ...(buffers.length > 0 && {
77
+ font: {
78
+ fontBuffers: buffers,
79
+ loadSystemFonts: false,
80
+ defaultFontFamily: 'sans-serif',
81
+ },
82
+ }),
83
+ });
84
+ // Intrinsic dimensions (before scale) — used by computeFitDimensions
85
+ const width = resvg.width;
86
+ const height = resvg.height;
87
+ const rendered = resvg.render();
88
+ const pngBuffer = rendered.asPng();
89
+ const pngBytes = new Uint8Array(pngBuffer.buffer, pngBuffer.byteOffset, pngBuffer.byteLength);
90
+ return { pngBytes, width, height };
91
+ }
92
+ catch (err) {
93
+ const message = err instanceof Error ? err.message : String(err);
94
+ throw new Error(`Failed to rasterize SVG: ${message}`);
95
+ }
96
+ }
97
+ //# sourceMappingURL=svg-rasterizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg-rasterizer.js","sourceRoot":"","sources":["../../src/image/svg-rasterizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export type { Plugin, MeasureContext, RenderContext, FontMap, EmbeddedImage, ImageCache, } from './types.js';
2
+ export { fontKey } from './types.js';
3
+ export { PluginRegistry, registerPlugin, getPlugin, hasPlugin, getAllPlugins, clearPlugins, } from './registry.js';
4
+ export { getFont, getLineHeight } from './utils.js';
5
+ export { textPlugin, type TextProps } from './text/text-plugin.js';
6
+ export { wrapText, measureTextWidth, type WrapOptions } from './text/word-wrap.js';
7
+ export { linePlugin, type LineProps } from './line/line-plugin.js';
8
+ export { listPlugin, type ListProps } from './list/list-plugin.js';
9
+ export type { ListItem, ListItemInput } from './list/list-types.js';
10
+ export { isListItem, toListItem } from './list/list-types.js';
11
+ export { shapePlugin, type ShapeProps, roundedRectPath } from './shape/shape-plugin.js';
12
+ export { imagePlugin, type ImageProps, computeFitDimensions } from './image/image-plugin.js';
13
+ export { createImageCache, loadImageBytes, detectFormat } from './image/image-loader.js';
14
+ export type { ImageFormat, LoadedImage } from './image/image-loader.js';
15
+ export { rasterizeSvg, isSvgBytes, parseSvgDimensions, DEFAULT_SVG_SCALE, } from './image/svg-rasterizer.js';
16
+ export { containerPlugin, type ContainerProps } from './container/container-plugin.js';
17
+ export { tablePlugin } from './table/table-plugin.js';
18
+ export { type TableProps, type TableColumn, computeColumnWidths } from './table/table-types.js';
19
+ export { barcodePlugin } from './barcode/barcode-plugin.js';
20
+ export { type BarcodeProps, type BarcodeFormat, SUPPORTED_FORMATS, } from './barcode/barcode-types.js';
21
+ export { generateBarcode, createBarcodeCache, toBwipColor } from './barcode/barcode-generator.js';
22
+ export type { BarcodeCache } from './barcode/barcode-generator.js';
23
+ export { chartPlugin } from './chart/chart-plugin.js';
24
+ export { type ChartProps, type ChartFit } from './chart/chart-types.js';
25
+ export { generateChart, createChartCache, buildFinalSpec } from './chart/chart-generator.js';
26
+ export type { ChartCache } from './chart/chart-generator.js';
27
+ export { framePlugin } from './frame/frame-plugin.js';
28
+ export { type FrameProps } from './frame/frame-types.js';
29
+ export { readFileBytes } from '#platform/fs';
30
+ export { uint8ArrayToBase64 } from './platform/base64.js';
31
+ export { initBrowser } from '#platform/init';
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,MAAM,EACN,cAAc,EACd,aAAa,EACb,OAAO,EACP,aAAa,EACb,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAGrC,OAAO,EACL,cAAc,EACd,cAAc,EACd,SAAS,EACT,SAAS,EACT,aAAa,EACb,YAAY,GACb,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGpD,OAAO,EAAE,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGnF,OAAO,EAAE,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGnE,OAAO,EAAE,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACnE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAG9D,OAAO,EAAE,WAAW,EAAE,KAAK,UAAU,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAGxF,OAAO,EAAE,WAAW,EAAE,KAAK,UAAU,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACzF,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EACL,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAGvF,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAGhG,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClG,YAAY,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAGnE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC7F,YAAY,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAG7D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGzD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,38 @@
1
+ export { fontKey } from './types.js';
2
+ // Registry
3
+ export { PluginRegistry, registerPlugin, getPlugin, hasPlugin, getAllPlugins, clearPlugins, } from './registry.js';
4
+ // Shared plugin utilities
5
+ export { getFont, getLineHeight } from './utils.js';
6
+ // Text plugin
7
+ export { textPlugin } from './text/text-plugin.js';
8
+ export { wrapText, measureTextWidth } from './text/word-wrap.js';
9
+ // Line plugin
10
+ export { linePlugin } from './line/line-plugin.js';
11
+ // List plugin
12
+ export { listPlugin } from './list/list-plugin.js';
13
+ export { isListItem, toListItem } from './list/list-types.js';
14
+ // Shape plugin
15
+ export { shapePlugin, roundedRectPath } from './shape/shape-plugin.js';
16
+ // Image plugin
17
+ export { imagePlugin, computeFitDimensions } from './image/image-plugin.js';
18
+ export { createImageCache, loadImageBytes, detectFormat } from './image/image-loader.js';
19
+ export { rasterizeSvg, isSvgBytes, parseSvgDimensions, DEFAULT_SVG_SCALE, } from './image/svg-rasterizer.js';
20
+ // Container plugin
21
+ export { containerPlugin } from './container/container-plugin.js';
22
+ // Table plugin
23
+ export { tablePlugin } from './table/table-plugin.js';
24
+ export { computeColumnWidths } from './table/table-types.js';
25
+ // Barcode plugin
26
+ export { barcodePlugin } from './barcode/barcode-plugin.js';
27
+ export { SUPPORTED_FORMATS, } from './barcode/barcode-types.js';
28
+ export { generateBarcode, createBarcodeCache, toBwipColor } from './barcode/barcode-generator.js';
29
+ // Chart plugin
30
+ export { chartPlugin } from './chart/chart-plugin.js';
31
+ export { generateChart, createChartCache, buildFinalSpec } from './chart/chart-generator.js';
32
+ // Frame plugin
33
+ export { framePlugin } from './frame/frame-plugin.js';
34
+ // Platform utilities
35
+ export { readFileBytes } from '#platform/fs';
36
+ export { uint8ArrayToBase64 } from './platform/base64.js';
37
+ export { initBrowser } from '#platform/init';
38
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,WAAW;AACX,OAAO,EACL,cAAc,EACd,cAAc,EACd,SAAS,EACT,SAAS,EACT,aAAa,EACb,YAAY,GACb,MAAM,eAAe,CAAC;AAEvB,0BAA0B;AAC1B,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEpD,cAAc;AACd,OAAO,EAAE,UAAU,EAAkB,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAoB,MAAM,qBAAqB,CAAC;AAEnF,cAAc;AACd,OAAO,EAAE,UAAU,EAAkB,MAAM,uBAAuB,CAAC;AAEnE,cAAc;AACd,OAAO,EAAE,UAAU,EAAkB,MAAM,uBAAuB,CAAC;AAEnE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE9D,eAAe;AACf,OAAO,EAAE,WAAW,EAAmB,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAExF,eAAe;AACf,OAAO,EAAE,WAAW,EAAmB,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEzF,OAAO,EACL,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,2BAA2B,CAAC;AAEnC,mBAAmB;AACnB,OAAO,EAAE,eAAe,EAAuB,MAAM,iCAAiC,CAAC;AAEvF,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAqC,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAEhG,iBAAiB;AACjB,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAGL,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAGlG,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAG7F,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGtD,qBAAqB;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { JSONSchema } from '@jsonpdf/core';
2
+ import type { Plugin } from '../types.js';
3
+ export interface LineProps {
4
+ color?: string;
5
+ thickness?: number;
6
+ direction?: 'horizontal' | 'vertical';
7
+ dashPattern?: number[];
8
+ }
9
+ export declare const linePropsSchema: JSONSchema;
10
+ export declare const linePlugin: Plugin<LineProps>;
11
+ //# sourceMappingURL=line-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"line-plugin.d.ts","sourceRoot":"","sources":["../../src/line/line-plugin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAmB,UAAU,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,EAAiC,MAAM,aAAa,CAAC;AAEzE,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,eAAO,MAAM,eAAe,EAAE,UAQ7B,CAAC;AAIF,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,SAAS,CA6DxC,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { rgb } from 'pdf-lib';
2
+ import { parseColor } from '@jsonpdf/core';
3
+ export const linePropsSchema = {
4
+ type: 'object',
5
+ properties: {
6
+ color: { type: 'string' },
7
+ thickness: { type: 'number', exclusiveMinimum: 0 },
8
+ direction: { type: 'string', enum: ['horizontal', 'vertical'] },
9
+ dashPattern: { type: 'array', items: { type: 'number', minimum: 0 } },
10
+ },
11
+ };
12
+ const LINE_DEFAULTS = { color: '#000000', thickness: 1, direction: 'horizontal' };
13
+ export const linePlugin = {
14
+ type: 'line',
15
+ propsSchema: linePropsSchema,
16
+ defaultProps: LINE_DEFAULTS,
17
+ resolveProps(raw) {
18
+ return { ...LINE_DEFAULTS, ...raw };
19
+ },
20
+ validate(props) {
21
+ const errors = [];
22
+ if (props.color !== undefined &&
23
+ typeof props.color === 'string' &&
24
+ !props.color.startsWith('#')) {
25
+ errors.push({ path: '/color', message: 'color must be a hex string starting with #' });
26
+ }
27
+ if (props.thickness !== undefined && props.thickness <= 0) {
28
+ errors.push({ path: '/thickness', message: 'thickness must be greater than 0' });
29
+ }
30
+ return errors;
31
+ },
32
+ measure(props, ctx) {
33
+ const thickness = props.thickness ?? 1;
34
+ if (props.direction === 'vertical') {
35
+ return Promise.resolve({ width: thickness, height: ctx.availableHeight });
36
+ }
37
+ return Promise.resolve({ width: ctx.availableWidth, height: thickness });
38
+ },
39
+ render(props, ctx) {
40
+ const thickness = props.thickness ?? 1;
41
+ const color = parseColor(props.color ?? '#000000');
42
+ const pdfColor = rgb(color.r, color.g, color.b);
43
+ if (props.direction === 'vertical') {
44
+ const lineX = ctx.x + ctx.width / 2;
45
+ ctx.page.drawLine({
46
+ start: { x: lineX, y: ctx.y },
47
+ end: { x: lineX, y: ctx.y - ctx.height },
48
+ thickness,
49
+ color: pdfColor,
50
+ dashArray: props.dashPattern,
51
+ opacity: ctx.opacity,
52
+ });
53
+ }
54
+ else {
55
+ const lineY = ctx.y - ctx.height / 2;
56
+ ctx.page.drawLine({
57
+ start: { x: ctx.x, y: lineY },
58
+ end: { x: ctx.x + ctx.width, y: lineY },
59
+ thickness,
60
+ color: pdfColor,
61
+ dashArray: props.dashPattern,
62
+ opacity: ctx.opacity,
63
+ });
64
+ }
65
+ return Promise.resolve();
66
+ },
67
+ };
68
+ //# sourceMappingURL=line-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"line-plugin.js","sourceRoot":"","sources":["../../src/line/line-plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { JSONSchema } from '@jsonpdf/core';
2
+ import type { Plugin } from '../types.js';
3
+ import type { ListItemInput } from './list-types.js';
4
+ export interface ListProps {
5
+ listType?: 'bullet' | 'numbered' | 'lettered';
6
+ items: ListItemInput[];
7
+ bulletStyle?: string;
8
+ indent?: number;
9
+ itemSpacing?: number;
10
+ }
11
+ export declare const listPropsSchema: JSONSchema;
12
+ export declare const listPlugin: Plugin<ListProps>;
13
+ //# sourceMappingURL=list-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-plugin.d.ts","sourceRoot":"","sources":["../../src/list/list-plugin.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAmB,UAAU,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,EAAiC,MAAM,aAAa,CAAC;AAKzE,OAAO,KAAK,EAAE,aAAa,EAAY,MAAM,iBAAiB,CAAC;AAE/D,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;IAC9C,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,eAAe,EAAE,UAU7B,CAAC;AA8OF,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,SAAS,CAqDxC,CAAC"}
@@ -0,0 +1,194 @@
1
+ import { rgb, pushGraphicsState, popGraphicsState, setCharacterSpacing, setWordSpacing, } from 'pdf-lib';
2
+ import { parseColor } from '@jsonpdf/core';
3
+ import { getFont, getLineHeight } from '../utils.js';
4
+ import { wrapText, measureTextWidth } from '../text/word-wrap.js';
5
+ import { drawTextDecoration } from '../text/text-decoration.js';
6
+ import { toListItem } from './list-types.js';
7
+ export const listPropsSchema = {
8
+ type: 'object',
9
+ required: ['items'],
10
+ properties: {
11
+ listType: { type: 'string', enum: ['bullet', 'numbered', 'lettered'] },
12
+ items: { type: 'array' },
13
+ bulletStyle: { type: 'string' },
14
+ indent: { type: 'number', minimum: 0 },
15
+ itemSpacing: { type: 'number', minimum: 0 },
16
+ },
17
+ };
18
+ function getMarker(listType, index, bulletStyle) {
19
+ switch (listType) {
20
+ case 'bullet':
21
+ return bulletStyle;
22
+ case 'numbered':
23
+ return `${String(index + 1)}.`;
24
+ case 'lettered':
25
+ return `${toLetter(index)}.`;
26
+ }
27
+ }
28
+ function toLetter(index) {
29
+ let result = '';
30
+ let n = index;
31
+ do {
32
+ result = String.fromCharCode(97 + (n % 26)) + result;
33
+ n = Math.floor(n / 26) - 1;
34
+ } while (n >= 0);
35
+ return result;
36
+ }
37
+ function measureItems(items, ctx, listType, bulletStyle, indent, itemSpacing, depth) {
38
+ const style = ctx.elementStyle;
39
+ const font = getFont(ctx.fonts, style);
40
+ const fontSize = style.fontSize ?? 12;
41
+ const lh = getLineHeight(style);
42
+ const ls = style.letterSpacing ?? 0;
43
+ let totalHeight = 0;
44
+ for (let i = 0; i < items.length; i++) {
45
+ const item = items[i];
46
+ const depthIndent = depth * indent;
47
+ const marker = getMarker(listType, i, bulletStyle);
48
+ const markerWidth = measureTextWidth(marker + ' ', font, fontSize, ls || undefined);
49
+ const contentWidth = ctx.availableWidth - depthIndent - markerWidth;
50
+ const text = typeof item.content === 'string' ? item.content : item.content.map((r) => r.text).join('');
51
+ const wrapped = wrapText(text, font, fontSize, Math.max(contentWidth, 1), lh, undefined, ls || undefined);
52
+ totalHeight += wrapped.height;
53
+ if (item.children && item.children.length > 0) {
54
+ totalHeight += itemSpacing;
55
+ totalHeight += measureItems(item.children, ctx, listType, bulletStyle, indent, itemSpacing, depth + 1);
56
+ }
57
+ if (i < items.length - 1) {
58
+ totalHeight += itemSpacing;
59
+ }
60
+ }
61
+ return totalHeight;
62
+ }
63
+ function renderItems(items, ctx, listType, bulletStyle, indent, itemSpacing, depth, offsetY) {
64
+ const style = ctx.elementStyle;
65
+ const font = getFont(ctx.fonts, style);
66
+ const fontSize = style.fontSize ?? 12;
67
+ const lh = getLineHeight(style);
68
+ const color = parseColor(style.color ?? '#000000');
69
+ const pdfColor = rgb(color.r, color.g, color.b);
70
+ const ascent = font.heightAtSize(fontSize, { descender: false });
71
+ const ls = style.letterSpacing ?? 0;
72
+ const decoration = style.textDecoration;
73
+ const needsCharSpacing = ls !== 0;
74
+ let currentY = offsetY;
75
+ for (let i = 0; i < items.length; i++) {
76
+ const item = items[i];
77
+ const depthIndent = depth * indent;
78
+ const marker = getMarker(listType, i, bulletStyle);
79
+ const markerWidth = measureTextWidth(marker + ' ', font, fontSize, ls || undefined);
80
+ const contentX = ctx.x + depthIndent + markerWidth;
81
+ const contentWidth = ctx.width - depthIndent - markerWidth;
82
+ // Draw marker
83
+ if (needsCharSpacing) {
84
+ ctx.page.pushOperators(pushGraphicsState(), setCharacterSpacing(ls));
85
+ }
86
+ ctx.page.drawText(marker, {
87
+ x: ctx.x + depthIndent,
88
+ y: ctx.y - currentY - ascent,
89
+ font,
90
+ size: fontSize,
91
+ color: pdfColor,
92
+ opacity: ctx.opacity,
93
+ });
94
+ if (needsCharSpacing) {
95
+ ctx.page.pushOperators(popGraphicsState());
96
+ }
97
+ // Draw content
98
+ const text = typeof item.content === 'string' ? item.content : item.content.map((r) => r.text).join('');
99
+ const wrapped = wrapText(text, font, fontSize, Math.max(contentWidth, 1), lh, undefined, ls || undefined);
100
+ const textAlign = style.textAlign;
101
+ for (let j = 0; j < wrapped.lines.length; j++) {
102
+ const line = wrapped.lines[j];
103
+ if (line === '')
104
+ continue;
105
+ const lineY = ctx.y - currentY - j * lh - ascent;
106
+ const lineWidth = measureTextWidth(line, font, fontSize, ls || undefined);
107
+ // Compute X offset for alignment
108
+ let lineX = contentX;
109
+ if (textAlign === 'center') {
110
+ lineX = contentX + (contentWidth - lineWidth) / 2;
111
+ }
112
+ else if (textAlign === 'right') {
113
+ lineX = contentX + contentWidth - lineWidth;
114
+ }
115
+ // Compute extra word spacing for justify
116
+ let extraWordSpacing = 0;
117
+ if (textAlign === 'justify' && !wrapped.isLastInParagraph[j] && wrapped.wordsPerLine[j] > 1) {
118
+ extraWordSpacing = (contentWidth - lineWidth) / (wrapped.wordsPerLine[j] - 1);
119
+ }
120
+ const needsWordSpacing = extraWordSpacing !== 0;
121
+ if (needsCharSpacing || needsWordSpacing) {
122
+ const ops = [pushGraphicsState()];
123
+ if (needsCharSpacing)
124
+ ops.push(setCharacterSpacing(ls));
125
+ if (needsWordSpacing)
126
+ ops.push(setWordSpacing(extraWordSpacing));
127
+ ctx.page.pushOperators(...ops);
128
+ }
129
+ ctx.page.drawText(line, {
130
+ x: lineX,
131
+ y: lineY,
132
+ font,
133
+ size: fontSize,
134
+ color: pdfColor,
135
+ opacity: ctx.opacity,
136
+ });
137
+ if (needsCharSpacing || needsWordSpacing) {
138
+ ctx.page.pushOperators(popGraphicsState());
139
+ }
140
+ // Text decoration
141
+ if (decoration && decoration !== 'none') {
142
+ const decoWidth = textAlign === 'justify' && !wrapped.isLastInParagraph[j] ? contentWidth : lineWidth;
143
+ drawTextDecoration(ctx.page, decoration, lineX, lineY, decoWidth, font, fontSize, color, ctx.opacity);
144
+ }
145
+ }
146
+ currentY += wrapped.height;
147
+ if (item.children && item.children.length > 0) {
148
+ currentY += itemSpacing;
149
+ currentY = renderItems(item.children, ctx, listType, bulletStyle, indent, itemSpacing, depth + 1, currentY);
150
+ }
151
+ if (i < items.length - 1) {
152
+ currentY += itemSpacing;
153
+ }
154
+ }
155
+ return currentY;
156
+ }
157
+ const LIST_DEFAULTS = {
158
+ listType: 'bullet',
159
+ items: [],
160
+ bulletStyle: '\u2022',
161
+ indent: 20,
162
+ itemSpacing: 2,
163
+ };
164
+ export const listPlugin = {
165
+ type: 'list',
166
+ propsSchema: listPropsSchema,
167
+ defaultProps: LIST_DEFAULTS,
168
+ resolveProps(raw) {
169
+ return { ...LIST_DEFAULTS, ...raw };
170
+ },
171
+ validate(props) {
172
+ const errors = [];
173
+ if (!Array.isArray(props.items)) {
174
+ errors.push({ path: '/items', message: 'items must be an array' });
175
+ }
176
+ return errors;
177
+ },
178
+ measure(props, ctx) {
179
+ const items = props.items.map(toListItem);
180
+ if (items.length === 0) {
181
+ return Promise.resolve({ width: ctx.availableWidth, height: 0 });
182
+ }
183
+ const height = measureItems(items, ctx, props.listType ?? 'bullet', props.bulletStyle ?? '\u2022', props.indent ?? 20, props.itemSpacing ?? 2, 0);
184
+ return Promise.resolve({ width: ctx.availableWidth, height });
185
+ },
186
+ render(props, ctx) {
187
+ const items = props.items.map(toListItem);
188
+ if (items.length === 0)
189
+ return Promise.resolve();
190
+ renderItems(items, ctx, props.listType ?? 'bullet', props.bulletStyle ?? '\u2022', props.indent ?? 20, props.itemSpacing ?? 2, 0, 0);
191
+ return Promise.resolve();
192
+ },
193
+ };
194
+ //# sourceMappingURL=list-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-plugin.js","sourceRoot":"","sources":["../../src/list/list-plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { RichContent } from '@jsonpdf/core';
2
+ export interface ListItem {
3
+ content: RichContent;
4
+ children?: ListItem[];
5
+ }
6
+ export type ListItemInput = RichContent | ListItem;
7
+ export declare function isListItem(item: ListItemInput): item is ListItem;
8
+ export declare function toListItem(item: ListItemInput): ListItem;
9
+ //# sourceMappingURL=list-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-types.d.ts","sourceRoot":"","sources":["../../src/list/list-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,QAAQ,CAAC;AAEnD,wBAAgB,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,IAAI,QAAQ,CAEhE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,QAAQ,CAGxD"}
@@ -0,0 +1,9 @@
1
+ export function isListItem(item) {
2
+ return typeof item === 'object' && !Array.isArray(item) && 'content' in item;
3
+ }
4
+ export function toListItem(item) {
5
+ if (isListItem(item))
6
+ return item;
7
+ return { content: item };
8
+ }
9
+ //# sourceMappingURL=list-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-types.js","sourceRoot":"","sources":["../../src/list/list-types.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,UAAU,CAAC,IAAmB;IAC5C,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,SAAS,IAAI,IAAI,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAmB;IAC5C,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Convert a Uint8Array to a base64 string.
3
+ * Uses btoa() which is available in Node 16+ and all modern browsers.
4
+ * Builds the binary string in chunks to avoid stack overflow on large arrays.
5
+ */
6
+ export declare function uint8ArrayToBase64(bytes: Uint8Array): string;
7
+ //# sourceMappingURL=base64.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64.d.ts","sourceRoot":"","sources":["../../src/platform/base64.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAU5D"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Convert a Uint8Array to a base64 string.
3
+ * Uses btoa() which is available in Node 16+ and all modern browsers.
4
+ * Builds the binary string in chunks to avoid stack overflow on large arrays.
5
+ */
6
+ export function uint8ArrayToBase64(bytes) {
7
+ let binary = '';
8
+ const chunkSize = 8192;
9
+ for (let i = 0; i < bytes.length; i += chunkSize) {
10
+ const chunk = bytes.subarray(i, i + chunkSize);
11
+ for (let j = 0; j < chunk.length; j++) {
12
+ binary += String.fromCharCode(chunk[j]);
13
+ }
14
+ }
15
+ return btoa(binary);
16
+ }
17
+ //# sourceMappingURL=base64.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64.js","sourceRoot":"","sources":["../../src/platform/base64.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAiB;IAClD,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,MAAM,SAAS,GAAG,IAAI,CAAC;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;QAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function setFontBuffers(buffers: Uint8Array[]): void;
2
+ export declare function getFontBuffers(): Uint8Array[];
3
+ //# sourceMappingURL=font-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"font-store.d.ts","sourceRoot":"","sources":["../../src/platform/font-store.ts"],"names":[],"mappings":"AAEA,wBAAgB,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAE1D;AAED,wBAAgB,cAAc,IAAI,UAAU,EAAE,CAE7C"}
@@ -0,0 +1,8 @@
1
+ let fontBuffers = [];
2
+ export function setFontBuffers(buffers) {
3
+ fontBuffers = buffers;
4
+ }
5
+ export function getFontBuffers() {
6
+ return fontBuffers;
7
+ }
8
+ //# sourceMappingURL=font-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"font-store.js","sourceRoot":"","sources":["../../src/platform/font-store.ts"],"names":[],"mappings":"AAAA,IAAI,WAAW,GAAiB,EAAE,CAAC;AAEnC,MAAM,UAAU,cAAc,CAAC,OAAqB;IAClD,WAAW,GAAG,OAAO,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Browser stub for file system access.
3
+ * Throws a descriptive error since local file access is not available in browsers.
4
+ */
5
+ export declare function readFileBytes(src: string): Promise<Uint8Array>;
6
+ //# sourceMappingURL=fs.browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.browser.d.ts","sourceRoot":"","sources":["../../src/platform/fs.browser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAKpE"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Browser stub for file system access.
3
+ * Throws a descriptive error since local file access is not available in browsers.
4
+ */
5
+ // eslint-disable-next-line @typescript-eslint/require-await
6
+ export async function readFileBytes(src) {
7
+ throw new Error(`File system access is not available in the browser. ` +
8
+ `Cannot read "${src}". Use an HTTP(S) URL or data URI instead.`);
9
+ }
10
+ //# sourceMappingURL=fs.browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.browser.js","sourceRoot":"","sources":["../../src/platform/fs.browser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,4DAA4D;AAC5D,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW;IAC7C,MAAM,IAAI,KAAK,CACb,sDAAsD;QACpD,gBAAgB,GAAG,4CAA4C,CAClE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Read a file as bytes from a local path or file:// URL (Node.js only).
3
+ */
4
+ export declare function readFileBytes(src: string): Promise<Uint8Array>;
5
+ //# sourceMappingURL=fs.d.ts.map