@nowline/export-pdf 0.8.6 → 0.10.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.
package/dist/index.d.ts CHANGED
@@ -10,7 +10,7 @@ export interface PdfOptions {
10
10
  author?: string;
11
11
  /** Title baked into the PDF Info dict. Defaults to roadmap title. */
12
12
  title?: string;
13
- /** Subject. Defaults to the source filename. */
13
+ /** Subject. Defaults to the source filename (basename, no directory). */
14
14
  subject?: string;
15
15
  /** Producer string. Defaults to `nowline (m2c)`. */
16
16
  producer?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EACR,YAAY,EACZ,cAAc,EACd,WAAW,EACX,gBAAgB,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAGH,KAAK,YAAY,EAIpB,MAAM,sBAAsB,CAAC;AAG9B,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC;IAChC,WAAW,CAAC,EAAE,cAAc,CAAC;IAC7B,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AASD,wBAAsB,SAAS,CAC3B,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,UAAe,GACzB,OAAO,CAAC,UAAU,CAAC,CAsErB;AAqCD,YAAY,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EACR,YAAY,EACZ,cAAc,EACd,WAAW,EACX,gBAAgB,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAGH,KAAK,YAAY,EAIpB,MAAM,sBAAsB,CAAC;AAG9B,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC;IAChC,WAAW,CAAC,EAAE,cAAc,CAAC;IAC7B,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AASD,wBAAsB,SAAS,CAC3B,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,UAAe,GACzB,OAAO,CAAC,UAAU,CAAC,CAsErB;AA8CD,YAAY,EAAE,YAAY,EAAE,CAAC"}
package/dist/index.js CHANGED
@@ -21,6 +21,11 @@
21
21
  // (since 0.13), so a fixed CreationDate yields a stable ID.
22
22
  // - `pdfVersion: '1.7'` pins the PDF spec.
23
23
  // - Producer / Creator strings are explicit, version-stable.
24
+ // - `info.Subject` defaults to the source *basename*, never the absolute
25
+ // `inputs.sourcePath`. The `/ID` hashes the Info dict and every xref
26
+ // offset shifts with its length, so an absolute path would make the bytes
27
+ // depend on where the source lives (and leak the author's filesystem
28
+ // layout into a file they share).
24
29
  // - Fonts: registered explicitly via PDFKit `registerFont(name, bytes,
25
30
  // family?)` so glyph subsets are byte-identical across hosts.
26
31
  // - PDFKit's default Helvetica is never loaded (`font: null` below). PDFKit
@@ -59,7 +64,7 @@ export async function exportPdf(inputs, svg, options = {}) {
59
64
  info: {
60
65
  Title: options.title ?? (inputs.model.header.title || 'Nowline Roadmap'),
61
66
  Author: options.author ?? inputs.model.header.author ?? '',
62
- Subject: options.subject ?? inputs.sourcePath,
67
+ Subject: options.subject ?? sourceBasename(inputs.sourcePath),
63
68
  Producer: options.producer ?? 'nowline (m2c)',
64
69
  Creator: options.producer ?? 'nowline (m2c)',
65
70
  CreationDate: creationDate,
@@ -120,6 +125,14 @@ async function resolveFontsFor() {
120
125
  const result = await resolveFonts();
121
126
  return { sans: result.sans, mono: result.mono };
122
127
  }
128
+ /**
129
+ * Final segment of `sourcePath`. Splits on both `/` and `\` rather than using
130
+ * `node:path`, so a Windows path reduces to the same basename on any host.
131
+ */
132
+ function sourceBasename(sourcePath) {
133
+ const sep = Math.max(sourcePath.lastIndexOf('/'), sourcePath.lastIndexOf('\\'));
134
+ return sourcePath.slice(sep + 1);
135
+ }
123
136
  function bufferOf(bytes) {
124
137
  return Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength);
125
138
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nowline/export-pdf",
3
- "version": "0.8.6",
3
+ "version": "0.10.0",
4
4
  "description": "Exports a Nowline roadmap as a crisp, vector PDF.",
5
5
  "license": "Apache-2.0",
6
6
  "engines": {
@@ -22,18 +22,18 @@
22
22
  ],
23
23
  "dependencies": {
24
24
  "@kittl/svg-to-pdfkit": "^0.1.12",
25
- "@nowline/export-core": "0.8.6",
25
+ "@nowline/export-core": "0.10.0",
26
26
  "pdfkit": "^0.20.2"
27
27
  },
28
28
  "devDependencies": {
29
- "@nowline/core": "0.8.6",
30
- "@nowline/layout": "0.8.6",
31
- "@nowline/renderer": "0.8.6",
32
- "@types/node": "^26.6.3",
29
+ "@nowline/core": "0.10.0",
30
+ "@nowline/layout": "0.10.0",
31
+ "@nowline/renderer": "0.10.0",
32
+ "@types/node": "^26.6.5",
33
33
  "@types/pdfkit": "^0.17.6",
34
34
  "langium": "~4.4.0",
35
35
  "typescript": "^7.0.2",
36
- "vitest": "^5.0.2"
36
+ "vitest": "^5.0.5"
37
37
  },
38
38
  "scripts": {
39
39
  "build": "tsc -b tsconfig.json",
package/src/index.ts CHANGED
@@ -21,6 +21,11 @@
21
21
  // (since 0.13), so a fixed CreationDate yields a stable ID.
22
22
  // - `pdfVersion: '1.7'` pins the PDF spec.
23
23
  // - Producer / Creator strings are explicit, version-stable.
24
+ // - `info.Subject` defaults to the source *basename*, never the absolute
25
+ // `inputs.sourcePath`. The `/ID` hashes the Info dict and every xref
26
+ // offset shifts with its length, so an absolute path would make the bytes
27
+ // depend on where the source lives (and leak the author's filesystem
28
+ // layout into a file they share).
24
29
  // - Fonts: registered explicitly via PDFKit `registerFont(name, bytes,
25
30
  // family?)` so glyph subsets are byte-identical across hosts.
26
31
  // - PDFKit's default Helvetica is never loaded (`font: null` below). PDFKit
@@ -56,7 +61,7 @@ export interface PdfOptions {
56
61
  author?: string;
57
62
  /** Title baked into the PDF Info dict. Defaults to roadmap title. */
58
63
  title?: string;
59
- /** Subject. Defaults to the source filename. */
64
+ /** Subject. Defaults to the source filename (basename, no directory). */
60
65
  subject?: string;
61
66
  /** Producer string. Defaults to `nowline (m2c)`. */
62
67
  producer?: string;
@@ -113,7 +118,7 @@ export async function exportPdf(
113
118
  info: {
114
119
  Title: options.title ?? (inputs.model.header.title || 'Nowline Roadmap'),
115
120
  Author: options.author ?? inputs.model.header.author ?? '',
116
- Subject: options.subject ?? inputs.sourcePath,
121
+ Subject: options.subject ?? sourceBasename(inputs.sourcePath),
117
122
  Producer: options.producer ?? 'nowline (m2c)',
118
123
  Creator: options.producer ?? 'nowline (m2c)',
119
124
  CreationDate: creationDate,
@@ -182,6 +187,15 @@ async function resolveFontsFor(): Promise<ResolvedFontPair> {
182
187
  return { sans: result.sans, mono: result.mono };
183
188
  }
184
189
 
190
+ /**
191
+ * Final segment of `sourcePath`. Splits on both `/` and `\` rather than using
192
+ * `node:path`, so a Windows path reduces to the same basename on any host.
193
+ */
194
+ function sourceBasename(sourcePath: string): string {
195
+ const sep = Math.max(sourcePath.lastIndexOf('/'), sourcePath.lastIndexOf('\\'));
196
+ return sourcePath.slice(sep + 1);
197
+ }
198
+
185
199
  function bufferOf(bytes: Uint8Array): Buffer {
186
200
  return Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength);
187
201
  }