@pdfme/manipulator 0.0.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 (98) hide show
  1. package/README.md +5 -0
  2. package/dist/cjs/__tests__/e2e/insert.e2e.test.js +32 -0
  3. package/dist/cjs/__tests__/e2e/insert.e2e.test.js.map +1 -0
  4. package/dist/cjs/__tests__/e2e/merge.e2e.test.js +20 -0
  5. package/dist/cjs/__tests__/e2e/merge.e2e.test.js.map +1 -0
  6. package/dist/cjs/__tests__/e2e/move.e2e.test.js +18 -0
  7. package/dist/cjs/__tests__/e2e/move.e2e.test.js.map +1 -0
  8. package/dist/cjs/__tests__/e2e/organize-complex.e2e.test.js +96 -0
  9. package/dist/cjs/__tests__/e2e/organize-complex.e2e.test.js.map +1 -0
  10. package/dist/cjs/__tests__/e2e/organize-single.e2e.test.js +68 -0
  11. package/dist/cjs/__tests__/e2e/organize-single.e2e.test.js.map +1 -0
  12. package/dist/cjs/__tests__/e2e/remove.e2e.test.js +28 -0
  13. package/dist/cjs/__tests__/e2e/remove.e2e.test.js.map +1 -0
  14. package/dist/cjs/__tests__/e2e/rotate.e2e.test.js +38 -0
  15. package/dist/cjs/__tests__/e2e/rotate.e2e.test.js.map +1 -0
  16. package/dist/cjs/__tests__/e2e/split.e2e.test.js +27 -0
  17. package/dist/cjs/__tests__/e2e/split.e2e.test.js.map +1 -0
  18. package/dist/cjs/__tests__/insert.test.js +18 -0
  19. package/dist/cjs/__tests__/insert.test.js.map +1 -0
  20. package/dist/cjs/__tests__/merge.test.js +16 -0
  21. package/dist/cjs/__tests__/merge.test.js.map +1 -0
  22. package/dist/cjs/__tests__/move.test.js +16 -0
  23. package/dist/cjs/__tests__/move.test.js.map +1 -0
  24. package/dist/cjs/__tests__/organize.test.js +75 -0
  25. package/dist/cjs/__tests__/organize.test.js.map +1 -0
  26. package/dist/cjs/__tests__/remove.test.js +20 -0
  27. package/dist/cjs/__tests__/remove.test.js.map +1 -0
  28. package/dist/cjs/__tests__/rotate.test.js +17 -0
  29. package/dist/cjs/__tests__/rotate.test.js.map +1 -0
  30. package/dist/cjs/__tests__/split.test.js +21 -0
  31. package/dist/cjs/__tests__/split.test.js.map +1 -0
  32. package/dist/cjs/__tests__/test-helpers.js +44 -0
  33. package/dist/cjs/__tests__/test-helpers.js.map +1 -0
  34. package/dist/cjs/__tests__/utils.js +29 -0
  35. package/dist/cjs/__tests__/utils.js.map +1 -0
  36. package/dist/cjs/src/index.js +161 -0
  37. package/dist/cjs/src/index.js.map +1 -0
  38. package/dist/esm/__tests__/e2e/insert.e2e.test.js +30 -0
  39. package/dist/esm/__tests__/e2e/insert.e2e.test.js.map +1 -0
  40. package/dist/esm/__tests__/e2e/merge.e2e.test.js +18 -0
  41. package/dist/esm/__tests__/e2e/merge.e2e.test.js.map +1 -0
  42. package/dist/esm/__tests__/e2e/move.e2e.test.js +16 -0
  43. package/dist/esm/__tests__/e2e/move.e2e.test.js.map +1 -0
  44. package/dist/esm/__tests__/e2e/organize-complex.e2e.test.js +94 -0
  45. package/dist/esm/__tests__/e2e/organize-complex.e2e.test.js.map +1 -0
  46. package/dist/esm/__tests__/e2e/organize-single.e2e.test.js +66 -0
  47. package/dist/esm/__tests__/e2e/organize-single.e2e.test.js.map +1 -0
  48. package/dist/esm/__tests__/e2e/remove.e2e.test.js +26 -0
  49. package/dist/esm/__tests__/e2e/remove.e2e.test.js.map +1 -0
  50. package/dist/esm/__tests__/e2e/rotate.e2e.test.js +36 -0
  51. package/dist/esm/__tests__/e2e/rotate.e2e.test.js.map +1 -0
  52. package/dist/esm/__tests__/e2e/split.e2e.test.js +25 -0
  53. package/dist/esm/__tests__/e2e/split.e2e.test.js.map +1 -0
  54. package/dist/esm/__tests__/insert.test.js +16 -0
  55. package/dist/esm/__tests__/insert.test.js.map +1 -0
  56. package/dist/esm/__tests__/merge.test.js +14 -0
  57. package/dist/esm/__tests__/merge.test.js.map +1 -0
  58. package/dist/esm/__tests__/move.test.js +14 -0
  59. package/dist/esm/__tests__/move.test.js.map +1 -0
  60. package/dist/esm/__tests__/organize.test.js +73 -0
  61. package/dist/esm/__tests__/organize.test.js.map +1 -0
  62. package/dist/esm/__tests__/remove.test.js +18 -0
  63. package/dist/esm/__tests__/remove.test.js.map +1 -0
  64. package/dist/esm/__tests__/rotate.test.js +15 -0
  65. package/dist/esm/__tests__/rotate.test.js.map +1 -0
  66. package/dist/esm/__tests__/split.test.js +19 -0
  67. package/dist/esm/__tests__/split.test.js.map +1 -0
  68. package/dist/esm/__tests__/test-helpers.js +32 -0
  69. package/dist/esm/__tests__/test-helpers.js.map +1 -0
  70. package/dist/esm/__tests__/utils.js +23 -0
  71. package/dist/esm/__tests__/utils.js.map +1 -0
  72. package/dist/esm/src/index.js +152 -0
  73. package/dist/esm/src/index.js.map +1 -0
  74. package/dist/types/__tests__/e2e/insert.e2e.test.d.ts +1 -0
  75. package/dist/types/__tests__/e2e/merge.e2e.test.d.ts +1 -0
  76. package/dist/types/__tests__/e2e/move.e2e.test.d.ts +1 -0
  77. package/dist/types/__tests__/e2e/organize-complex.e2e.test.d.ts +1 -0
  78. package/dist/types/__tests__/e2e/organize-single.e2e.test.d.ts +1 -0
  79. package/dist/types/__tests__/e2e/remove.e2e.test.d.ts +1 -0
  80. package/dist/types/__tests__/e2e/rotate.e2e.test.d.ts +1 -0
  81. package/dist/types/__tests__/e2e/split.e2e.test.d.ts +1 -0
  82. package/dist/types/__tests__/insert.test.d.ts +1 -0
  83. package/dist/types/__tests__/merge.test.d.ts +1 -0
  84. package/dist/types/__tests__/move.test.d.ts +1 -0
  85. package/dist/types/__tests__/organize.test.d.ts +1 -0
  86. package/dist/types/__tests__/remove.test.d.ts +1 -0
  87. package/dist/types/__tests__/rotate.test.d.ts +1 -0
  88. package/dist/types/__tests__/split.test.d.ts +1 -0
  89. package/dist/types/__tests__/test-helpers.d.ts +6 -0
  90. package/dist/types/__tests__/utils.d.ts +3 -0
  91. package/dist/types/src/index.d.ts +46 -0
  92. package/eslint.config.mjs +22 -0
  93. package/jest.setup.js +2 -0
  94. package/package.json +81 -0
  95. package/src/index.ts +240 -0
  96. package/tsconfig.cjs.json +10 -0
  97. package/tsconfig.esm.json +11 -0
  98. package/tsconfig.json +6 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split.e2e.test.js","sourceRoot":"","sources":["../../../../__tests__/e2e/split.e2e.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,qBAAqB,CAAC;AAE7B,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAEpC,IAAI,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE;YAC5C,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,YAAY;YAClC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,YAAY;SACnC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;QAE5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC;gBACvC,wBAAwB,EAAE,oBAAoB,CAAC,GAAG,CAAC,EAAE;aACtD,CAAC,CAAC;QACL,CAAC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC;gBACvC,wBAAwB,EAAE,oBAAoB,CAAC,GAAG,CAAC,EAAE;aACtD,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { insert } from '../src/index';
2
+ import { createTestPDF, getPDFPageCount } from './test-helpers';
3
+ describe('insert', () => {
4
+ test('inserts PDF at specified position', async () => {
5
+ const basePdf = await createTestPDF(3);
6
+ const insertPdf = await createTestPDF(2);
7
+ const result = await insert(basePdf, [{ pdf: insertPdf, position: 1 }]);
8
+ expect(await getPDFPageCount(result)).toBe(5);
9
+ });
10
+ test('throws error for invalid position', async () => {
11
+ const basePdf = await createTestPDF(3);
12
+ const insertPdf = await createTestPDF(2);
13
+ await expect(insert(basePdf, [{ pdf: insertPdf, position: 4 }])).rejects.toThrow('[@pdfme/manipulator] Invalid position');
14
+ });
15
+ });
16
+ //# sourceMappingURL=insert.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insert.test.js","sourceRoot":"","sources":["../../../__tests__/insert.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEhE,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,IAAI,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACxE,MAAM,CAAC,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC9E,uCAAuC,CACxC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { merge } from '../src/index';
2
+ import { createTestPDF, getPDFPageCount } from './test-helpers';
3
+ describe('merge', () => {
4
+ test('merges multiple PDFs', async () => {
5
+ const pdf1 = await createTestPDF(2);
6
+ const pdf2 = await createTestPDF(3);
7
+ const merged = await merge([pdf1, pdf2]);
8
+ expect(await getPDFPageCount(merged)).toBe(5);
9
+ });
10
+ test('throws error when no PDFs provided', async () => {
11
+ await expect(merge([])).rejects.toThrow('[@pdfme/manipulator] At least one PDF is required');
12
+ });
13
+ });
14
+ //# sourceMappingURL=merge.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.test.js","sourceRoot":"","sources":["../../../__tests__/merge.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEhE,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,IAAI,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,mDAAmD,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { move } from '../src/index';
2
+ import { createTestPDF, getPDFPageCount } from './test-helpers';
3
+ describe('move', () => {
4
+ test('moves page from one position to another', async () => {
5
+ const pdf = await createTestPDF(3);
6
+ const result = await move(pdf, { from: 0, to: 2 });
7
+ expect(await getPDFPageCount(result)).toBe(3);
8
+ });
9
+ test('throws error for invalid page numbers', async () => {
10
+ const pdf = await createTestPDF(3);
11
+ await expect(move(pdf, { from: 3, to: 0 })).rejects.toThrow('[@pdfme/manipulator] Invalid page number: from=3, to=0, total pages=3');
12
+ });
13
+ });
14
+ //# sourceMappingURL=move.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"move.test.js","sourceRoot":"","sources":["../../../__tests__/move.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEhE,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;IACpB,IAAI,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACzD,uEAAuE,CACxE,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,73 @@
1
+ import { organize } from '../src/index';
2
+ import { createTestPDF, getPDFPageCount } from './test-helpers';
3
+ describe('organize', () => {
4
+ test('performs single remove operation', async () => {
5
+ const pdf = await createTestPDF(5);
6
+ const result = await organize(pdf, [
7
+ { type: 'remove', data: { position: 1 } },
8
+ { type: 'remove', data: { position: 3 } },
9
+ ]);
10
+ expect(await getPDFPageCount(result)).toBe(3);
11
+ });
12
+ test('performs single insert operation', async () => {
13
+ const pdf = await createTestPDF(3);
14
+ const insertPdf = await createTestPDF(2);
15
+ const result = await organize(pdf, [{ type: 'insert', data: { pdf: insertPdf, position: 1 } }]);
16
+ expect(await getPDFPageCount(result)).toBe(5);
17
+ });
18
+ test('performs single replace operation', async () => {
19
+ const pdf = await createTestPDF(3);
20
+ const replacePdf = await createTestPDF(1);
21
+ const result = await organize(pdf, [
22
+ { type: 'replace', data: { position: 1, pdf: replacePdf } },
23
+ ]);
24
+ expect(await getPDFPageCount(result)).toBe(3);
25
+ });
26
+ test('performs single rotate operation', async () => {
27
+ const pdf = await createTestPDF(3);
28
+ const result = await organize(pdf, [
29
+ { type: 'rotate', data: { position: 0, degrees: 90 } },
30
+ { type: 'rotate', data: { position: 2, degrees: 90 } },
31
+ ]);
32
+ expect(await getPDFPageCount(result)).toBe(3);
33
+ });
34
+ test('performs multiple operations in sequence', async () => {
35
+ const pdf = await createTestPDF(5);
36
+ const insertPdf = await createTestPDF(2);
37
+ const replacePdf = await createTestPDF(1);
38
+ const result = await organize(pdf, [
39
+ { type: 'remove', data: { position: 1 } },
40
+ { type: 'remove', data: { position: 3 } }, // 5 -> 3 pages
41
+ { type: 'insert', data: { pdf: insertPdf, position: 1 } }, // 3 -> 5 pages
42
+ { type: 'replace', data: { position: 2, pdf: replacePdf } }, // Still 5 pages
43
+ { type: 'rotate', data: { position: 0, degrees: 90 } },
44
+ { type: 'rotate', data: { position: 3, degrees: 90 } }, // Still 5 pages
45
+ ]);
46
+ expect(await getPDFPageCount(result)).toBe(5);
47
+ });
48
+ test('throws error for invalid page numbers', async () => {
49
+ const pdf = await createTestPDF(3);
50
+ await expect(organize(pdf, [{ type: 'remove', data: { position: 3 } }])).rejects.toThrow('[@pdfme/manipulator] Invalid page number');
51
+ });
52
+ test('throws error for invalid position', async () => {
53
+ const pdf = await createTestPDF(3);
54
+ const insertPdf = await createTestPDF(1);
55
+ await expect(organize(pdf, [{ type: 'insert', data: { pdf: insertPdf, position: 4 } }])).rejects.toThrow('[@pdfme/manipulator] Invalid position');
56
+ });
57
+ test('throws error for invalid rotation degrees', async () => {
58
+ const pdf = await createTestPDF(3);
59
+ await expect(
60
+ // @ts-expect-error
61
+ organize(pdf, [{ type: 'rotate', data: { pages: [0], degrees: 45 } }])).rejects.toThrow('[@pdfme/manipulator] Rotation degrees must be a multiple of 90');
62
+ });
63
+ test('throws error for empty actions array', async () => {
64
+ const pdf = await createTestPDF(3);
65
+ await expect(organize(pdf, [])).rejects.toThrow('[@pdfme/manipulator] At least one action is required');
66
+ });
67
+ test('throws error for unknown action type', async () => {
68
+ const pdf = await createTestPDF(3);
69
+ // @ts-expect-error
70
+ await expect(organize(pdf, [{ type: 'invalid', data: { pages: [] } }])).rejects.toThrow('[@pdfme/manipulator] Unknown action type: invalid');
71
+ });
72
+ });
73
+ //# sourceMappingURL=organize.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organize.test.js","sourceRoot":"","sources":["../../../__tests__/organize.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { remove } from '../src/index';
2
+ import { createTestPDF, getPDFPageCount } from './test-helpers';
3
+ describe('remove', () => {
4
+ test('removes specified pages from PDF', async () => {
5
+ const pdf = await createTestPDF(5);
6
+ const result = await remove(pdf, [1, 3]);
7
+ expect(await getPDFPageCount(result)).toBe(3);
8
+ });
9
+ test('throws error when no pages provided', async () => {
10
+ const pdf = await createTestPDF(3);
11
+ await expect(remove(pdf, [])).rejects.toThrow('[@pdfme/manipulator] At least one page number is required');
12
+ });
13
+ test('throws error for invalid page numbers', async () => {
14
+ const pdf = await createTestPDF(3);
15
+ await expect(remove(pdf, [3])).rejects.toThrow('[@pdfme/manipulator] Invalid page number');
16
+ });
17
+ });
18
+ //# sourceMappingURL=remove.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.test.js","sourceRoot":"","sources":["../../../__tests__/remove.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEhE,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,IAAI,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC3C,2DAA2D,CAC5D,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { rotate } from '../src/index';
2
+ import { createTestPDF, getPDFPageCount } from './test-helpers';
3
+ describe('rotate', () => {
4
+ test('rotates PDF pages by specified degrees', async () => {
5
+ const pdf = await createTestPDF(2);
6
+ const result = await rotate(pdf, 90);
7
+ expect(await getPDFPageCount(result)).toBe(2);
8
+ });
9
+ test('throws error for non-90-degree rotation', async () => {
10
+ const pdf = await createTestPDF(2);
11
+ // @ts-expect-error
12
+ await expect(rotate(pdf, 45)).rejects.toThrow('[@pdfme/manipulator] Rotation degrees must be a multiple of 90');
13
+ });
14
+ });
15
+ //# sourceMappingURL=rotate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rotate.test.js","sourceRoot":"","sources":["../../../__tests__/rotate.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEhE,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,IAAI,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,CAAC,CAAC,CAAC;QACnC,mBAAmB;QACnB,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC3C,gEAAgE,CACjE,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { split } from '../src/index';
2
+ import { createTestPDF, getPDFPageCount } from './test-helpers';
3
+ describe('split', () => {
4
+ test('splits PDF into ranges', async () => {
5
+ const pdf = await createTestPDF(5);
6
+ const splits = await split(pdf, [
7
+ { start: 0, end: 1 },
8
+ { start: 2, end: 4 },
9
+ ]);
10
+ expect(splits.length).toBe(2);
11
+ expect(await getPDFPageCount(splits[0])).toBe(2);
12
+ expect(await getPDFPageCount(splits[1])).toBe(3);
13
+ });
14
+ test('throws error for invalid ranges', async () => {
15
+ const pdf = await createTestPDF(3);
16
+ await expect(split(pdf, [{ start: 1, end: 0 }])).rejects.toThrow('[@pdfme/manipulator] Invalid range');
17
+ });
18
+ });
19
+ //# sourceMappingURL=split.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split.test.js","sourceRoot":"","sources":["../../../__tests__/split.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEhE,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,IAAI,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC9B,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;YACpB,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;SACrB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC9D,oCAAoC,CACrC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,32 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { PDFDocument } from '@pdfme/pdf-lib';
4
+ import { pdf2img } from '@pdfme/converter';
5
+ export const createTestPDF = async (pageCount) => {
6
+ const pdfDoc = await PDFDocument.create();
7
+ for (let i = 0; i < pageCount; i++) {
8
+ const page = pdfDoc.addPage([500, 500]);
9
+ page.drawText(`Page ${i + 1}`, {
10
+ x: 50,
11
+ y: 450,
12
+ size: 20,
13
+ });
14
+ }
15
+ return pdfDoc.save();
16
+ };
17
+ export const pdfToImages = async (pdf) => {
18
+ const arrayBuffers = await pdf2img(pdf, { imageType: 'png' });
19
+ return arrayBuffers.map((buf) => Buffer.from(new Uint8Array(buf)));
20
+ };
21
+ export const getPDFPageCount = async (pdf) => {
22
+ const pdfDoc = await PDFDocument.load(pdf);
23
+ return pdfDoc.getPageCount();
24
+ };
25
+ export const assetPath = (fileName) => path.join(__dirname, 'assets/pdfs', fileName);
26
+ export function toArrayBuffer(buf) {
27
+ return new Uint8Array(buf);
28
+ }
29
+ export const loadTestPDF = (fileName) => {
30
+ return toArrayBuffer(fs.readFileSync(assetPath(fileName)));
31
+ };
32
+ //# sourceMappingURL=test-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../../../__tests__/test-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,SAAiB,EAAuB,EAAE;IAC5E,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE;YAC7B,CAAC,EAAE,EAAE;YACL,CAAC,EAAE,GAAG;YACN,IAAI,EAAE,EAAE;SACT,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,GAA6B,EAAqB,EAAE;IACpF,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9D,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACrE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,GAA6B,EAAmB,EAAE;IACtF,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3C,OAAO,MAAM,CAAC,YAAY,EAAE,CAAC;AAC/B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;AAE7F,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,QAAgB,EAAc,EAAE;IAC1D,OAAO,aAAa,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { PDFDocument } from '@pdfme/pdf-lib';
2
+ import { pdf2img } from '@pdfme/converter';
3
+ export const createTestPDF = async (pageCount) => {
4
+ const pdfDoc = await PDFDocument.create();
5
+ for (let i = 0; i < pageCount; i++) {
6
+ const page = pdfDoc.addPage([500, 500]);
7
+ page.drawText(`Page ${i + 1}`, {
8
+ x: 50,
9
+ y: 450,
10
+ size: 20,
11
+ });
12
+ }
13
+ return pdfDoc.save();
14
+ };
15
+ export const pdfToImages = async (pdf) => {
16
+ const arrayBuffers = await pdf2img(pdf, { imageType: 'png' });
17
+ return arrayBuffers.map((buf) => Buffer.from(new Uint8Array(buf)));
18
+ };
19
+ export const getPDFPageCount = async (pdf) => {
20
+ const pdfDoc = await PDFDocument.load(pdf);
21
+ return pdfDoc.getPageCount();
22
+ };
23
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../__tests__/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,SAAiB,EAAuB,EAAE;IAC5E,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE;YAC7B,CAAC,EAAE,EAAE;YACL,CAAC,EAAE,GAAG;YACN,IAAI,EAAE,EAAE;SACT,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,GAA6B,EAAqB,EAAE;IACpF,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9D,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACrE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,GAA6B,EAAmB,EAAE;IACtF,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3C,OAAO,MAAM,CAAC,YAAY,EAAE,CAAC;AAC/B,CAAC,CAAC"}
@@ -0,0 +1,152 @@
1
+ import { PDFDocument, RotationTypes } from '@pdfme/pdf-lib';
2
+ const merge = async (pdfs) => {
3
+ if (!pdfs.length) {
4
+ throw new Error('[@pdfme/manipulator] At least one PDF is required for merging');
5
+ }
6
+ const mergedPdf = await PDFDocument.create();
7
+ for (const buffer of pdfs) {
8
+ const srcDoc = await PDFDocument.load(buffer);
9
+ const copiedPages = await mergedPdf.copyPages(srcDoc, srcDoc.getPageIndices());
10
+ copiedPages.forEach((page) => mergedPdf.addPage(page));
11
+ }
12
+ return mergedPdf.save();
13
+ };
14
+ const split = async (pdf, ranges) => {
15
+ if (!ranges.length) {
16
+ throw new Error('[@pdfme/manipulator] At least one range is required for splitting');
17
+ }
18
+ const originalPdf = await PDFDocument.load(pdf);
19
+ const numPages = originalPdf.getPages().length;
20
+ const result = [];
21
+ for (const { start = 0, end = numPages - 1 } of ranges) {
22
+ if (start < 0 || end >= numPages || start > end) {
23
+ throw new Error(`[@pdfme/manipulator] Invalid range: start=${start}, end=${end}, total pages=${numPages}`);
24
+ }
25
+ const newPdf = await PDFDocument.create();
26
+ const pages = await newPdf.copyPages(originalPdf, Array.from({ length: end - start + 1 }, (_, i) => i + start));
27
+ pages.forEach((page) => newPdf.addPage(page));
28
+ result.push(await newPdf.save());
29
+ }
30
+ return result;
31
+ };
32
+ const remove = async (pdf, pages) => {
33
+ if (!pages.length) {
34
+ throw new Error('[@pdfme/manipulator] At least one page number is required for removal');
35
+ }
36
+ const pdfDoc = await PDFDocument.load(pdf);
37
+ const numPages = pdfDoc.getPageCount();
38
+ if (pages.some((page) => page < 0 || page >= numPages)) {
39
+ throw new Error(`[@pdfme/manipulator] Invalid page number: pages must be between 0 and ${numPages - 1}`);
40
+ }
41
+ pages.sort((a, b) => b - a).forEach((pageIndex) => pdfDoc.removePage(pageIndex));
42
+ return pdfDoc.save();
43
+ };
44
+ const insert = async (basePdf, inserts) => {
45
+ inserts.sort((a, b) => a.position - b.position);
46
+ let currentPdf = basePdf;
47
+ let offset = 0;
48
+ for (let i = 0; i < inserts.length; i++) {
49
+ const { pdf, position } = inserts[i];
50
+ const actualPos = position + offset;
51
+ const basePdfDoc = await PDFDocument.load(currentPdf);
52
+ const insertDoc = await PDFDocument.load(pdf);
53
+ const numPages = basePdfDoc.getPageCount();
54
+ if (actualPos < 0 || actualPos > numPages) {
55
+ throw new Error(`[@pdfme/manipulator] Invalid position: must be between 0 and ${numPages}`);
56
+ }
57
+ const newPdfDoc = await PDFDocument.create();
58
+ if (actualPos > 0) {
59
+ const beforePages = await newPdfDoc.copyPages(basePdfDoc, Array.from({ length: actualPos }, (_, idx) => idx));
60
+ beforePages.forEach((page) => newPdfDoc.addPage(page));
61
+ }
62
+ const insertPages = await newPdfDoc.copyPages(insertDoc, insertDoc.getPageIndices());
63
+ insertPages.forEach((page) => newPdfDoc.addPage(page));
64
+ if (actualPos < numPages) {
65
+ const afterPages = await newPdfDoc.copyPages(basePdfDoc, Array.from({ length: numPages - actualPos }, (_, idx) => idx + actualPos));
66
+ afterPages.forEach((page) => newPdfDoc.addPage(page));
67
+ }
68
+ currentPdf = await newPdfDoc.save();
69
+ offset += insertDoc.getPageCount();
70
+ }
71
+ const pdfDoc = await PDFDocument.load(currentPdf);
72
+ return pdfDoc.save();
73
+ };
74
+ const rotate = async (pdf, degrees, pageNumbers) => {
75
+ if (!Number.isInteger(degrees) || degrees % 90 !== 0) {
76
+ throw new Error('[@pdfme/manipulator] Rotation degrees must be a multiple of 90');
77
+ }
78
+ const pdfDoc = await PDFDocument.load(pdf);
79
+ const pages = pdfDoc.getPages();
80
+ if (!pages.length) {
81
+ throw new Error('[@pdfme/manipulator] PDF has no pages to rotate');
82
+ }
83
+ const normalizedDegrees = ((degrees % 360) + 360) % 360;
84
+ if (normalizedDegrees % 90 !== 0) {
85
+ throw new Error('[@pdfme/manipulator] Rotation degrees must be a multiple of 90');
86
+ }
87
+ if (pageNumbers) {
88
+ if (pageNumbers.some((page) => page < 0 || page >= pages.length)) {
89
+ throw new Error(`[@pdfme/manipulator] Invalid page number: pages must be between 0 and ${pages.length - 1}`);
90
+ }
91
+ }
92
+ const pagesToRotate = pageNumbers || pages.map((_, i) => i);
93
+ pagesToRotate.forEach((pageNum) => {
94
+ const page = pages[pageNum];
95
+ if (page) {
96
+ page.setRotation({
97
+ type: RotationTypes.Degrees,
98
+ angle: normalizedDegrees % 360,
99
+ });
100
+ }
101
+ });
102
+ return pdfDoc.save();
103
+ };
104
+ const move = async (pdf, operation) => {
105
+ const { from, to } = operation;
106
+ const pdfDoc = await PDFDocument.load(pdf);
107
+ const currentPageCount = pdfDoc.getPageCount();
108
+ if (from < 0 || from >= currentPageCount || to < 0 || to >= currentPageCount) {
109
+ throw new Error(`[@pdfme/manipulator] Invalid page number: from=${from}, to=${to}, total pages=${currentPageCount}`);
110
+ }
111
+ if (from === to) {
112
+ return pdfDoc.save();
113
+ }
114
+ const page = pdfDoc.getPage(from);
115
+ pdfDoc.removePage(from);
116
+ const adjustedTo = from < to ? to - 1 : to;
117
+ pdfDoc.insertPage(adjustedTo, page);
118
+ return pdfDoc.save();
119
+ };
120
+ const organize = async (pdf, actions) => {
121
+ if (!actions.length) {
122
+ throw new Error('[@pdfme/manipulator] At least one action is required');
123
+ }
124
+ let currentPdf = await PDFDocument.load(pdf);
125
+ for (const action of actions) {
126
+ const currentBuffer = await currentPdf.save();
127
+ switch (action.type) {
128
+ case 'remove':
129
+ currentPdf = await PDFDocument.load(await remove(currentBuffer, [action.data.position]));
130
+ break;
131
+ case 'insert':
132
+ currentPdf = await PDFDocument.load(await insert(currentBuffer, [action.data]));
133
+ break;
134
+ case 'replace': {
135
+ const withoutTarget = await remove(currentBuffer, [action.data.position]);
136
+ currentPdf = await PDFDocument.load(await insert(withoutTarget, [action.data]));
137
+ break;
138
+ }
139
+ case 'rotate':
140
+ currentPdf = await PDFDocument.load(await rotate(currentBuffer, action.data.degrees, [action.data.position]));
141
+ break;
142
+ case 'move':
143
+ currentPdf = await PDFDocument.load(await move(currentBuffer, action.data));
144
+ break;
145
+ default:
146
+ throw new Error(`[@pdfme/manipulator] Unknown action type: ${action.type}`);
147
+ }
148
+ }
149
+ return currentPdf.save();
150
+ };
151
+ export { merge, split, remove, insert, rotate, move, organize };
152
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import 'jest-image-snapshot';
@@ -0,0 +1 @@
1
+ import 'jest-image-snapshot';
@@ -0,0 +1 @@
1
+ import 'jest-image-snapshot';
@@ -0,0 +1 @@
1
+ import 'jest-image-snapshot';
@@ -0,0 +1 @@
1
+ import 'jest-image-snapshot';
@@ -0,0 +1 @@
1
+ import 'jest-image-snapshot';
@@ -0,0 +1 @@
1
+ import 'jest-image-snapshot';
@@ -0,0 +1 @@
1
+ import 'jest-image-snapshot';
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ export declare const createTestPDF: (pageCount: number) => Promise<Uint8Array>;
2
+ export declare const pdfToImages: (pdf: ArrayBuffer | Uint8Array) => Promise<Buffer[]>;
3
+ export declare const getPDFPageCount: (pdf: ArrayBuffer | Uint8Array) => Promise<number>;
4
+ export declare const assetPath: (fileName: string) => string;
5
+ export declare function toArrayBuffer(buf: Buffer): Uint8Array;
6
+ export declare const loadTestPDF: (fileName: string) => Uint8Array;
@@ -0,0 +1,3 @@
1
+ export declare const createTestPDF: (pageCount: number) => Promise<Uint8Array>;
2
+ export declare const pdfToImages: (pdf: ArrayBuffer | Uint8Array) => Promise<Buffer[]>;
3
+ export declare const getPDFPageCount: (pdf: ArrayBuffer | Uint8Array) => Promise<number>;
@@ -0,0 +1,46 @@
1
+ declare const merge: (pdfs: (ArrayBuffer | Uint8Array)[]) => Promise<Uint8Array>;
2
+ declare const split: (pdf: ArrayBuffer | Uint8Array, ranges: {
3
+ start?: number;
4
+ end?: number;
5
+ }[]) => Promise<Uint8Array[]>;
6
+ declare const remove: (pdf: ArrayBuffer | Uint8Array, pages: number[]) => Promise<Uint8Array>;
7
+ declare const insert: (basePdf: ArrayBuffer | Uint8Array, inserts: {
8
+ pdf: ArrayBuffer | Uint8Array;
9
+ position: number;
10
+ }[]) => Promise<Uint8Array>;
11
+ declare const rotate: (pdf: ArrayBuffer | Uint8Array, degrees: 0 | 90 | 180 | 270 | 360, pageNumbers?: number[]) => Promise<Uint8Array>;
12
+ declare const move: (pdf: ArrayBuffer | Uint8Array, operation: {
13
+ from: number;
14
+ to: number;
15
+ }) => Promise<Uint8Array>;
16
+ declare const organize: (pdf: ArrayBuffer | Uint8Array, actions: Array<{
17
+ type: "remove";
18
+ data: {
19
+ position: number;
20
+ };
21
+ } | {
22
+ type: "insert";
23
+ data: {
24
+ pdf: ArrayBuffer | Uint8Array;
25
+ position: number;
26
+ };
27
+ } | {
28
+ type: "replace";
29
+ data: {
30
+ pdf: ArrayBuffer | Uint8Array;
31
+ position: number;
32
+ };
33
+ } | {
34
+ type: "rotate";
35
+ data: {
36
+ position: number;
37
+ degrees: 0 | 90 | 180 | 270 | 360;
38
+ };
39
+ } | {
40
+ type: "move";
41
+ data: {
42
+ from: number;
43
+ to: number;
44
+ };
45
+ }>) => Promise<Uint8Array>;
46
+ export { merge, split, remove, insert, rotate, move, organize };
@@ -0,0 +1,22 @@
1
+ import { fileURLToPath } from 'url';
2
+ import { dirname, resolve } from 'path';
3
+
4
+ const __filename = fileURLToPath(import.meta.url);
5
+ const __dirname = dirname(__filename);
6
+
7
+ // Import the root config
8
+ const rootConfigPath = resolve(__dirname, '../../eslint.config.mjs');
9
+ const rootConfig = await import(rootConfigPath);
10
+
11
+ export default [
12
+ ...rootConfig.default,
13
+ {
14
+ files: ['src/**/*.ts'],
15
+ languageOptions: {
16
+ parserOptions: {
17
+ project: ['./tsconfig.esm.json'],
18
+ tsconfigRootDir: __dirname,
19
+ },
20
+ },
21
+ },
22
+ ];
package/jest.setup.js ADDED
@@ -0,0 +1,2 @@
1
+ const { toMatchImageSnapshot } = require('jest-image-snapshot');
2
+ expect.extend({ toMatchImageSnapshot });