@jasy/pdf 1.0.0-alpha.2 → 1.0.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/README.md +3 -3
  2. package/dist/api/args.d.ts +1 -1
  3. package/dist/api/args.js +2 -5
  4. package/dist/api/color.d.ts +4 -4
  5. package/dist/api/color.js +11 -17
  6. package/dist/api/content.d.ts +8 -8
  7. package/dist/api/content.js +23 -24
  8. package/dist/api/descriptor.d.ts +2 -2
  9. package/dist/api/descriptor.js +75 -31
  10. package/dist/api/index.d.ts +8 -8
  11. package/dist/api/index.js +8 -24
  12. package/dist/api/insets.js +4 -8
  13. package/dist/api/layout.d.ts +18 -16
  14. package/dist/api/layout.js +41 -52
  15. package/dist/api/structure.d.ts +60 -13
  16. package/dist/api/structure.js +132 -88
  17. package/dist/api/table.d.ts +5 -5
  18. package/dist/api/table.js +28 -24
  19. package/dist/api/text.d.ts +27 -2
  20. package/dist/api/text.js +45 -27
  21. package/dist/assets/font-data.d.ts +2 -0
  22. package/dist/assets/font-data.js +6 -0
  23. package/dist/assets/font-data.ts +7 -0
  24. package/dist/common/color.js +1 -5
  25. package/dist/constants/page-sizes.js +3 -6
  26. package/dist/constants/pdf-parts.js +1 -4
  27. package/dist/elements/container-element.d.ts +4 -4
  28. package/dist/elements/container-element.js +9 -13
  29. package/dist/elements/image-element.d.ts +18 -2
  30. package/dist/elements/image-element.js +81 -105
  31. package/dist/elements/index.d.ts +12 -11
  32. package/dist/elements/index.js +12 -29
  33. package/dist/elements/layout/default-text-style-element.d.ts +30 -0
  34. package/dist/elements/layout/default-text-style-element.js +47 -0
  35. package/dist/elements/layout/deferred-element.d.ts +3 -3
  36. package/dist/elements/layout/deferred-element.js +4 -8
  37. package/dist/elements/layout/expanded-element.d.ts +3 -3
  38. package/dist/elements/layout/expanded-element.js +10 -14
  39. package/dist/elements/layout/padding-element.d.ts +3 -3
  40. package/dist/elements/layout/padding-element.js +9 -14
  41. package/dist/elements/layout/positioned-element.d.ts +17 -4
  42. package/dist/elements/layout/positioned-element.js +29 -25
  43. package/dist/elements/layout/repeating-header-element.d.ts +3 -3
  44. package/dist/elements/layout/repeating-header-element.js +8 -12
  45. package/dist/elements/layout/sized-container-element.d.ts +2 -2
  46. package/dist/elements/layout/sized-container-element.js +6 -11
  47. package/dist/elements/line-element.d.ts +3 -3
  48. package/dist/elements/line-element.js +5 -10
  49. package/dist/elements/page-element.d.ts +8 -6
  50. package/dist/elements/page-element.js +20 -23
  51. package/dist/elements/pdf-document-element.d.ts +10 -4
  52. package/dist/elements/pdf-document-element.js +11 -10
  53. package/dist/elements/pdf-element.d.ts +12 -3
  54. package/dist/elements/pdf-element.js +10 -19
  55. package/dist/elements/rectangle-element.d.ts +5 -5
  56. package/dist/elements/rectangle-element.js +19 -25
  57. package/dist/elements/row-element.d.ts +3 -3
  58. package/dist/elements/row-element.js +7 -11
  59. package/dist/elements/text-element.d.ts +37 -11
  60. package/dist/elements/text-element.js +64 -39
  61. package/dist/index.d.ts +3 -3
  62. package/dist/index.js +3 -19
  63. package/dist/ir/display-list.d.ts +4 -2
  64. package/dist/ir/display-list.js +1 -2
  65. package/dist/layout/box-constraints.js +2 -6
  66. package/dist/layout/fragmentation.d.ts +8 -1
  67. package/dist/layout/fragmentation.js +22 -10
  68. package/dist/platform/browser-fs.d.ts +2 -0
  69. package/dist/platform/browser-fs.js +9 -0
  70. package/dist/platform/browser-image.d.ts +5 -0
  71. package/dist/platform/browser-image.js +13 -0
  72. package/dist/platform/node-fs.d.ts +2 -0
  73. package/dist/platform/node-fs.js +10 -0
  74. package/dist/platform/node-image.d.ts +5 -0
  75. package/dist/platform/node-image.js +9 -0
  76. package/dist/renderer/container-renderer.d.ts +3 -3
  77. package/dist/renderer/container-renderer.js +12 -27
  78. package/dist/renderer/default-text-style-renderer.d.ts +6 -0
  79. package/dist/renderer/default-text-style-renderer.js +10 -0
  80. package/dist/renderer/deferred-renderer.d.ts +3 -3
  81. package/dist/renderer/deferred-renderer.js +8 -23
  82. package/dist/renderer/expanded-renderer.d.ts +3 -3
  83. package/dist/renderer/expanded-renderer.js +6 -21
  84. package/dist/renderer/image-renderer.d.ts +3 -3
  85. package/dist/renderer/image-renderer.js +77 -75
  86. package/dist/renderer/index.d.ts +10 -10
  87. package/dist/renderer/index.js +10 -26
  88. package/dist/renderer/line-renderer.d.ts +3 -3
  89. package/dist/renderer/line-renderer.js +13 -28
  90. package/dist/renderer/padding-renderer.d.ts +3 -3
  91. package/dist/renderer/padding-renderer.js +6 -21
  92. package/dist/renderer/page-renderer.d.ts +2 -2
  93. package/dist/renderer/page-renderer.js +61 -77
  94. package/dist/renderer/pdf-backend.d.ts +2 -2
  95. package/dist/renderer/pdf-backend.js +21 -19
  96. package/dist/renderer/pdf-config.js +4 -7
  97. package/dist/renderer/pdf-document-class.d.ts +5 -5
  98. package/dist/renderer/pdf-document-class.js +24 -41
  99. package/dist/renderer/pdf-document-renderer.d.ts +3 -3
  100. package/dist/renderer/pdf-document-renderer.js +71 -85
  101. package/dist/renderer/pdf-renderer.d.ts +2 -2
  102. package/dist/renderer/pdf-renderer.js +83 -93
  103. package/dist/renderer/positioned-renderer.d.ts +3 -3
  104. package/dist/renderer/positioned-renderer.js +8 -23
  105. package/dist/renderer/rectangle-renderer.d.ts +3 -3
  106. package/dist/renderer/rectangle-renderer.js +45 -52
  107. package/dist/renderer/repeating-header-renderer.d.ts +3 -3
  108. package/dist/renderer/repeating-header-renderer.js +11 -26
  109. package/dist/renderer/row-renderer.d.ts +3 -3
  110. package/dist/renderer/row-renderer.js +12 -27
  111. package/dist/renderer/text-renderer.d.ts +6 -5
  112. package/dist/renderer/text-renderer.js +33 -42
  113. package/dist/text/line-breaker.d.ts +8 -5
  114. package/dist/text/line-breaker.js +67 -16
  115. package/dist/text/text-style.d.ts +25 -0
  116. package/dist/text/text-style.js +29 -0
  117. package/dist/utils/afm-parser.js +3 -13
  118. package/dist/utils/bytes.d.ts +24 -0
  119. package/dist/utils/bytes.js +76 -0
  120. package/dist/utils/flex-layout.d.ts +2 -2
  121. package/dist/utils/flex-layout.js +15 -20
  122. package/dist/utils/font-metrics.d.ts +1 -1
  123. package/dist/utils/font-metrics.js +1 -2
  124. package/dist/utils/font-path.js +3 -6
  125. package/dist/utils/image-helper.d.ts +6 -5
  126. package/dist/utils/image-helper.js +101 -111
  127. package/dist/utils/md5.d.ts +4 -0
  128. package/dist/utils/md5.js +80 -0
  129. package/dist/utils/pdf-object-manager.d.ts +10 -6
  130. package/dist/utils/pdf-object-manager.js +89 -94
  131. package/dist/utils/renderer-registry.js +1 -5
  132. package/dist/utils/ttf-parser.d.ts +2 -2
  133. package/dist/utils/ttf-parser.js +32 -36
  134. package/dist/utils/ttf-subsetter.d.ts +1 -1
  135. package/dist/utils/ttf-subsetter.js +40 -42
  136. package/dist/utils/utf8-to-windows1252-encoder.js +1 -4
  137. package/dist/validators/element-validator.d.ts +2 -2
  138. package/dist/validators/element-validator.js +9 -13
  139. package/package.json +14 -2
@@ -1,32 +1,30 @@
1
- "use strict";
2
1
  // Builds a subset TrueType font that KEEPS the original glyph ids: the PDF content stream emits
3
2
  // original gids and /W + CIDToGIDMap=Identity stay valid, so only the font program shrinks. We drop
4
3
  // the `glyf` outlines of unused glyphs (the bulk of the file) and rebuild `loca`; every other table
5
4
  // is copied verbatim. The used-glyph set is closed over composite-glyph components first, so a glyph
6
5
  // built from others (e.g. "ä") keeps its parts. Fonts without `glyf`/`loca` (CFF/OTF) pass through.
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.subsetTTF = subsetTTF;
9
- const u32 = (n) => n >>> 0;
6
+ import { concatBytes, i16, latin1FromBytes, u16, u32, wi16, wu16, wu32, writeLatin1 } from "./bytes.js";
7
+ const wrap32 = (n) => n >>> 0;
10
8
  /** TrueType table checksum: sum of big-endian uint32 over the 4-byte-padded table data. */
11
9
  function checksum(buf) {
12
10
  let sum = 0;
13
11
  for (let i = 0; i < buf.length; i += 4)
14
- sum = u32(sum + buf.readUInt32BE(i));
12
+ sum = wrap32(sum + u32(buf, i));
15
13
  return sum;
16
14
  }
17
15
  /** Right-pad to a 4-byte boundary (table data is aligned in the sfnt). */
18
16
  function pad4(buf) {
19
17
  const rem = buf.length % 4;
20
- return rem === 0 ? buf : Buffer.concat([buf, Buffer.alloc(4 - rem)]);
18
+ return rem === 0 ? buf : concatBytes([buf, new Uint8Array(4 - rem)]);
21
19
  }
22
- function subsetTTF(data, used) {
23
- const numTables = data.readUInt16BE(4);
20
+ export function subsetTTF(data, used) {
21
+ const numTables = u16(data, 4);
24
22
  const dir = new Map();
25
23
  let p = 12;
26
24
  for (let i = 0; i < numTables; i++) {
27
- dir.set(data.toString("latin1", p, p + 4), {
28
- offset: data.readUInt32BE(p + 8),
29
- length: data.readUInt32BE(p + 12),
25
+ dir.set(latin1FromBytes(data.subarray(p, p + 4)), {
26
+ offset: u32(data, p + 8),
27
+ length: u32(data, p + 12),
30
28
  });
31
29
  p += 16;
32
30
  }
@@ -34,14 +32,14 @@ function subsetTTF(data, used) {
34
32
  if (!dir.has("glyf") || !dir.has("loca") || !dir.has("head") || !dir.has("maxp"))
35
33
  return data;
36
34
  const headOff = dir.get("head").offset;
37
- const longLoca = data.readInt16BE(headOff + 50) === 1;
38
- const numGlyphs = data.readUInt16BE(dir.get("maxp").offset + 4);
35
+ const longLoca = i16(data, headOff + 50) === 1;
36
+ const numGlyphs = u16(data, dir.get("maxp").offset + 4);
39
37
  const locaOff = dir.get("loca").offset;
40
38
  const glyfOff = dir.get("glyf").offset;
41
39
  // Original glyph offsets (numGlyphs + 1 entries; short loca stores half-offsets).
42
40
  const loca = [];
43
41
  for (let g = 0; g <= numGlyphs; g++) {
44
- loca.push(longLoca ? data.readUInt32BE(locaOff + g * 4) : data.readUInt16BE(locaOff + g * 2) * 2);
42
+ loca.push(longLoca ? u32(data, locaOff + g * 4) : u16(data, locaOff + g * 2) * 2);
45
43
  }
46
44
  const glyphBytes = (g) => data.subarray(glyfOff + loca[g], glyfOff + loca[g + 1]);
47
45
  // Close the used set over composite components (and always keep .notdef = gid 0).
@@ -53,12 +51,12 @@ function subsetTTF(data, used) {
53
51
  continue;
54
52
  keep.add(g);
55
53
  const gd = glyphBytes(g);
56
- if (gd.length >= 10 && gd.readInt16BE(0) < 0) {
54
+ if (gd.length >= 10 && i16(gd, 0) < 0) {
57
55
  // Composite glyph: walk the component records to collect the referenced gids.
58
56
  let q = 10; // numberOfContours(2) + xMin/yMin/xMax/yMax(8)
59
57
  for (;;) {
60
- const flags = gd.readUInt16BE(q);
61
- stack.push(gd.readUInt16BE(q + 2));
58
+ const flags = u16(gd, q);
59
+ stack.push(u16(gd, q + 2));
62
60
  q += 4 + (flags & 0x0001 ? 4 : 2); // ARG_1_AND_2_ARE_WORDS
63
61
  if (flags & 0x0008)
64
62
  q += 2; // WE_HAVE_A_SCALE
@@ -73,24 +71,24 @@ function subsetTTF(data, used) {
73
71
  }
74
72
  // Rebuild glyf (kept glyphs only, original numbering) + a long-format loca.
75
73
  const parts = [];
76
- const newLoca = Buffer.alloc((numGlyphs + 1) * 4);
74
+ const newLoca = new Uint8Array((numGlyphs + 1) * 4);
77
75
  let off = 0;
78
76
  for (let g = 0; g < numGlyphs; g++) {
79
- newLoca.writeUInt32BE(off, g * 4);
77
+ wu32(newLoca, off, g * 4);
80
78
  if (keep.has(g)) {
81
- let gd = Buffer.from(glyphBytes(g));
79
+ let gd = glyphBytes(g).slice(); // copy: padded + concatenated, must not view `data`
82
80
  if (gd.length % 2 === 1)
83
- gd = Buffer.concat([gd, Buffer.alloc(1)]); // keep offsets even
81
+ gd = concatBytes([gd, new Uint8Array(1)]); // keep offsets even
84
82
  parts.push(gd);
85
83
  off += gd.length;
86
84
  }
87
85
  }
88
- newLoca.writeUInt32BE(off, numGlyphs * 4);
89
- const newGlyf = Buffer.concat(parts);
86
+ wu32(newLoca, off, numGlyphs * 4);
87
+ const newGlyf = concatBytes(parts);
90
88
  // head copy with indexToLocFormat = 1 (long); checkSumAdjustment zeroed, fixed up at the end.
91
- const newHead = Buffer.from(data.subarray(headOff, headOff + dir.get("head").length));
92
- newHead.writeInt16BE(1, 50);
93
- newHead.writeUInt32BE(0, 8);
89
+ const newHead = data.slice(headOff, headOff + dir.get("head").length);
90
+ wi16(newHead, 1, 50);
91
+ wu32(newHead, 0, 8);
94
92
  // Tables a PDF-embedded CIDFontType2 doesn't need - layout (GSUB/GPOS…), hinting hints and the
95
93
  // signature are dead weight; dropping them is most of the size win. `post` is reduced to format 3
96
94
  // (header only, no glyph names). cmap/name/OS-2 are kept for a still-valid standalone font.
@@ -119,8 +117,8 @@ function subsetTTF(data, used) {
119
117
  body = newHead;
120
118
  else if (tag === "post") {
121
119
  // Keep the 32-byte header, force version 3.0 (drops the per-glyph name list).
122
- body = Buffer.from(data.subarray(dir.get("post").offset, dir.get("post").offset + 32));
123
- body.writeUInt32BE(0x00030000, 0);
120
+ body = data.slice(dir.get("post").offset, dir.get("post").offset + 32);
121
+ wu32(body, 0x00030000, 0);
124
122
  }
125
123
  else {
126
124
  const d = dir.get(tag);
@@ -132,30 +130,30 @@ function subsetTTF(data, used) {
132
130
  const n = tables.length;
133
131
  const maxPow2 = 1 << Math.floor(Math.log2(n));
134
132
  const out = [];
135
- const offsetTable = Buffer.alloc(12);
136
- offsetTable.writeUInt32BE(data.readUInt32BE(0), 0); // sfntVersion
137
- offsetTable.writeUInt16BE(n, 4);
138
- offsetTable.writeUInt16BE(maxPow2 * 16, 6); // searchRange
139
- offsetTable.writeUInt16BE(Math.floor(Math.log2(n)), 8); // entrySelector
140
- offsetTable.writeUInt16BE(n * 16 - maxPow2 * 16, 10); // rangeShift
133
+ const offsetTable = new Uint8Array(12);
134
+ wu32(offsetTable, u32(data, 0), 0); // sfntVersion
135
+ wu16(offsetTable, n, 4);
136
+ wu16(offsetTable, maxPow2 * 16, 6); // searchRange
137
+ wu16(offsetTable, Math.floor(Math.log2(n)), 8); // entrySelector
138
+ wu16(offsetTable, n * 16 - maxPow2 * 16, 10); // rangeShift
141
139
  out.push(offsetTable);
142
- const dirBuf = Buffer.alloc(n * 16);
140
+ const dirBuf = new Uint8Array(n * 16);
143
141
  let tableOffset = 12 + n * 16;
144
142
  const dataBufs = [];
145
143
  tables.forEach((t, i) => {
146
144
  const padded = pad4(t.body);
147
- dirBuf.write(t.tag, i * 16, 4, "latin1");
148
- dirBuf.writeUInt32BE(checksum(padded), i * 16 + 4);
149
- dirBuf.writeUInt32BE(tableOffset, i * 16 + 8);
150
- dirBuf.writeUInt32BE(t.length, i * 16 + 12); // real (unpadded) length
145
+ writeLatin1(dirBuf, t.tag, i * 16);
146
+ wu32(dirBuf, checksum(padded), i * 16 + 4);
147
+ wu32(dirBuf, tableOffset, i * 16 + 8);
148
+ wu32(dirBuf, t.length, i * 16 + 12); // real (unpadded) length
151
149
  tableOffset += padded.length;
152
150
  dataBufs.push(padded);
153
151
  });
154
152
  out.push(dirBuf, ...dataBufs);
155
- const font = Buffer.concat(out);
153
+ const font = concatBytes(out);
156
154
  // head.checkSumAdjustment = 0xB1B0AFBA - checksum(whole font). Locate head in the assembled font.
157
155
  const headIdx = tables.findIndex((t) => t.tag === "head");
158
- const headPos = dirBuf.readUInt32BE(headIdx * 16 + 8);
159
- font.writeUInt32BE(u32(0xb1b0afba - checksum(font)), headPos + 8);
156
+ const headPos = u32(dirBuf, headIdx * 16 + 8);
157
+ wu32(font, wrap32(0xb1b0afba - checksum(font)), headPos + 8);
160
158
  return font;
161
159
  }
@@ -1,6 +1,3 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getArrayBuffer = getArrayBuffer;
4
1
  // Windows-1252 equals Latin-1 (codepoint == byte) EXCEPT in 0x80-0x9F, where it carries
5
2
  // printable punctuation - the Euro sign, smart quotes, dashes, ellipsis, ... - instead of
6
3
  // C1 controls. Those glyphs sit at Unicode codepoints far outside 0x00-0xFF, so a naive
@@ -37,7 +34,7 @@ const CP1252_FROM_UNICODE = {
37
34
  0x0178: 0x9f, // Ÿ Y diaeresis
38
35
  };
39
36
  /** Encodes a JavaScript string to a Windows-1252 byte buffer (the PDF text encoding). */
40
- function getArrayBuffer(data) {
37
+ export function getArrayBuffer(data) {
41
38
  const u8 = new Uint8Array(data.length);
42
39
  for (let i = 0; i < data.length; i++) {
43
40
  const code = data.charCodeAt(i);
@@ -1,5 +1,5 @@
1
- import { PDFDocumentElement } from "../elements/pdf-document-element";
2
- import { PDFElement, FlexiblePDFElement, SizedPDFElement } from "../elements/pdf-element";
1
+ import { PDFDocumentElement } from "../elements/pdf-document-element.js";
2
+ import { PDFElement, FlexiblePDFElement, SizedPDFElement } from "../elements/pdf-element.js";
3
3
  export declare class Validator {
4
4
  static validateDocument(document: PDFDocumentElement): void;
5
5
  static validateElement(element: PDFElement): void;
@@ -1,14 +1,11 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Validator = void 0;
4
- const pdf_document_element_1 = require("../elements/pdf-document-element");
5
- const pdf_element_1 = require("../elements/pdf-element");
6
- class Validator {
1
+ import { PDFDocumentElement } from "../elements/pdf-document-element.js";
2
+ import { FlexiblePDFElement, hasChildProp, SizedPDFElement, } from "../elements/pdf-element.js";
3
+ export class Validator {
7
4
  static validateDocument(document) {
8
5
  // More validation will be added later...
9
6
  document.getProps().children.forEach((page) => {
10
7
  page.getProps().children.forEach((element) => {
11
- if (element instanceof pdf_document_element_1.PDFDocumentElement) {
8
+ if (element instanceof PDFDocumentElement) {
12
9
  throw new Error("PDFDocument cannot be nested inside another element.");
13
10
  }
14
11
  });
@@ -16,11 +13,11 @@ class Validator {
16
13
  }
17
14
  static validateElement(element) {
18
15
  // Structural validation
19
- if (element instanceof pdf_document_element_1.PDFDocumentElement) {
16
+ if (element instanceof PDFDocumentElement) {
20
17
  throw new Error("PDFDocument cannot be nested inside another element.");
21
18
  }
22
19
  // Layout validation: geometry comes from the typed getSize(), not the props bag.
23
- if (element instanceof pdf_element_1.SizedPDFElement) {
20
+ if (element instanceof SizedPDFElement) {
24
21
  const { width, height } = element.getSize();
25
22
  // Negative coordinates are allowed: a `Positioned` child overflows its frame on purpose,
26
23
  // and the page clips anything past its edge. 0 size is legitimate (a hairline divider, an
@@ -30,7 +27,7 @@ class Validator {
30
27
  }
31
28
  }
32
29
  // Logical validation: Flexible and fixed elements
33
- if (element instanceof pdf_element_1.FlexiblePDFElement) {
30
+ if (element instanceof FlexiblePDFElement) {
34
31
  this.validateFlexElement(element);
35
32
  }
36
33
  }
@@ -49,11 +46,10 @@ class Validator {
49
46
  throw new Error(`Flexible element ${element.constructor.name} has invalid flex value`);
50
47
  }
51
48
  // Ensure a flexible element does not contain another flexible element
52
- if ((0, pdf_element_1.hasChildProp)(element)) {
53
- if (element.child instanceof pdf_element_1.FlexiblePDFElement) {
49
+ if (hasChildProp(element)) {
50
+ if (element.child instanceof FlexiblePDFElement) {
54
51
  throw new Error(`Flexible element ${element.constructor.name} cannot hold another flexible element`);
55
52
  }
56
53
  }
57
54
  }
58
55
  }
59
- exports.Validator = Validator;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jasy/pdf",
3
- "version": "1.0.0-alpha.2",
3
+ "version": "1.0.0-alpha.3",
4
4
  "description": "Declarative, component-based PDF generation in pure TypeScript - Flutter-style components, real AFM font metrics, a hand-rolled PDF writer. No headless browser, no Java.",
5
5
  "keywords": [
6
6
  "declarative",
@@ -19,9 +19,21 @@
19
19
  "files": [
20
20
  "dist"
21
21
  ],
22
+ "type": "module",
22
23
  "main": "dist/index.js",
24
+ "browser": {
25
+ "./dist/platform/node-fs.js": "./dist/platform/browser-fs.js",
26
+ "./dist/platform/node-image.js": "./dist/platform/browser-image.js"
27
+ },
23
28
  "types": "dist/index.d.ts",
29
+ "exports": {
30
+ ".": {
31
+ "types": "./dist/index.d.ts",
32
+ "default": "./dist/index.js"
33
+ }
34
+ },
24
35
  "dependencies": {
36
+ "fflate": "^0.8.3",
25
37
  "jimp": "^1.6.0"
26
38
  },
27
39
  "devDependencies": {
@@ -41,7 +53,7 @@
41
53
  "play": "pnpm --filter @jasy/playground play",
42
54
  "test": "vitest",
43
55
  "test:coverage": "vitest --coverage",
44
- "build": "tsc && pnpm run copy-assets",
56
+ "build": "tsc && node scripts/fix-dts-ext.mjs && pnpm run copy-assets",
45
57
  "lint": "oxlint",
46
58
  "lint:fix": "oxlint --fix",
47
59
  "fmt": "oxfmt",