@cdot65/prisma-airs-cli 2.6.1 → 2.8.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 (105) hide show
  1. package/dist/airs/promptsets.d.ts.map +1 -1
  2. package/dist/airs/promptsets.js +1 -17
  3. package/dist/airs/promptsets.js.map +1 -1
  4. package/dist/airs/redteam.d.ts +5 -0
  5. package/dist/airs/redteam.d.ts.map +1 -1
  6. package/dist/airs/redteam.js +9 -0
  7. package/dist/airs/redteam.js.map +1 -1
  8. package/dist/airs/types.d.ts +3 -0
  9. package/dist/airs/types.d.ts.map +1 -1
  10. package/dist/cli/commands/dlp-gen.d.ts +3 -0
  11. package/dist/cli/commands/dlp-gen.d.ts.map +1 -0
  12. package/dist/cli/commands/dlp-gen.js +51 -0
  13. package/dist/cli/commands/dlp-gen.js.map +1 -0
  14. package/dist/cli/commands/redteam.d.ts +4 -0
  15. package/dist/cli/commands/redteam.d.ts.map +1 -1
  16. package/dist/cli/commands/redteam.js +35 -1
  17. package/dist/cli/commands/redteam.js.map +1 -1
  18. package/dist/cli/commands/runtime.d.ts.map +1 -1
  19. package/dist/cli/commands/runtime.js +5 -0
  20. package/dist/cli/commands/runtime.js.map +1 -1
  21. package/dist/dlp/embed/docx.d.ts +3 -0
  22. package/dist/dlp/embed/docx.d.ts.map +1 -0
  23. package/dist/dlp/embed/docx.js +47 -0
  24. package/dist/dlp/embed/docx.js.map +1 -0
  25. package/dist/dlp/embed/index.d.ts +6 -0
  26. package/dist/dlp/embed/index.d.ts.map +1 -0
  27. package/dist/dlp/embed/index.js +20 -0
  28. package/dist/dlp/embed/index.js.map +1 -0
  29. package/dist/dlp/embed/jpeg.d.ts +5 -0
  30. package/dist/dlp/embed/jpeg.d.ts.map +1 -0
  31. package/dist/dlp/embed/jpeg.js +60 -0
  32. package/dist/dlp/embed/jpeg.js.map +1 -0
  33. package/dist/dlp/embed/pdf.d.ts +7 -0
  34. package/dist/dlp/embed/pdf.d.ts.map +1 -0
  35. package/dist/dlp/embed/pdf.js +92 -0
  36. package/dist/dlp/embed/pdf.js.map +1 -0
  37. package/dist/dlp/embed/png-chunks.d.ts +12 -0
  38. package/dist/dlp/embed/png-chunks.d.ts.map +1 -0
  39. package/dist/dlp/embed/png-chunks.js +85 -0
  40. package/dist/dlp/embed/png-chunks.js.map +1 -0
  41. package/dist/dlp/embed/png.d.ts +5 -0
  42. package/dist/dlp/embed/png.d.ts.map +1 -0
  43. package/dist/dlp/embed/png.js +68 -0
  44. package/dist/dlp/embed/png.js.map +1 -0
  45. package/dist/dlp/embed/svg.d.ts +3 -0
  46. package/dist/dlp/embed/svg.d.ts.map +1 -0
  47. package/dist/dlp/embed/svg.js +28 -0
  48. package/dist/dlp/embed/svg.js.map +1 -0
  49. package/dist/dlp/embed/zip.d.ts +3 -0
  50. package/dist/dlp/embed/zip.d.ts.map +1 -0
  51. package/dist/dlp/embed/zip.js +25 -0
  52. package/dist/dlp/embed/zip.js.map +1 -0
  53. package/dist/dlp/generate/docx.d.ts +3 -0
  54. package/dist/dlp/generate/docx.d.ts.map +1 -0
  55. package/dist/dlp/generate/docx.js +20 -0
  56. package/dist/dlp/generate/docx.js.map +1 -0
  57. package/dist/dlp/generate/index.d.ts +5 -0
  58. package/dist/dlp/generate/index.d.ts.map +1 -0
  59. package/dist/dlp/generate/index.js +21 -0
  60. package/dist/dlp/generate/index.js.map +1 -0
  61. package/dist/dlp/generate/jpeg.d.ts +3 -0
  62. package/dist/dlp/generate/jpeg.d.ts.map +1 -0
  63. package/dist/dlp/generate/jpeg.js +8 -0
  64. package/dist/dlp/generate/jpeg.js.map +1 -0
  65. package/dist/dlp/generate/pdf.d.ts +3 -0
  66. package/dist/dlp/generate/pdf.d.ts.map +1 -0
  67. package/dist/dlp/generate/pdf.js +19 -0
  68. package/dist/dlp/generate/pdf.js.map +1 -0
  69. package/dist/dlp/generate/png.d.ts +3 -0
  70. package/dist/dlp/generate/png.d.ts.map +1 -0
  71. package/dist/dlp/generate/png.js +8 -0
  72. package/dist/dlp/generate/png.js.map +1 -0
  73. package/dist/dlp/generate/raster.d.ts +9 -0
  74. package/dist/dlp/generate/raster.d.ts.map +1 -0
  75. package/dist/dlp/generate/raster.js +20 -0
  76. package/dist/dlp/generate/raster.js.map +1 -0
  77. package/dist/dlp/generate/svg.d.ts +3 -0
  78. package/dist/dlp/generate/svg.d.ts.map +1 -0
  79. package/dist/dlp/generate/svg.js +17 -0
  80. package/dist/dlp/generate/svg.js.map +1 -0
  81. package/dist/dlp/index.d.ts +15 -0
  82. package/dist/dlp/index.d.ts.map +1 -0
  83. package/dist/dlp/index.js +54 -0
  84. package/dist/dlp/index.js.map +1 -0
  85. package/dist/dlp/lorem.d.ts +3 -0
  86. package/dist/dlp/lorem.d.ts.map +1 -0
  87. package/dist/dlp/lorem.js +65 -0
  88. package/dist/dlp/lorem.js.map +1 -0
  89. package/dist/dlp/manifest.d.ts +11 -0
  90. package/dist/dlp/manifest.d.ts.map +1 -0
  91. package/dist/dlp/manifest.js +14 -0
  92. package/dist/dlp/manifest.js.map +1 -0
  93. package/dist/dlp/payload.d.ts +6 -0
  94. package/dist/dlp/payload.d.ts.map +1 -0
  95. package/dist/dlp/payload.js +62 -0
  96. package/dist/dlp/payload.js.map +1 -0
  97. package/dist/dlp/rng.d.ts +9 -0
  98. package/dist/dlp/rng.d.ts.map +1 -0
  99. package/dist/dlp/rng.js +28 -0
  100. package/dist/dlp/rng.js.map +1 -0
  101. package/dist/dlp/types.d.ts +26 -0
  102. package/dist/dlp/types.d.ts.map +1 -0
  103. package/dist/dlp/types.js +2 -0
  104. package/dist/dlp/types.js.map +1 -0
  105. package/package.json +6 -2
@@ -0,0 +1,92 @@
1
+ import { inflateSync } from 'node:zlib';
2
+ import { PDFDocument, rgb } from 'pdf-lib';
3
+ const join = (p) => p.map((v) => `${v.category}: ${v.value}`).join(' | ');
4
+ async function setMeta(clean, p) {
5
+ const doc = await PDFDocument.load(clean);
6
+ doc.setTitle(join(p));
7
+ doc.setSubject(join(p));
8
+ doc.setKeywords(p.map((v) => v.value));
9
+ doc.setAuthor(p.find((v) => v.category === 'email')?.value ?? 'synthetic');
10
+ return Buffer.from(await doc.save());
11
+ }
12
+ // "Hidden" text layer: drawn in white so it does not show on a white page, but the
13
+ // literal string remains in the (uncompressed) page content stream. pdf-lib does not
14
+ // expose text render-mode 3, so white-on-white is the chosen, reliably-verifiable approach.
15
+ async function hiddenText(clean, p) {
16
+ const doc = await PDFDocument.load(clean);
17
+ const page = doc.getPage(0);
18
+ let y = 760;
19
+ for (const v of p) {
20
+ page.drawText(`${v.category}: ${v.value}`, { x: 40, y, size: 6, color: rgb(1, 1, 1) });
21
+ y -= 8;
22
+ }
23
+ return Buffer.from(await doc.save());
24
+ }
25
+ const trailer = (clean, p) => Buffer.concat([clean, Buffer.from(`\n% DLP ${join(p)}\n`, 'utf8')]);
26
+ /** Recover text from all PDF streams (inflating FlateDecode streams; falling back to raw). */
27
+ export function pdfStreamText(pdf) {
28
+ const parts = [];
29
+ let idx = 0;
30
+ for (;;) {
31
+ const s = pdf.indexOf('stream', idx);
32
+ if (s < 0) {
33
+ break;
34
+ }
35
+ let dataStart = s + 6;
36
+ if (pdf[dataStart] === 0x0d) {
37
+ dataStart++;
38
+ }
39
+ if (pdf[dataStart] === 0x0a) {
40
+ dataStart++;
41
+ }
42
+ const e = pdf.indexOf('endstream', dataStart);
43
+ if (e < 0) {
44
+ break;
45
+ }
46
+ const raw = pdf.subarray(dataStart, e);
47
+ try {
48
+ parts.push(inflateSync(raw).toString('latin1'));
49
+ }
50
+ catch {
51
+ parts.push(raw.toString('latin1'));
52
+ }
53
+ idx = e + 9;
54
+ }
55
+ const combined = parts.join('\n');
56
+ // pdf-lib renders drawn text as PDF hex strings (<...>); decode them too.
57
+ const decoded = [combined];
58
+ for (const m of combined.matchAll(/<([0-9A-Fa-f]+)>/g)) {
59
+ if (m[1].length % 2 === 0) {
60
+ decoded.push(Buffer.from(m[1], 'hex').toString('latin1'));
61
+ }
62
+ }
63
+ return decoded.join('\n');
64
+ }
65
+ /** Recover document-info-dict metadata from a PDF. */
66
+ export async function pdfMetaExtract(pdf) {
67
+ const doc = await PDFDocument.load(pdf);
68
+ return [doc.getTitle(), doc.getSubject(), doc.getAuthor(), doc.getKeywords()]
69
+ .filter((v) => typeof v === 'string')
70
+ .join('\n');
71
+ }
72
+ export const pdfTechniques = {
73
+ meta: {
74
+ id: 'meta',
75
+ format: 'pdf',
76
+ label: 'document info dict',
77
+ embed: (c, p) => setMeta(c, p),
78
+ },
79
+ 'hidden-text': {
80
+ id: 'hidden-text',
81
+ format: 'pdf',
82
+ label: 'white (hidden) text layer',
83
+ embed: (c, p) => hiddenText(c, p),
84
+ },
85
+ trailer: {
86
+ id: 'trailer',
87
+ format: 'pdf',
88
+ label: 'bytes after %%EOF',
89
+ embed: (c, p) => trailer(c, p),
90
+ },
91
+ };
92
+ //# sourceMappingURL=pdf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf.js","sourceRoot":"","sources":["../../../src/dlp/embed/pdf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAG3C,MAAM,IAAI,GAAG,CAAC,CAAiB,EAAU,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAElG,KAAK,UAAU,OAAO,CAAC,KAAa,EAAE,CAAiB;IACrD,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1C,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACtB,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACxB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACvC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,EAAE,KAAK,IAAI,WAAW,CAAC,CAAC;IAC3E,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,mFAAmF;AACnF,qFAAqF;AACrF,4FAA4F;AAC5F,KAAK,UAAU,UAAU,CAAC,KAAa,EAAE,CAAiB;IACxD,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,CAAC,GAAG,GAAG,CAAC;IACZ,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAClB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACvF,CAAC,IAAI,CAAC,CAAC;IACT,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,CAAiB,EAAU,EAAE,CAC3D,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AAEtE,8FAA8F;AAC9F,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,SAAS,CAAC;QACR,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACV,MAAM;QACR,CAAC;QACD,IAAI,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,GAAG,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5B,SAAS,EAAE,CAAC;QACd,CAAC;QACD,IAAI,GAAG,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5B,SAAS,EAAE,CAAC;QACd,CAAC;QACD,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAC9C,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACV,MAAM;QACR,CAAC;QACD,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACvC,IAAI,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrC,CAAC;QACD,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,0EAA0E;IAC1E,MAAM,OAAO,GAAa,CAAC,QAAQ,CAAC,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,sDAAsD;AACtD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW;IAC9C,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,UAAU,EAAE,EAAE,GAAG,CAAC,SAAS,EAAE,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC;SAC1E,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;SACjD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAA8B;IACtD,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM;QACV,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,oBAAoB;QAC3B,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;KAC/B;IACD,aAAa,EAAE;QACb,EAAE,EAAE,aAAa;QACjB,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,2BAA2B;QAClC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;KAClC;IACD,OAAO,EAAE;QACP,EAAE,EAAE,SAAS;QACb,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,mBAAmB;QAC1B,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;KAC/B;CACF,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface Chunk {
2
+ type: string;
3
+ data: Buffer;
4
+ }
5
+ export declare function parseChunks(png: Buffer): Chunk[];
6
+ export declare function insertBeforeIEND(png: Buffer, extra: Buffer): Buffer;
7
+ export declare const tEXt: (keyword: string, text: string) => Buffer;
8
+ export declare const zTXt: (keyword: string, text: string) => Buffer;
9
+ export declare const iTXt: (keyword: string, text: string) => Buffer;
10
+ /** Recover all textual-chunk content (tEXt/zTXt/iTXt) as a single string. */
11
+ export declare function readTextChunks(png: Buffer): string;
12
+ //# sourceMappingURL=png-chunks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"png-chunks.d.ts","sourceRoot":"","sources":["../../../src/dlp/embed/png-chunks.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,EAAE,CAahD;AAWD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAWnE;AAED,eAAO,MAAM,IAAI,GAAI,SAAS,MAAM,EAAE,MAAM,MAAM,KAAG,MAIlD,CAAC;AAEJ,eAAO,MAAM,IAAI,GAAI,SAAS,MAAM,EAAE,MAAM,MAAM,KAAG,MAQlD,CAAC;AAEJ,eAAO,MAAM,IAAI,GAAI,SAAS,MAAM,EAAE,MAAM,MAAM,KAAG,MAQlD,CAAC;AAEJ,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAgBlD"}
@@ -0,0 +1,85 @@
1
+ import { deflateSync, inflateSync } from 'node:zlib';
2
+ const CRC_TABLE = (() => {
3
+ const t = new Uint32Array(256);
4
+ for (let n = 0; n < 256; n++) {
5
+ let c = n;
6
+ for (let k = 0; k < 8; k++) {
7
+ c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
8
+ }
9
+ t[n] = c >>> 0;
10
+ }
11
+ return t;
12
+ })();
13
+ function crc32(buf) {
14
+ let c = 0xffffffff;
15
+ for (let i = 0; i < buf.length; i++) {
16
+ c = CRC_TABLE[(c ^ buf[i]) & 0xff] ^ (c >>> 8);
17
+ }
18
+ return (c ^ 0xffffffff) >>> 0;
19
+ }
20
+ export function parseChunks(png) {
21
+ const chunks = [];
22
+ let off = 8;
23
+ while (off + 8 <= png.length) {
24
+ const len = png.readUInt32BE(off);
25
+ const type = png.toString('latin1', off + 4, off + 8);
26
+ chunks.push({ type, data: png.subarray(off + 8, off + 8 + len) });
27
+ off += 12 + len;
28
+ if (type === 'IEND') {
29
+ break;
30
+ }
31
+ }
32
+ return chunks;
33
+ }
34
+ function buildChunk(type, data) {
35
+ const len = Buffer.alloc(4);
36
+ len.writeUInt32BE(data.length, 0);
37
+ const typeBuf = Buffer.from(type, 'latin1');
38
+ const crc = Buffer.alloc(4);
39
+ crc.writeUInt32BE(crc32(Buffer.concat([typeBuf, data])), 0);
40
+ return Buffer.concat([len, typeBuf, data, crc]);
41
+ }
42
+ export function insertBeforeIEND(png, extra) {
43
+ let off = 8;
44
+ while (off + 8 <= png.length) {
45
+ const len = png.readUInt32BE(off);
46
+ const type = png.toString('latin1', off + 4, off + 8);
47
+ if (type === 'IEND') {
48
+ break;
49
+ }
50
+ off += 12 + len;
51
+ }
52
+ return Buffer.concat([png.subarray(0, off), extra, png.subarray(off)]);
53
+ }
54
+ export const tEXt = (keyword, text) => buildChunk('tEXt', Buffer.concat([Buffer.from(keyword, 'latin1'), Buffer.from([0]), Buffer.from(text, 'latin1')]));
55
+ export const zTXt = (keyword, text) => buildChunk('zTXt', Buffer.concat([
56
+ Buffer.from(keyword, 'latin1'),
57
+ Buffer.from([0, 0]),
58
+ deflateSync(Buffer.from(text, 'latin1')),
59
+ ]));
60
+ export const iTXt = (keyword, text) => buildChunk('iTXt', Buffer.concat([
61
+ Buffer.from(keyword, 'latin1'),
62
+ Buffer.from([0, 0, 0, 0, 0]),
63
+ Buffer.from(text, 'utf8'),
64
+ ]));
65
+ /** Recover all textual-chunk content (tEXt/zTXt/iTXt) as a single string. */
66
+ export function readTextChunks(png) {
67
+ const parts = [];
68
+ for (const ch of parseChunks(png)) {
69
+ if (ch.type === 'tEXt') {
70
+ parts.push(ch.data.toString('latin1'));
71
+ }
72
+ else if (ch.type === 'zTXt') {
73
+ const nul = ch.data.indexOf(0);
74
+ parts.push(inflateSync(ch.data.subarray(nul + 2)).toString('latin1'));
75
+ }
76
+ else if (ch.type === 'iTXt') {
77
+ let i = ch.data.indexOf(0) + 3; // after keyword\0 + compFlag + compMethod
78
+ i = ch.data.indexOf(0, i) + 1; // after language tag
79
+ i = ch.data.indexOf(0, i) + 1; // after translated keyword
80
+ parts.push(ch.data.subarray(i).toString('utf8'));
81
+ }
82
+ }
83
+ return parts.join('\n');
84
+ }
85
+ //# sourceMappingURL=png-chunks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"png-chunks.js","sourceRoot":"","sources":["../../../src/dlp/embed/png-chunks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Technique } from '../types.js';
2
+ /** Recover an LSB-embedded UTF-8 payload from a PNG. */
3
+ export declare function lsbExtract(png: Buffer): Promise<string>;
4
+ export declare const pngTechniques: Record<string, Technique>;
5
+ //# sourceMappingURL=png.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"png.d.ts","sourceRoot":"","sources":["../../../src/dlp/embed/png.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAgB,SAAS,EAAE,MAAM,aAAa,CAAC;AA0B3D,wDAAwD;AACxD,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAkB7D;AAED,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CA2BnD,CAAC"}
@@ -0,0 +1,68 @@
1
+ import sharp from 'sharp';
2
+ import { insertBeforeIEND, iTXt, tEXt, zTXt } from './png-chunks.js';
3
+ const join = (p) => p.map((v) => `${v.category}: ${v.value}`).join(' | ');
4
+ async function lsbEmbed(png, text) {
5
+ const { data, info } = await sharp(png).raw().toBuffer({ resolveWithObject: true });
6
+ const payload = Buffer.from(text, 'utf8');
7
+ const header = Buffer.alloc(4);
8
+ header.writeUInt32BE(payload.length, 0);
9
+ const blob = Buffer.concat([header, payload]);
10
+ const bits = blob.length * 8;
11
+ if (bits > data.length) {
12
+ throw new Error('cover image too small for stego payload');
13
+ }
14
+ for (let i = 0; i < bits; i++) {
15
+ const bit = (blob[i >> 3] >> (7 - (i & 7))) & 1;
16
+ data[i] = (data[i] & 0xfe) | bit;
17
+ }
18
+ return sharp(data, {
19
+ raw: { width: info.width, height: info.height, channels: info.channels },
20
+ })
21
+ .png()
22
+ .toBuffer();
23
+ }
24
+ /** Recover an LSB-embedded UTF-8 payload from a PNG. */
25
+ export async function lsbExtract(png) {
26
+ const { data } = await sharp(png).raw().toBuffer({ resolveWithObject: true });
27
+ const readByte = (start) => {
28
+ let b = 0;
29
+ for (let k = 0; k < 8; k++) {
30
+ b = (b << 1) | (data[start + k] & 1);
31
+ }
32
+ return b;
33
+ };
34
+ let len = 0;
35
+ for (let i = 0; i < 4; i++) {
36
+ len = (len << 8) | readByte(i * 8);
37
+ }
38
+ const out = Buffer.alloc(len);
39
+ for (let i = 0; i < len; i++) {
40
+ out[i] = readByte((4 + i) * 8);
41
+ }
42
+ return out.toString('utf8');
43
+ }
44
+ export const pngTechniques = {
45
+ 'text-chunks': {
46
+ id: 'text-chunks',
47
+ format: 'png',
48
+ label: 'tEXt/zTXt/iTXt chunks',
49
+ embed: (c, p) => insertBeforeIEND(c, Buffer.concat([
50
+ tEXt('Comment', join(p)),
51
+ zTXt('Description', join(p)),
52
+ iTXt('Keywords', join(p)),
53
+ ])),
54
+ },
55
+ trailer: {
56
+ id: 'trailer',
57
+ format: 'png',
58
+ label: 'bytes after IEND',
59
+ embed: (c, p) => Buffer.concat([c, Buffer.from(`\nDLP ${join(p)}\n`, 'utf8')]),
60
+ },
61
+ 'stego-lsb': {
62
+ id: 'stego-lsb',
63
+ format: 'png',
64
+ label: 'LSB steganography',
65
+ embed: (c, p) => lsbEmbed(c, join(p)),
66
+ },
67
+ };
68
+ //# sourceMappingURL=png.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"png.js","sourceRoot":"","sources":["../../../src/dlp/embed/png.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Technique } from '../types.js';
2
+ export declare const svgTechniques: Record<string, Technique>;
3
+ //# sourceMappingURL=svg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg.d.ts","sourceRoot":"","sources":["../../../src/dlp/embed/svg.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,SAAS,EAAE,MAAM,aAAa,CAAC;AAY3D,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAuBnD,CAAC"}
@@ -0,0 +1,28 @@
1
+ const line = (vals) => vals.map((v) => `${v.category}: ${v.value}`).join(' | ');
2
+ /** Insert a snippet immediately after the opening `<svg ...>` tag. */
3
+ function inject(clean, snippet) {
4
+ const s = clean.toString('utf8');
5
+ const idx = s.indexOf('>') + 1;
6
+ return Buffer.from(s.slice(0, idx) + snippet + s.slice(idx), 'utf8');
7
+ }
8
+ export const svgTechniques = {
9
+ meta: {
10
+ id: 'meta',
11
+ format: 'svg',
12
+ label: 'metadata + desc',
13
+ embed: (c, p) => inject(c, `<metadata>${line(p)}</metadata><desc>${line(p)}</desc>`),
14
+ },
15
+ 'hidden-text': {
16
+ id: 'hidden-text',
17
+ format: 'svg',
18
+ label: 'off-canvas <text>',
19
+ embed: (c, p) => inject(c, p.map((v) => `<text x="-9999" y="-9999">${v.category}: ${v.value}</text>`).join('')),
20
+ },
21
+ comment: {
22
+ id: 'comment',
23
+ format: 'svg',
24
+ label: 'XML comment',
25
+ embed: (c, p) => inject(c, `<!-- ${line(p)} -->`),
26
+ },
27
+ };
28
+ //# sourceMappingURL=svg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg.js","sourceRoot":"","sources":["../../../src/dlp/embed/svg.ts"],"names":[],"mappings":"AAEA,MAAM,IAAI,GAAG,CAAC,IAAoB,EAAU,EAAE,CAC5C,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAE3D,sEAAsE;AACtE,SAAS,MAAM,CAAC,KAAa,EAAE,OAAe;IAC5C,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAA8B;IACtD,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM;QACV,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,iBAAiB;QACxB,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,aAAa,IAAI,CAAC,CAAC,CAAC,oBAAoB,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;KACrF;IACD,aAAa,EAAE;QACb,EAAE,EAAE,aAAa;QACjB,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,mBAAmB;QAC1B,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACd,MAAM,CACJ,CAAC,EACD,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,6BAA6B,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CACpF;KACJ;IACD,OAAO,EAAE;QACP,EAAE,EAAE,SAAS;QACb,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,aAAa;QACpB,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;KAClD;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Extract concatenated text from all entries of a ZIP buffer (e.g. a DOCX). */
2
+ export declare function unzipText(zip: Buffer): string;
3
+ //# sourceMappingURL=zip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip.d.ts","sourceRoot":"","sources":["../../../src/dlp/embed/zip.ts"],"names":[],"mappings":"AAIA,gFAAgF;AAChF,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAmB7C"}
@@ -0,0 +1,25 @@
1
+ import { inflateRawSync } from 'node:zlib';
2
+ const LOCAL_HEADER = 0x04034b50;
3
+ /** Extract concatenated text from all entries of a ZIP buffer (e.g. a DOCX). */
4
+ export function unzipText(zip) {
5
+ const parts = [];
6
+ let off = 0;
7
+ while (off + 30 <= zip.length && zip.readUInt32LE(off) === LOCAL_HEADER) {
8
+ const method = zip.readUInt16LE(off + 8);
9
+ const compSize = zip.readUInt32LE(off + 18);
10
+ const nameLen = zip.readUInt16LE(off + 26);
11
+ const extraLen = zip.readUInt16LE(off + 28);
12
+ const dataStart = off + 30 + nameLen + extraLen;
13
+ const data = zip.subarray(dataStart, dataStart + compSize);
14
+ try {
15
+ const content = method === 8 ? inflateRawSync(data) : data;
16
+ parts.push(content.toString('utf8'));
17
+ }
18
+ catch {
19
+ // skip entries that cannot be inflated
20
+ }
21
+ off = dataStart + compSize;
22
+ }
23
+ return parts.join('\n');
24
+ }
25
+ //# sourceMappingURL=zip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip.js","sourceRoot":"","sources":["../../../src/dlp/embed/zip.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,MAAM,YAAY,GAAG,UAAU,CAAC;AAEhC,gFAAgF;AAChF,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,OAAO,GAAG,GAAG,EAAE,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,YAAY,EAAE,CAAC;QACxE,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,GAAG,GAAG,EAAE,GAAG,OAAO,GAAG,QAAQ,CAAC;QAChD,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAC;QAC3D,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC3D,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;QACD,GAAG,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC7B,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Generate a valid DOCX (zip) filled with lorem ipsum. */
2
+ export declare function docx(rng: () => number): Promise<Buffer>;
3
+ //# sourceMappingURL=docx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docx.d.ts","sourceRoot":"","sources":["../../../src/dlp/generate/docx.ts"],"names":[],"mappings":"AAGA,2DAA2D;AAC3D,wBAAsB,IAAI,CAAC,GAAG,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAe7D"}
@@ -0,0 +1,20 @@
1
+ import { Document, HeadingLevel, Packer, Paragraph, TextRun } from 'docx';
2
+ import { lorem } from '../lorem.js';
3
+ /** Generate a valid DOCX (zip) filled with lorem ipsum. */
4
+ export async function docx(rng) {
5
+ const paragraphs = lorem(rng, 3)
6
+ .split('\n\n')
7
+ .map((p) => new Paragraph({ children: [new TextRun(p)] }));
8
+ const doc = new Document({
9
+ sections: [
10
+ {
11
+ children: [
12
+ new Paragraph({ text: 'Generated Document', heading: HeadingLevel.HEADING_1 }),
13
+ ...paragraphs,
14
+ ],
15
+ },
16
+ ],
17
+ });
18
+ return Packer.toBuffer(doc);
19
+ }
20
+ //# sourceMappingURL=docx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docx.js","sourceRoot":"","sources":["../../../src/dlp/generate/docx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC1E,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,2DAA2D;AAC3D,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,GAAiB;IAC1C,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;SAC7B,KAAK,CAAC,MAAM,CAAC;SACb,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7D,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC;QACvB,QAAQ,EAAE;YACR;gBACE,QAAQ,EAAE;oBACR,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC;oBAC9E,GAAG,UAAU;iBACd;aACF;SACF;KACF,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Format } from '../types.js';
2
+ /** Clean-file generators keyed by format. */
3
+ export declare const generators: Record<Format, (rng: () => number) => Promise<Buffer> | Buffer>;
4
+ export declare const EXT: Record<Format, string>;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/dlp/generate/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAO1C,6CAA6C;AAC7C,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAMtF,CAAC;AAEF,eAAO,MAAM,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMtC,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { docx } from './docx.js';
2
+ import { jpeg } from './jpeg.js';
3
+ import { pdf } from './pdf.js';
4
+ import { png } from './png.js';
5
+ import { svg } from './svg.js';
6
+ /** Clean-file generators keyed by format. */
7
+ export const generators = {
8
+ pdf,
9
+ png,
10
+ jpeg,
11
+ svg,
12
+ docx,
13
+ };
14
+ export const EXT = {
15
+ pdf: 'pdf',
16
+ png: 'png',
17
+ jpeg: 'jpg',
18
+ svg: 'svg',
19
+ docx: 'docx',
20
+ };
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/dlp/generate/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,6CAA6C;AAC7C,MAAM,CAAC,MAAM,UAAU,GAAoE;IACzF,GAAG;IACH,GAAG;IACH,IAAI;IACJ,GAAG;IACH,IAAI;CACL,CAAC;AAEF,MAAM,CAAC,MAAM,GAAG,GAA2B;IACzC,GAAG,EAAE,KAAK;IACV,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,KAAK;IACX,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;CACb,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Generate a valid JPEG with deterministic gradient content. */
2
+ export declare function jpeg(rng: () => number): Promise<Buffer>;
3
+ //# sourceMappingURL=jpeg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jpeg.d.ts","sourceRoot":"","sources":["../../../src/dlp/generate/jpeg.ts"],"names":[],"mappings":"AAGA,iEAAiE;AACjE,wBAAsB,IAAI,CAAC,GAAG,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG7D"}
@@ -0,0 +1,8 @@
1
+ import sharp from 'sharp';
2
+ import { raster } from './raster.js';
3
+ /** Generate a valid JPEG with deterministic gradient content. */
4
+ export async function jpeg(rng) {
5
+ const { data, width, height, channels } = raster(rng);
6
+ return sharp(data, { raw: { width, height, channels } }).jpeg({ quality: 90 }).toBuffer();
7
+ }
8
+ //# sourceMappingURL=jpeg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jpeg.js","sourceRoot":"","sources":["../../../src/dlp/generate/jpeg.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,GAAiB;IAC1C,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtD,OAAO,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC5F,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Generate a valid single-page PDF filled with lorem ipsum. */
2
+ export declare function pdf(rng: () => number): Promise<Buffer>;
3
+ //# sourceMappingURL=pdf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf.d.ts","sourceRoot":"","sources":["../../../src/dlp/generate/pdf.ts"],"names":[],"mappings":"AAGA,gEAAgE;AAChE,wBAAsB,GAAG,CAAC,GAAG,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAc5D"}
@@ -0,0 +1,19 @@
1
+ import { PDFDocument, StandardFonts } from 'pdf-lib';
2
+ import { lorem } from '../lorem.js';
3
+ /** Generate a valid single-page PDF filled with lorem ipsum. */
4
+ export async function pdf(rng) {
5
+ const doc = await PDFDocument.create();
6
+ const font = await doc.embedFont(StandardFonts.Helvetica);
7
+ const page = doc.addPage([612, 792]);
8
+ page.drawText(lorem(rng, 3), {
9
+ x: 54,
10
+ y: 720,
11
+ size: 11,
12
+ font,
13
+ lineHeight: 15,
14
+ maxWidth: 504,
15
+ });
16
+ const bytes = await doc.save();
17
+ return Buffer.from(bytes);
18
+ }
19
+ //# sourceMappingURL=pdf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf.js","sourceRoot":"","sources":["../../../src/dlp/generate/pdf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,gEAAgE;AAChE,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,GAAiB;IACzC,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,CAAC;IACvC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACrC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE;QAC3B,CAAC,EAAE,EAAE;QACL,CAAC,EAAE,GAAG;QACN,IAAI,EAAE,EAAE;QACR,IAAI;QACJ,UAAU,EAAE,EAAE;QACd,QAAQ,EAAE,GAAG;KACd,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC/B,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Generate a valid PNG with deterministic gradient content. */
2
+ export declare function png(rng: () => number): Promise<Buffer>;
3
+ //# sourceMappingURL=png.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"png.d.ts","sourceRoot":"","sources":["../../../src/dlp/generate/png.ts"],"names":[],"mappings":"AAGA,gEAAgE;AAChE,wBAAsB,GAAG,CAAC,GAAG,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG5D"}
@@ -0,0 +1,8 @@
1
+ import sharp from 'sharp';
2
+ import { raster } from './raster.js';
3
+ /** Generate a valid PNG with deterministic gradient content. */
4
+ export async function png(rng) {
5
+ const { data, width, height, channels } = raster(rng);
6
+ return sharp(data, { raw: { width, height, channels } }).png().toBuffer();
7
+ }
8
+ //# sourceMappingURL=png.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"png.js","sourceRoot":"","sources":["../../../src/dlp/generate/png.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,gEAAgE;AAChE,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,GAAiB;IACzC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtD,OAAO,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface Raster {
2
+ data: Buffer;
3
+ width: number;
4
+ height: number;
5
+ channels: 3;
6
+ }
7
+ /** Build a deterministic RGB gradient raster for use as image cover content. */
8
+ export declare function raster(rng: () => number): Raster;
9
+ //# sourceMappingURL=raster.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raster.d.ts","sourceRoot":"","sources":["../../../src/dlp/generate/raster.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,CAAC;CACb;AAED,gFAAgF;AAChF,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,MAAM,GAAG,MAAM,CAiBhD"}
@@ -0,0 +1,20 @@
1
+ /** Build a deterministic RGB gradient raster for use as image cover content. */
2
+ export function raster(rng) {
3
+ const width = 256;
4
+ const height = 192;
5
+ const channels = 3;
6
+ const data = Buffer.alloc(width * height * channels);
7
+ const rb = Math.floor(rng() * 256);
8
+ const gb = Math.floor(rng() * 256);
9
+ const bb = Math.floor(rng() * 256);
10
+ for (let y = 0; y < height; y++) {
11
+ for (let x = 0; x < width; x++) {
12
+ const i = (y * width + x) * channels;
13
+ data[i] = (x + rb) & 255;
14
+ data[i + 1] = (y + gb) & 255;
15
+ data[i + 2] = (x + y + bb) & 255;
16
+ }
17
+ }
18
+ return { data, width, height, channels };
19
+ }
20
+ //# sourceMappingURL=raster.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raster.js","sourceRoot":"","sources":["../../../src/dlp/generate/raster.ts"],"names":[],"mappings":"AAOA,gFAAgF;AAChF,MAAM,UAAU,MAAM,CAAC,GAAiB;IACtC,MAAM,KAAK,GAAG,GAAG,CAAC;IAClB,MAAM,MAAM,GAAG,GAAG,CAAC;IACnB,MAAM,QAAQ,GAAG,CAAU,CAAC;IAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAC;IACrD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC;YACrC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;YACzB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;YAC7B,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;QACnC,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Generate a valid SVG (namespaced root) with deterministic placeholder shapes. */
2
+ export declare function svg(rng: () => number): Buffer;
3
+ //# sourceMappingURL=svg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg.d.ts","sourceRoot":"","sources":["../../../src/dlp/generate/svg.ts"],"names":[],"mappings":"AAEA,oFAAoF;AACpF,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,MAAM,GAAG,MAAM,CAc7C"}
@@ -0,0 +1,17 @@
1
+ import { pick } from '../rng.js';
2
+ /** Generate a valid SVG (namespaced root) with deterministic placeholder shapes. */
3
+ export function svg(rng) {
4
+ const width = 240;
5
+ const height = 160;
6
+ const fill = pick(rng, ['#673ab7', '#2196f3', '#4caf50', '#ff9800']);
7
+ const cx = 40 + Math.floor(rng() * 160);
8
+ const xml = `<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}" ` +
9
+ `viewBox="0 0 ${width} ${height}" role="img">` +
10
+ '<title>Generated image</title>' +
11
+ '<desc>A generated placeholder graphic.</desc>' +
12
+ `<rect width="${width}" height="${height}" fill="#ffffff"/>` +
13
+ `<circle cx="${cx}" cy="80" r="48" fill="${fill}"/>` +
14
+ '</svg>';
15
+ return Buffer.from(xml, 'utf8');
16
+ }
17
+ //# sourceMappingURL=svg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg.js","sourceRoot":"","sources":["../../../src/dlp/generate/svg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,oFAAoF;AACpF,MAAM,UAAU,GAAG,CAAC,GAAiB;IACnC,MAAM,KAAK,GAAG,GAAG,CAAC;IAClB,MAAM,MAAM,GAAG,GAAG,CAAC;IACnB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IACrE,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC;IACxC,MAAM,GAAG,GACP,kDAAkD,KAAK,aAAa,MAAM,IAAI;QAC9E,gBAAgB,KAAK,IAAI,MAAM,eAAe;QAC9C,gCAAgC;QAChC,+CAA+C;QAC/C,gBAAgB,KAAK,aAAa,MAAM,oBAAoB;QAC5D,eAAe,EAAE,0BAA0B,IAAI,KAAK;QACpD,QAAQ,CAAC;IACX,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { GenerateOptions } from './types.js';
2
+ export interface GenerateSummary {
3
+ clean: number;
4
+ dirty: number;
5
+ out: string;
6
+ manifestPath: string;
7
+ seed: number;
8
+ byFormat: Record<string, {
9
+ clean: number;
10
+ dirty: number;
11
+ }>;
12
+ }
13
+ /** Generate a clean/dirty DLP test corpus and a manifest describing it. */
14
+ export declare function generateCorpus(opts: GenerateOptions): Promise<GenerateSummary>;
15
+ //# sourceMappingURL=index.d.ts.map