pretext-pdf 1.1.0 → 1.6.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/CHANGELOG.md +687 -0
- package/README.md +83 -8
- package/dist/allowed-props.d.ts +76 -0
- package/dist/allowed-props.d.ts.map +1 -1
- package/dist/allowed-props.js.map +1 -1
- package/dist/assets/generators/barcode.d.ts +9 -0
- package/dist/assets/generators/barcode.d.ts.map +1 -0
- package/dist/assets/generators/barcode.js +24 -0
- package/dist/assets/generators/barcode.js.map +1 -0
- package/dist/assets/generators/chart.d.ts +13 -0
- package/dist/assets/generators/chart.d.ts.map +1 -0
- package/dist/assets/generators/chart.js +32 -0
- package/dist/assets/generators/chart.js.map +1 -0
- package/dist/assets/generators/qr.d.ts +9 -0
- package/dist/assets/generators/qr.d.ts.map +1 -0
- package/dist/assets/generators/qr.js +25 -0
- package/dist/assets/generators/qr.js.map +1 -0
- package/dist/assets/index.d.ts +19 -0
- package/dist/assets/index.d.ts.map +1 -0
- package/dist/assets/index.js +19 -0
- package/dist/assets/index.js.map +1 -0
- package/dist/assets/loaders/images.d.ts +20 -0
- package/dist/assets/loaders/images.d.ts.map +1 -0
- package/dist/assets/loaders/images.js +69 -0
- package/dist/assets/loaders/images.js.map +1 -0
- package/dist/assets/loaders/orchestrator.d.ts +24 -0
- package/dist/assets/loaders/orchestrator.d.ts.map +1 -0
- package/dist/assets/loaders/orchestrator.js +109 -0
- package/dist/assets/loaders/orchestrator.js.map +1 -0
- package/dist/assets/loaders/vectors.d.ts +25 -0
- package/dist/assets/loaders/vectors.d.ts.map +1 -0
- package/dist/assets/loaders/vectors.js +118 -0
- package/dist/assets/loaders/vectors.js.map +1 -0
- package/dist/assets/loaders/watermark.d.ts +12 -0
- package/dist/assets/loaders/watermark.d.ts.map +1 -0
- package/dist/assets/loaders/watermark.js +40 -0
- package/dist/assets/loaders/watermark.js.map +1 -0
- package/dist/assets/security/fetch.d.ts +14 -0
- package/dist/assets/security/fetch.d.ts.map +1 -0
- package/dist/assets/security/fetch.js +112 -0
- package/dist/assets/security/fetch.js.map +1 -0
- package/dist/assets/security/ipv4-normalize.d.ts +28 -0
- package/dist/assets/security/ipv4-normalize.d.ts.map +1 -0
- package/dist/assets/security/ipv4-normalize.js +116 -0
- package/dist/assets/security/ipv4-normalize.js.map +1 -0
- package/dist/assets/security/path-allowlist.d.ts +12 -0
- package/dist/assets/security/path-allowlist.d.ts.map +1 -0
- package/dist/assets/security/path-allowlist.js +26 -0
- package/dist/assets/security/path-allowlist.js.map +1 -0
- package/dist/assets/security/url-validation.d.ts +22 -0
- package/dist/assets/security/url-validation.d.ts.map +1 -0
- package/dist/assets/security/url-validation.js +164 -0
- package/dist/assets/security/url-validation.js.map +1 -0
- package/dist/assets/svg/dimensions.d.ts +19 -0
- package/dist/assets/svg/dimensions.d.ts.map +1 -0
- package/dist/assets/svg/dimensions.js +43 -0
- package/dist/assets/svg/dimensions.js.map +1 -0
- package/dist/assets/svg/rasterize.d.ts +6 -0
- package/dist/assets/svg/rasterize.d.ts.map +1 -0
- package/dist/assets/svg/rasterize.js +38 -0
- package/dist/assets/svg/rasterize.js.map +1 -0
- package/dist/assets/svg/resolve-content.d.ts +16 -0
- package/dist/assets/svg/resolve-content.d.ts.map +1 -0
- package/dist/assets/svg/resolve-content.js +38 -0
- package/dist/assets/svg/resolve-content.js.map +1 -0
- package/dist/assets/svg/sanitize.d.ts +22 -0
- package/dist/assets/svg/sanitize.d.ts.map +1 -0
- package/dist/assets/svg/sanitize.js +46 -0
- package/dist/assets/svg/sanitize.js.map +1 -0
- package/dist/assets/util/redact-path.d.ts +14 -0
- package/dist/assets/util/redact-path.d.ts.map +1 -0
- package/dist/assets/util/redact-path.js +16 -0
- package/dist/assets/util/redact-path.js.map +1 -0
- package/dist/assets.d.ts +10 -27
- package/dist/assets.d.ts.map +1 -1
- package/dist/assets.js +10 -549
- package/dist/assets.js.map +1 -1
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +2 -1
- package/dist/builder.js.map +1 -1
- package/dist/cli.js +11 -1
- package/dist/cli.js.map +1 -1
- package/dist/compat.d.ts +63 -1
- package/dist/compat.d.ts.map +1 -1
- package/dist/compat.js +42 -5
- package/dist/compat.js.map +1 -1
- package/dist/errors.d.ts +2 -2
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +2 -2
- package/dist/errors.js.map +1 -1
- package/dist/fonts.d.ts.map +1 -1
- package/dist/fonts.js +8 -10
- package/dist/fonts.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/dist/layout-state.d.ts +1 -1
- package/dist/layout-state.d.ts.map +1 -1
- package/dist/layout-state.js +5 -0
- package/dist/layout-state.js.map +1 -1
- package/dist/measure-blocks/float-group.d.ts +9 -0
- package/dist/measure-blocks/float-group.d.ts.map +1 -0
- package/dist/measure-blocks/float-group.js +103 -0
- package/dist/measure-blocks/float-group.js.map +1 -0
- package/dist/measure-blocks/helpers.d.ts +44 -0
- package/dist/measure-blocks/helpers.d.ts.map +1 -0
- package/dist/measure-blocks/helpers.js +43 -0
- package/dist/measure-blocks/helpers.js.map +1 -0
- package/dist/measure-blocks/highlight.d.ts +26 -0
- package/dist/measure-blocks/highlight.d.ts.map +1 -0
- package/dist/measure-blocks/highlight.js +169 -0
- package/dist/measure-blocks/highlight.js.map +1 -0
- package/dist/measure-blocks/image.d.ts +9 -0
- package/dist/measure-blocks/image.d.ts.map +1 -0
- package/dist/measure-blocks/image.js +136 -0
- package/dist/measure-blocks/image.js.map +1 -0
- package/dist/measure-blocks/index.d.ts +24 -0
- package/dist/measure-blocks/index.d.ts.map +1 -0
- package/dist/measure-blocks/index.js +179 -0
- package/dist/measure-blocks/index.js.map +1 -0
- package/dist/measure-blocks/list.d.ts +8 -0
- package/dist/measure-blocks/list.d.ts.map +1 -0
- package/dist/measure-blocks/list.js +108 -0
- package/dist/measure-blocks/list.js.map +1 -0
- package/dist/measure-blocks/simple-blocks.d.ts +18 -0
- package/dist/measure-blocks/simple-blocks.d.ts.map +1 -0
- package/dist/measure-blocks/simple-blocks.js +121 -0
- package/dist/measure-blocks/simple-blocks.js.map +1 -0
- package/dist/measure-blocks/table/columns.d.ts +17 -0
- package/dist/measure-blocks/table/columns.d.ts.map +1 -0
- package/dist/measure-blocks/table/columns.js +83 -0
- package/dist/measure-blocks/table/columns.js.map +1 -0
- package/dist/measure-blocks/table/measure.d.ts +8 -0
- package/dist/measure-blocks/table/measure.d.ts.map +1 -0
- package/dist/measure-blocks/table/measure.js +231 -0
- package/dist/measure-blocks/table/measure.js.map +1 -0
- package/dist/measure-blocks/table/spans.d.ts +25 -0
- package/dist/measure-blocks/table/spans.d.ts.map +1 -0
- package/dist/measure-blocks/table/spans.js +55 -0
- package/dist/measure-blocks/table/spans.js.map +1 -0
- package/dist/measure-blocks/text-blocks.d.ts +17 -0
- package/dist/measure-blocks/text-blocks.d.ts.map +1 -0
- package/dist/measure-blocks/text-blocks.js +242 -0
- package/dist/measure-blocks/text-blocks.js.map +1 -0
- package/dist/measure-text.d.ts +21 -3
- package/dist/measure-text.d.ts.map +1 -1
- package/dist/measure-text.js +87 -36
- package/dist/measure-text.js.map +1 -1
- package/dist/measure.d.ts +1 -1
- package/dist/measure.d.ts.map +1 -1
- package/dist/measure.js +8 -6
- package/dist/measure.js.map +1 -1
- package/dist/node-polyfill.d.ts.map +1 -1
- package/dist/node-polyfill.js +9 -0
- package/dist/node-polyfill.js.map +1 -1
- package/dist/pipeline-footnotes.d.ts +1 -1
- package/dist/pipeline-footnotes.d.ts.map +1 -1
- package/dist/pipeline-toc.d.ts +1 -1
- package/dist/pipeline-toc.d.ts.map +1 -1
- package/dist/pipeline.d.ts +3 -3
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +4 -5
- package/dist/pipeline.js.map +1 -1
- package/dist/plugin-types.d.ts +1 -1
- package/dist/plugin-types.d.ts.map +1 -1
- package/dist/post-process.d.ts +2 -2
- package/dist/post-process.d.ts.map +1 -1
- package/dist/post-process.js +32 -9
- package/dist/post-process.js.map +1 -1
- package/dist/render-blocks/blockquote.d.ts +7 -0
- package/dist/render-blocks/blockquote.d.ts.map +1 -0
- package/dist/render-blocks/blockquote.js +87 -0
- package/dist/render-blocks/blockquote.js.map +1 -0
- package/dist/render-blocks/callout.d.ts +7 -0
- package/dist/render-blocks/callout.d.ts.map +1 -0
- package/dist/render-blocks/callout.js +84 -0
- package/dist/render-blocks/callout.js.map +1 -0
- package/dist/render-blocks/code.d.ts +7 -0
- package/dist/render-blocks/code.d.ts.map +1 -0
- package/dist/render-blocks/code.js +84 -0
- package/dist/render-blocks/code.js.map +1 -0
- package/dist/render-blocks/footnote.d.ts +11 -0
- package/dist/render-blocks/footnote.d.ts.map +1 -0
- package/dist/render-blocks/footnote.js +45 -0
- package/dist/render-blocks/footnote.js.map +1 -0
- package/dist/render-blocks/header-footer.d.ts +11 -0
- package/dist/render-blocks/header-footer.d.ts.map +1 -0
- package/dist/render-blocks/header-footer.js +56 -0
- package/dist/render-blocks/header-footer.js.map +1 -0
- package/dist/render-blocks/hr.d.ts +7 -0
- package/dist/render-blocks/hr.d.ts.map +1 -0
- package/dist/render-blocks/hr.js +24 -0
- package/dist/render-blocks/hr.js.map +1 -0
- package/dist/render-blocks/image.d.ts +9 -0
- package/dist/render-blocks/image.d.ts.map +1 -0
- package/dist/render-blocks/image.js +135 -0
- package/dist/render-blocks/image.js.map +1 -0
- package/dist/render-blocks/index.d.ts +17 -0
- package/dist/render-blocks/index.d.ts.map +1 -0
- package/dist/render-blocks/index.js +17 -0
- package/dist/render-blocks/index.js.map +1 -0
- package/dist/render-blocks/list-item.d.ts +7 -0
- package/dist/render-blocks/list-item.d.ts.map +1 -0
- package/dist/render-blocks/list-item.js +80 -0
- package/dist/render-blocks/list-item.js.map +1 -0
- package/dist/render-blocks/rich.d.ts +7 -0
- package/dist/render-blocks/rich.d.ts.map +1 -0
- package/dist/render-blocks/rich.js +160 -0
- package/dist/render-blocks/rich.js.map +1 -0
- package/dist/render-blocks/table.d.ts +7 -0
- package/dist/render-blocks/table.d.ts.map +1 -0
- package/dist/render-blocks/table.js +139 -0
- package/dist/render-blocks/table.js.map +1 -0
- package/dist/render-blocks/text.d.ts +7 -0
- package/dist/render-blocks/text.d.ts.map +1 -0
- package/dist/render-blocks/text.js +183 -0
- package/dist/render-blocks/text.js.map +1 -0
- package/dist/render-blocks/watermark.d.ts +8 -0
- package/dist/render-blocks/watermark.d.ts.map +1 -0
- package/dist/render-blocks/watermark.js +52 -0
- package/dist/render-blocks/watermark.js.map +1 -0
- package/dist/render-extras.d.ts.map +1 -1
- package/dist/render-extras.js +1 -2
- package/dist/render-extras.js.map +1 -1
- package/dist/render-utils.d.ts.map +1 -1
- package/dist/render-utils.js +10 -6
- package/dist/render-utils.js.map +1 -1
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +9 -3
- package/dist/render.js.map +1 -1
- package/dist/rich-text.d.ts +2 -1
- package/dist/rich-text.d.ts.map +1 -1
- package/dist/rich-text.js +0 -1
- package/dist/rich-text.js.map +1 -1
- package/dist/types-internal.d.ts +19 -3
- package/dist/types-internal.d.ts.map +1 -1
- package/dist/types-public/document.d.ts +261 -0
- package/dist/types-public/document.d.ts.map +1 -0
- package/dist/types-public/document.js +2 -0
- package/dist/types-public/document.js.map +1 -0
- package/dist/types-public/elements-block.d.ts +246 -0
- package/dist/types-public/elements-block.d.ts.map +1 -0
- package/dist/types-public/elements-block.js +8 -0
- package/dist/types-public/elements-block.js.map +1 -0
- package/dist/types-public/elements-media.d.ts +199 -0
- package/dist/types-public/elements-media.d.ts.map +1 -0
- package/dist/types-public/elements-media.js +2 -0
- package/dist/types-public/elements-media.js.map +1 -0
- package/dist/types-public/elements-text.d.ts +327 -0
- package/dist/types-public/elements-text.d.ts.map +1 -0
- package/dist/types-public/elements-text.js +2 -0
- package/dist/types-public/elements-text.js.map +1 -0
- package/dist/types-public/index.d.ts +14 -0
- package/dist/types-public/index.d.ts.map +1 -0
- package/dist/types-public/index.js +2 -0
- package/dist/types-public/index.js.map +1 -0
- package/dist/types-public/render-options.d.ts +38 -0
- package/dist/types-public/render-options.d.ts.map +1 -0
- package/dist/types-public/render-options.js +2 -0
- package/dist/types-public/render-options.js.map +1 -0
- package/dist/types-public/union.d.ts +13 -0
- package/dist/types-public/union.d.ts.map +1 -0
- package/dist/types-public/union.js +2 -0
- package/dist/types-public/union.js.map +1 -0
- package/dist/types-public/validation.d.ts +64 -0
- package/dist/types-public/validation.d.ts.map +1 -0
- package/dist/types-public/validation.js +2 -0
- package/dist/types-public/validation.js.map +1 -0
- package/dist/types-public.d.ts +5 -1081
- package/dist/types-public.d.ts.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/validate/document.d.ts +28 -0
- package/dist/validate/document.d.ts.map +1 -0
- package/dist/validate/document.js +295 -0
- package/dist/validate/document.js.map +1 -0
- package/dist/validate/elements/forms-floats.d.ts +19 -0
- package/dist/validate/elements/forms-floats.d.ts.map +1 -0
- package/dist/validate/elements/forms-floats.js +96 -0
- package/dist/validate/elements/forms-floats.js.map +1 -0
- package/dist/validate/elements/list.d.ts +10 -0
- package/dist/validate/elements/list.d.ts.map +1 -0
- package/dist/validate/elements/list.js +66 -0
- package/dist/validate/elements/list.js.map +1 -0
- package/dist/validate/elements/media.d.ts +23 -0
- package/dist/validate/elements/media.d.ts.map +1 -0
- package/dist/validate/elements/media.js +179 -0
- package/dist/validate/elements/media.js.map +1 -0
- package/dist/validate/elements/structural-simple.d.ts +21 -0
- package/dist/validate/elements/structural-simple.d.ts.map +1 -0
- package/dist/validate/elements/structural-simple.js +63 -0
- package/dist/validate/elements/structural-simple.js.map +1 -0
- package/dist/validate/elements/structural.d.ts +12 -0
- package/dist/validate/elements/structural.d.ts.map +1 -0
- package/dist/validate/elements/structural.js +12 -0
- package/dist/validate/elements/structural.js.map +1 -0
- package/dist/validate/elements/table.d.ts +10 -0
- package/dist/validate/elements/table.d.ts.map +1 -0
- package/dist/validate/elements/table.js +165 -0
- package/dist/validate/elements/table.js.map +1 -0
- package/dist/validate/elements/text.d.ts +26 -0
- package/dist/validate/elements/text.d.ts.map +1 -0
- package/dist/validate/elements/text.js +331 -0
- package/dist/validate/elements/text.js.map +1 -0
- package/dist/validate/errors.d.ts +9 -0
- package/dist/validate/errors.d.ts.map +1 -0
- package/dist/validate/errors.js +43 -0
- package/dist/validate/errors.js.map +1 -0
- package/dist/validate/fonts.d.ts +11 -0
- package/dist/validate/fonts.d.ts.map +1 -0
- package/dist/validate/fonts.js +118 -0
- package/dist/validate/fonts.js.map +1 -0
- package/dist/validate/helpers.d.ts +76 -0
- package/dist/validate/helpers.d.ts.map +1 -0
- package/dist/validate/helpers.js +169 -0
- package/dist/validate/helpers.js.map +1 -0
- package/dist/validate/index.d.ts +37 -0
- package/dist/validate/index.d.ts.map +1 -0
- package/dist/validate/index.js +279 -0
- package/dist/validate/index.js.map +1 -0
- package/dist/validate.d.ts +6 -18
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +6 -1582
- package/dist/validate.js.map +1 -1
- package/dist/vendor/pretext/VERSION.d.ts +3 -0
- package/dist/vendor/pretext/VERSION.d.ts.map +1 -0
- package/dist/vendor/pretext/VERSION.js +12 -0
- package/dist/vendor/pretext/VERSION.js.map +1 -0
- package/dist/version-check.d.ts +47 -0
- package/dist/version-check.d.ts.map +1 -0
- package/dist/version-check.js +75 -0
- package/dist/version-check.js.map +1 -0
- package/package.json +27 -8
- package/dist/measure-blocks.d.ts +0 -26
- package/dist/measure-blocks.d.ts.map +0 -1
- package/dist/measure-blocks.js +0 -1317
- package/dist/measure-blocks.js.map +0 -1
- package/dist/render-blocks.d.ts +0 -28
- package/dist/render-blocks.d.ts.map +0 -1
- package/dist/render-blocks.js +0 -1059
- package/dist/render-blocks.js.map +0 -1
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export function isValidPdfDocumentLike(doc) {
|
|
2
|
+
return doc !== null && typeof doc === 'object' && !Array.isArray(doc);
|
|
3
|
+
}
|
|
4
|
+
/** Parse a PretextPdfError message into structured ValidationError entries */
|
|
5
|
+
export function parseValidationErrorsStructured(message, code) {
|
|
6
|
+
if (message.startsWith('Strict validation failed')) {
|
|
7
|
+
const lines = message
|
|
8
|
+
.split('\n')
|
|
9
|
+
.slice(1) // skip "Strict validation failed (N issues):" header
|
|
10
|
+
.filter(l => Boolean(l.trim()) && !l.startsWith('...'));
|
|
11
|
+
return lines.map(line => {
|
|
12
|
+
const colonIdx = line.indexOf(':');
|
|
13
|
+
const path = colonIdx > 0 ? line.slice(0, colonIdx).trim() : 'document';
|
|
14
|
+
const rest = colonIdx > 0 ? line.slice(colonIdx + 1).trim() : line.trim();
|
|
15
|
+
const suggMatch = rest.match(/did you mean "([^"]+)"/);
|
|
16
|
+
const suggestion = suggMatch ? suggMatch[1] : undefined;
|
|
17
|
+
const isUnknown = rest.includes('unknown property');
|
|
18
|
+
const unknownProp = isUnknown ? (/\.([^.[]+)$/.exec(path)?.[1] ?? path) : undefined;
|
|
19
|
+
return {
|
|
20
|
+
path,
|
|
21
|
+
message: rest,
|
|
22
|
+
code: 'UNKNOWN_PROPERTY',
|
|
23
|
+
severity: 'error',
|
|
24
|
+
...(unknownProp !== undefined && { unknownProp }),
|
|
25
|
+
...(suggestion !== undefined && { suggestion }),
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
const colonIdx = message.indexOf(':');
|
|
30
|
+
// A valid path (e.g. "content[0] (paragraph) spans[0].href") never contains ". " (period + space).
|
|
31
|
+
// Prose fragments like "margins.left must be a non-negative finite number. Got" do, so we reject them.
|
|
32
|
+
const candidate = message.slice(0, colonIdx).trim();
|
|
33
|
+
const hasPathPrefix = colonIdx > 0 && !/\. /.test(candidate);
|
|
34
|
+
const path = hasPathPrefix ? candidate : 'document';
|
|
35
|
+
const msgText = hasPathPrefix ? message.slice(colonIdx + 1).trim() : message;
|
|
36
|
+
return [{
|
|
37
|
+
path,
|
|
38
|
+
message: msgText,
|
|
39
|
+
code: code,
|
|
40
|
+
severity: 'error',
|
|
41
|
+
}];
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/validate/errors.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,sBAAsB,CAAC,GAAY;IACjD,OAAO,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;AACvE,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,+BAA+B,CAAC,OAAe,EAAE,IAAY;IAC3E,IAAI,OAAO,CAAC,UAAU,CAAC,0BAA0B,CAAC,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,OAAO;aAClB,KAAK,CAAC,IAAI,CAAC;aACX,KAAK,CAAC,CAAC,CAAC,CAAC,qDAAqD;aAC9D,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;QACzD,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YAClC,MAAM,IAAI,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAA;YACvE,MAAM,IAAI,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;YACzE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAA;YACtD,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YACvD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAA;YACnD,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YACnF,OAAO;gBACL,IAAI;gBACJ,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,kBAAkB;gBACxB,QAAQ,EAAE,OAAgB;gBAC1B,GAAG,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,CAAC;gBACjD,GAAG,CAAC,UAAU,KAAK,SAAS,IAAI,EAAE,UAAU,EAAE,CAAC;aAChD,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACrC,mGAAmG;IACnG,uGAAuG;IACvG,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAA;IACnD,MAAM,aAAa,GAAG,QAAQ,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC5D,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAA;IACnD,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAA;IAC5E,OAAO,CAAC;YACN,IAAI;YACJ,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,IAAiB;YACvB,QAAQ,EAAE,OAAgB;SAC3B,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* validate/fonts.ts — Whole-document font reference validation.
|
|
3
|
+
* Extracted from src/validate.ts (#11a).
|
|
4
|
+
*
|
|
5
|
+
* Validates that every font family referenced anywhere in the document
|
|
6
|
+
* is either bundled (Inter) or present in doc.fonts. Catches problems early
|
|
7
|
+
* instead of silently falling back or dropping content.
|
|
8
|
+
*/
|
|
9
|
+
import type { PdfDocument } from '../types.js';
|
|
10
|
+
export declare function validateFontReferences(doc: PdfDocument, loadedFamilies: Set<string>): void;
|
|
11
|
+
//# sourceMappingURL=fonts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fonts.d.ts","sourceRoot":"","sources":["../../src/validate/fonts.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAI9C,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAmI1F"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { PretextPdfError } from '../errors.js';
|
|
2
|
+
import { BUNDLED_VARIANTS } from './helpers.js';
|
|
3
|
+
export function validateFontReferences(doc, loadedFamilies) {
|
|
4
|
+
const defaultFamily = doc.defaultFont ?? 'Inter';
|
|
5
|
+
// Build a variant-level set for italic checks: "Family-weight-style"
|
|
6
|
+
const loadedVariants = new Set(BUNDLED_VARIANTS);
|
|
7
|
+
for (const f of doc.fonts ?? []) {
|
|
8
|
+
loadedVariants.add(`${f.family}-${f.weight ?? 400}-${f.style ?? 'normal'}`);
|
|
9
|
+
}
|
|
10
|
+
const requireFamily = (family, context) => {
|
|
11
|
+
if (!/^[a-zA-Z0-9 ._+\-]+$/.test(family)) {
|
|
12
|
+
throw new PretextPdfError('VALIDATION_ERROR', `${context}: font family name "${family}" contains invalid characters. Use only letters, digits, spaces, hyphens, and underscores.`);
|
|
13
|
+
}
|
|
14
|
+
if (!loadedFamilies.has(family)) {
|
|
15
|
+
throw new PretextPdfError('FONT_NOT_LOADED', `${context}: font family '${family}' is not loaded. Add { family: '${family}', src: '/path/to.ttf' } to doc.fonts, or remove the fontFamily reference to use the default ('${defaultFamily}').`);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
const requireVariant = (family, weight, style, context) => {
|
|
19
|
+
const key = `${family}-${weight}-${style}`;
|
|
20
|
+
if (!loadedVariants.has(key)) {
|
|
21
|
+
if (style === 'italic') {
|
|
22
|
+
throw new PretextPdfError('ITALIC_FONT_NOT_LOADED', `${context}: fontStyle 'italic' requires an italic font variant. Add { family: '${family}', weight: ${weight}, style: 'italic', src: '/path/to-italic.ttf' } to doc.fonts.`);
|
|
23
|
+
}
|
|
24
|
+
throw new PretextPdfError('FONT_NOT_LOADED', `${context}: font variant '${key}' is not loaded. Add a matching FontSpec to doc.fonts.`);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
// 1. defaultFont must be loadable
|
|
28
|
+
requireFamily(defaultFamily, `doc.defaultFont '${defaultFamily}'`);
|
|
29
|
+
// 2. header / footer fontFamily + fontWeight variant
|
|
30
|
+
for (const [spec, label] of [[doc.header, 'doc.header'], [doc.footer, 'doc.footer']]) {
|
|
31
|
+
if (!spec)
|
|
32
|
+
continue;
|
|
33
|
+
if (spec.fontFamily)
|
|
34
|
+
requireFamily(spec.fontFamily, `${label}.fontFamily`);
|
|
35
|
+
if ((spec.fontWeight ?? 400) === 700) {
|
|
36
|
+
const family = spec.fontFamily ?? defaultFamily;
|
|
37
|
+
requireVariant(family, 700, 'normal', `${label} fontWeight:700`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// 2b. watermark fontFamily (text watermark only)
|
|
41
|
+
if (doc.watermark?.text) {
|
|
42
|
+
if (doc.watermark.fontFamily)
|
|
43
|
+
requireFamily(doc.watermark.fontFamily, 'doc.watermark.fontFamily');
|
|
44
|
+
if ((doc.watermark.fontWeight ?? 400) === 700) {
|
|
45
|
+
const family = doc.watermark.fontFamily ?? defaultFamily;
|
|
46
|
+
requireVariant(family, 700, 'normal', 'doc.watermark fontWeight:700');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// 3. content elements
|
|
50
|
+
for (let i = 0; i < doc.content.length; i++) {
|
|
51
|
+
const el = doc.content[i];
|
|
52
|
+
const prefix = `content[${i}]`;
|
|
53
|
+
if (el.type === 'paragraph') {
|
|
54
|
+
if (el.fontFamily)
|
|
55
|
+
requireFamily(el.fontFamily, `${prefix} (paragraph).fontFamily`);
|
|
56
|
+
if ((el.fontWeight ?? 400) === 700) {
|
|
57
|
+
const family = el.fontFamily ?? defaultFamily;
|
|
58
|
+
requireVariant(family, 700, 'normal', `${prefix} (paragraph) fontWeight:700`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (el.type === 'heading') {
|
|
62
|
+
if (el.fontFamily)
|
|
63
|
+
requireFamily(el.fontFamily, `${prefix} (heading).fontFamily`);
|
|
64
|
+
const family = el.fontFamily ?? defaultFamily;
|
|
65
|
+
const weight = el.fontWeight ?? 700;
|
|
66
|
+
requireVariant(family, weight, 'normal', `${prefix} (heading) fontWeight:${weight}`);
|
|
67
|
+
}
|
|
68
|
+
if (el.type === 'list') {
|
|
69
|
+
for (let ii = 0; ii < el.items.length; ii++) {
|
|
70
|
+
const item = el.items[ii];
|
|
71
|
+
if ((item.fontWeight ?? 400) === 700) {
|
|
72
|
+
requireVariant(defaultFamily, 700, 'normal', `${prefix} (list) items[${ii}] fontWeight:700`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (el.type === 'table') {
|
|
77
|
+
for (let ri = 0; ri < el.rows.length; ri++) {
|
|
78
|
+
for (let ci = 0; ci < el.rows[ri].cells.length; ci++) {
|
|
79
|
+
const cell = el.rows[ri].cells[ci];
|
|
80
|
+
if (cell.fontFamily)
|
|
81
|
+
requireFamily(cell.fontFamily, `${prefix} (table) rows[${ri}].cells[${ci}].fontFamily`);
|
|
82
|
+
if ((cell.fontWeight ?? 400) === 700) {
|
|
83
|
+
const family = cell.fontFamily ?? defaultFamily;
|
|
84
|
+
requireVariant(family, 700, 'normal', `${prefix} (table) rows[${ri}].cells[${ci}] fontWeight:700`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (el.type === 'rich-paragraph') {
|
|
90
|
+
for (let si = 0; si < el.spans.length; si++) {
|
|
91
|
+
const span = el.spans[si];
|
|
92
|
+
const spanFamily = span.fontFamily ?? defaultFamily;
|
|
93
|
+
const spanWeight = span.fontWeight ?? 400;
|
|
94
|
+
const spanStyle = span.fontStyle ?? 'normal';
|
|
95
|
+
if (span.fontFamily)
|
|
96
|
+
requireFamily(span.fontFamily, `${prefix} (rich-paragraph) spans[${si}].fontFamily`);
|
|
97
|
+
if (spanStyle === 'italic') {
|
|
98
|
+
requireVariant(spanFamily, spanWeight, 'italic', `${prefix} (rich-paragraph) spans[${si}]`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (el.type === 'blockquote') {
|
|
103
|
+
if (el.fontFamily)
|
|
104
|
+
requireFamily(el.fontFamily, `${prefix} (blockquote).fontFamily`);
|
|
105
|
+
const family = el.fontFamily ?? defaultFamily;
|
|
106
|
+
const weight = el.fontWeight ?? 400;
|
|
107
|
+
const style = el.fontStyle ?? 'normal';
|
|
108
|
+
if (style === 'italic') {
|
|
109
|
+
requireVariant(family, weight, 'italic', `${prefix} (blockquote) fontStyle:italic`);
|
|
110
|
+
}
|
|
111
|
+
else if (weight === 700) {
|
|
112
|
+
requireVariant(family, 700, 'normal', `${prefix} (blockquote) fontWeight:700`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// code.fontFamily already validated against loadedFamilies in validateElement
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=fonts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fonts.js","sourceRoot":"","sources":["../../src/validate/fonts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* validate/helpers.ts — Pure helpers + shared regex + ValidationContext type.
|
|
3
|
+
* Extracted from src/validate.ts during the v1.4.0 god-file split (#11a).
|
|
4
|
+
* No behavior changes — every error code, message, and order preserved.
|
|
5
|
+
*/
|
|
6
|
+
import type { FontSpec, RenderOptions } from '../types.js';
|
|
7
|
+
export declare const MAX_VALIDATION_DEPTH = 32;
|
|
8
|
+
/**
|
|
9
|
+
* ValidationContext — threaded through every element validator.
|
|
10
|
+
*
|
|
11
|
+
* Replaces the free-floating module-level closures that previously lived
|
|
12
|
+
* inside validate()'s function body. Created once at the top of validate()
|
|
13
|
+
* so concurrent validate() calls on a multi-document server cannot share
|
|
14
|
+
* state (see withCycleGuard docblock for the race-condition rationale).
|
|
15
|
+
*/
|
|
16
|
+
export interface ValidationContext {
|
|
17
|
+
/** Strict-mode accumulator for unknown-property errors */
|
|
18
|
+
errors: string[];
|
|
19
|
+
/** Whether strict validation is active for this call */
|
|
20
|
+
strict: boolean;
|
|
21
|
+
/** Loaded font families (bundled + doc.fonts), used by element validators */
|
|
22
|
+
loadedFamilies: Set<string>;
|
|
23
|
+
/** Per-call cycle-detection set — MUST NOT be shared across validate() calls */
|
|
24
|
+
seen: WeakSet<object>;
|
|
25
|
+
/** Original RenderOptions, used for plugin lookups in the default switch arm */
|
|
26
|
+
options?: RenderOptions | undefined;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Cycle/depth guard for recursive validation.
|
|
30
|
+
*
|
|
31
|
+
* The `seen` WeakSet MUST be created per top-level validate() call and threaded
|
|
32
|
+
* through the recursion. A module-scoped WeakSet would race under concurrent
|
|
33
|
+
* validate() calls on a multi-document server: two parallel calls touching the
|
|
34
|
+
* same node reference would see each other's "in progress" mark and throw a
|
|
35
|
+
* false-positive cyclic-reference error.
|
|
36
|
+
*/
|
|
37
|
+
export declare function withCycleGuard<T extends object>(seen: WeakSet<object>, node: T, depth: number, path: string, fn: () => void): void;
|
|
38
|
+
/**
|
|
39
|
+
* Lightweight depth-only check used at the top of validateElement so the
|
|
40
|
+
* MAX_VALIDATION_DEPTH = 32 cap fires even when entering elements whose
|
|
41
|
+
* recursive validator does not itself open a withCycleGuard scope (e.g. an
|
|
42
|
+
* unrecognised plugin element). The full cycle/depth guard is still applied
|
|
43
|
+
* by the inner withCycleGuard calls for container elements.
|
|
44
|
+
*/
|
|
45
|
+
export declare function assertDepthOk(depth: number, path: string): void;
|
|
46
|
+
/**
|
|
47
|
+
* RTL strong bidi characters — Bidi_Class=R or AL per UAX #9.
|
|
48
|
+
* See src/validate.ts (pre-split) for full block list. Range preserved bit-exact.
|
|
49
|
+
*/
|
|
50
|
+
export declare const RTL_REGEX: RegExp;
|
|
51
|
+
/** Valid 6-digit hex color */
|
|
52
|
+
export declare const HEX_COLOR_REGEX: RegExp;
|
|
53
|
+
/** Allowed URL schemes for hyperlinks — blocks javascript:, data:, vbscript: */
|
|
54
|
+
export declare const SAFE_URL_SCHEME: RegExp;
|
|
55
|
+
/** BCP47 language tag pattern for hyphenation.language — prevents dynamic-import path injection */
|
|
56
|
+
export declare const LANGUAGE_TAG_REGEX: RegExp;
|
|
57
|
+
/** Valid column width: positive number OR '2*', '*', '1.5*' format */
|
|
58
|
+
export declare const STAR_WIDTH_REGEX: RegExp;
|
|
59
|
+
/** Families always available without explicit doc.fonts entry */
|
|
60
|
+
export declare const BUNDLED_FAMILIES: Set<string>;
|
|
61
|
+
/** Font variants (family-weight-style) always available without explicit doc.fonts entry */
|
|
62
|
+
export declare const BUNDLED_VARIANTS: Set<string>;
|
|
63
|
+
/** Accumulate unknown property errors for an object */
|
|
64
|
+
export declare function assertUnknownProps(obj: unknown, allowed: Set<string>, path: string, errors: string[]): void;
|
|
65
|
+
/** Format accumulated errors into a single message (cap at 20 errors) */
|
|
66
|
+
export declare function formatErrors(errors: string[]): string;
|
|
67
|
+
/** Returns true if the string looks like a URL (scheme://... or a known scheme prefix) */
|
|
68
|
+
export declare function looksLikeUrl(src: string): boolean;
|
|
69
|
+
/** Validate a hyperlink URL — throws VALIDATION_ERROR for unsafe schemes */
|
|
70
|
+
export declare function validateUrl(url: string, prefix: string): void;
|
|
71
|
+
/** Validate a metadata string field — rejects control chars and enforces length */
|
|
72
|
+
export declare function validateMetadataString(value: string, fieldName: string): void;
|
|
73
|
+
/** Validate a single FontSpec entry from doc.fonts */
|
|
74
|
+
export declare function validateFontSpec(font: FontSpec): void;
|
|
75
|
+
export type { RenderOptions };
|
|
76
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/validate/helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAI1D,eAAO,MAAM,oBAAoB,KAAK,CAAA;AAEtC;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC,0DAA0D;IAC1D,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,wDAAwD;IACxD,MAAM,EAAE,OAAO,CAAA;IACf,6EAA6E;IAC7E,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC3B,gFAAgF;IAChF,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IACrB,gFAAgF;IAChF,OAAO,CAAC,EAAE,aAAa,GAAG,SAAS,CAAA;CACpC;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,EAC7C,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,EACrB,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,IAAI,GACb,IAAI,CASN;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAI/D;AAED;;;GAGG;AACH,eAAO,MAAM,SAAS,QAAyJ,CAAA;AAE/K,8BAA8B;AAC9B,eAAO,MAAM,eAAe,QAAsB,CAAA;AAElD,gFAAgF;AAChF,eAAO,MAAM,eAAe,QAA4B,CAAA;AAExD,mGAAmG;AACnG,eAAO,MAAM,kBAAkB,QAAwC,CAAA;AAEvE,sEAAsE;AACtE,eAAO,MAAM,gBAAgB,QAAqB,CAAA;AAElD,iEAAiE;AACjE,eAAO,MAAM,gBAAgB,aAAqB,CAAA;AAElD,4FAA4F;AAC5F,eAAO,MAAM,gBAAgB,aAA4F,CAAA;AAqCzH,uDAAuD;AACvD,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,EACpB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EAAE,GACf,IAAI,CAUN;AAED,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAMrD;AAOD,0FAA0F;AAC1F,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAKjD;AAED,4EAA4E;AAC5E,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAO7D;AAED,mFAAmF;AACnF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAO7E;AAED,sDAAsD;AACtD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAuBrD;AAGD,YAAY,EAAE,aAAa,EAAE,CAAA"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { PretextPdfError } from '../errors.js';
|
|
2
|
+
// ── Cycle Detection & Depth Guards ─────────────────────────────────────────
|
|
3
|
+
export const MAX_VALIDATION_DEPTH = 32;
|
|
4
|
+
/**
|
|
5
|
+
* Cycle/depth guard for recursive validation.
|
|
6
|
+
*
|
|
7
|
+
* The `seen` WeakSet MUST be created per top-level validate() call and threaded
|
|
8
|
+
* through the recursion. A module-scoped WeakSet would race under concurrent
|
|
9
|
+
* validate() calls on a multi-document server: two parallel calls touching the
|
|
10
|
+
* same node reference would see each other's "in progress" mark and throw a
|
|
11
|
+
* false-positive cyclic-reference error.
|
|
12
|
+
*/
|
|
13
|
+
export function withCycleGuard(seen, node, depth, path, fn) {
|
|
14
|
+
if (depth > MAX_VALIDATION_DEPTH) {
|
|
15
|
+
throw new PretextPdfError('VALIDATION_ERROR', `${path}: nesting depth exceeds ${MAX_VALIDATION_DEPTH}`);
|
|
16
|
+
}
|
|
17
|
+
if (seen.has(node)) {
|
|
18
|
+
throw new PretextPdfError('VALIDATION_ERROR', `${path}: cyclic reference detected`);
|
|
19
|
+
}
|
|
20
|
+
seen.add(node);
|
|
21
|
+
try {
|
|
22
|
+
fn();
|
|
23
|
+
}
|
|
24
|
+
finally {
|
|
25
|
+
seen.delete(node);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Lightweight depth-only check used at the top of validateElement so the
|
|
30
|
+
* MAX_VALIDATION_DEPTH = 32 cap fires even when entering elements whose
|
|
31
|
+
* recursive validator does not itself open a withCycleGuard scope (e.g. an
|
|
32
|
+
* unrecognised plugin element). The full cycle/depth guard is still applied
|
|
33
|
+
* by the inner withCycleGuard calls for container elements.
|
|
34
|
+
*/
|
|
35
|
+
export function assertDepthOk(depth, path) {
|
|
36
|
+
if (depth > MAX_VALIDATION_DEPTH) {
|
|
37
|
+
throw new PretextPdfError('VALIDATION_ERROR', `${path}: nesting depth exceeds ${MAX_VALIDATION_DEPTH}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* RTL strong bidi characters — Bidi_Class=R or AL per UAX #9.
|
|
42
|
+
* See src/validate.ts (pre-split) for full block list. Range preserved bit-exact.
|
|
43
|
+
*/
|
|
44
|
+
export const RTL_REGEX = /[-ࣿיִ-ﭏﭐ-﷿ﹰ-\u{10800}-\u{10CFF}\u{10D00}-\u{10D3F}\u{10E80}-\u{10EFF}\u{10F30}-\u{10FFF}\u{1E800}-\u{1E95F}\u{1EC70}-\u{1ECBF}\u{1EE00}-\u{1EEFF}]/u;
|
|
45
|
+
/** Valid 6-digit hex color */
|
|
46
|
+
export const HEX_COLOR_REGEX = /^#[0-9A-Fa-f]{6}$/;
|
|
47
|
+
/** Allowed URL schemes for hyperlinks — blocks javascript:, data:, vbscript: */
|
|
48
|
+
export const SAFE_URL_SCHEME = /^(https?|mailto|ftp|#)/i;
|
|
49
|
+
/** BCP47 language tag pattern for hyphenation.language — prevents dynamic-import path injection */
|
|
50
|
+
export const LANGUAGE_TAG_REGEX = /^[a-zA-Z]{2,8}(-[a-zA-Z0-9]{2,8})*$/;
|
|
51
|
+
/** Valid column width: positive number OR '2*', '*', '1.5*' format */
|
|
52
|
+
export const STAR_WIDTH_REGEX = /^(\d*\.?\d+)?\*$/;
|
|
53
|
+
/** Families always available without explicit doc.fonts entry */
|
|
54
|
+
export const BUNDLED_FAMILIES = new Set(['Inter']);
|
|
55
|
+
/** Font variants (family-weight-style) always available without explicit doc.fonts entry */
|
|
56
|
+
export const BUNDLED_VARIANTS = new Set(['Inter-400-normal', 'Inter-700-normal', 'Inter-400-italic', 'Inter-700-italic']);
|
|
57
|
+
/** Levenshtein distance, returns 999 if result would exceed 2 */
|
|
58
|
+
function levenshteinDist(a, b) {
|
|
59
|
+
if (a === b)
|
|
60
|
+
return 0;
|
|
61
|
+
if (Math.abs(a.length - b.length) > 2)
|
|
62
|
+
return 999;
|
|
63
|
+
const m = a.length;
|
|
64
|
+
const n = b.length;
|
|
65
|
+
const prev = Array(n + 1)
|
|
66
|
+
.fill(0)
|
|
67
|
+
.map((_, j) => j);
|
|
68
|
+
const curr = Array(n + 1).fill(0);
|
|
69
|
+
for (let i = 1; i <= m; i++) {
|
|
70
|
+
curr[0] = i;
|
|
71
|
+
for (let j = 1; j <= n; j++) {
|
|
72
|
+
const cost = a[i - 1] === b[j - 1] ? 0 : 1;
|
|
73
|
+
curr[j] = Math.min(prev[j] + 1, curr[j - 1] + 1, prev[j - 1] + cost);
|
|
74
|
+
}
|
|
75
|
+
for (let j = 0; j <= n; j++)
|
|
76
|
+
prev[j] = curr[j];
|
|
77
|
+
}
|
|
78
|
+
return prev[n] > 2 ? 999 : prev[n];
|
|
79
|
+
}
|
|
80
|
+
/** Find closest match with edit distance <= 2 */
|
|
81
|
+
function closestMatch(prop, allowed) {
|
|
82
|
+
let best = null;
|
|
83
|
+
let bestDist = 999;
|
|
84
|
+
for (const candidate of allowed) {
|
|
85
|
+
const d = levenshteinDist(prop, candidate);
|
|
86
|
+
if (d > 0 && d <= 2 && d < bestDist) {
|
|
87
|
+
best = candidate;
|
|
88
|
+
bestDist = d;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return best;
|
|
92
|
+
}
|
|
93
|
+
/** Accumulate unknown property errors for an object */
|
|
94
|
+
export function assertUnknownProps(obj, allowed, path, errors) {
|
|
95
|
+
// Type guard first — narrows `obj` to a non-null object below.
|
|
96
|
+
if (obj === null || typeof obj !== 'object' || Array.isArray(obj))
|
|
97
|
+
return;
|
|
98
|
+
for (const key of Object.keys(obj)) {
|
|
99
|
+
if (!allowed.has(key)) {
|
|
100
|
+
const suggestion = closestMatch(key, allowed);
|
|
101
|
+
const hint = suggestion ? `; did you mean "${suggestion}"` : '';
|
|
102
|
+
errors.push(`${path}.${key}: unknown property${hint}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/** Format accumulated errors into a single message (cap at 20 errors) */
|
|
107
|
+
export function formatErrors(errors) {
|
|
108
|
+
if (errors.length === 0)
|
|
109
|
+
return '';
|
|
110
|
+
const header = `Strict validation failed (${errors.length} issue${errors.length === 1 ? '' : 's'}):\n`;
|
|
111
|
+
const msgs = errors.slice(0, 20);
|
|
112
|
+
const suffix = errors.length > 20 ? `\n... and ${errors.length - 20} more error(s)` : '';
|
|
113
|
+
return header + msgs.join('\n') + suffix;
|
|
114
|
+
}
|
|
115
|
+
// URL-shaped detection used by validators that accept either a file path
|
|
116
|
+
// or a remote URL (image src, watermark image). Matches the runtime SSRF
|
|
117
|
+
// guard's posture so validate-only callers catch unsafe schemes pre-render.
|
|
118
|
+
const URL_LIKE_PREFIXES = ['data:', 'javascript:', 'vbscript:', 'blob:', 'about:', 'file:'];
|
|
119
|
+
/** Returns true if the string looks like a URL (scheme://... or a known scheme prefix) */
|
|
120
|
+
export function looksLikeUrl(src) {
|
|
121
|
+
const lc = src.toLowerCase();
|
|
122
|
+
if (URL_LIKE_PREFIXES.some(p => lc.startsWith(p)))
|
|
123
|
+
return true;
|
|
124
|
+
// Generic scheme test: any `scheme://...` form (http, https, ftp, gopher, …)
|
|
125
|
+
return /^[a-z][a-z0-9+.-]*:\/\//.test(lc);
|
|
126
|
+
}
|
|
127
|
+
/** Validate a hyperlink URL — throws VALIDATION_ERROR for unsafe schemes */
|
|
128
|
+
export function validateUrl(url, prefix) {
|
|
129
|
+
if (!SAFE_URL_SCHEME.test(url)) {
|
|
130
|
+
throw new PretextPdfError('VALIDATION_ERROR', `${prefix}: URL scheme not allowed — only http, https, mailto, ftp, and anchor (#) links are permitted. Got: "${url.slice(0, 60)}"`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/** Validate a metadata string field — rejects control chars and enforces length */
|
|
134
|
+
export function validateMetadataString(value, fieldName) {
|
|
135
|
+
if (value.length > 1000) {
|
|
136
|
+
throw new PretextPdfError('VALIDATION_ERROR', `metadata.${fieldName} must not exceed 1000 characters`);
|
|
137
|
+
}
|
|
138
|
+
if (/[\x00\r\n]/.test(value)) {
|
|
139
|
+
throw new PretextPdfError('VALIDATION_ERROR', `metadata.${fieldName} must not contain null bytes or newline characters`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/** Validate a single FontSpec entry from doc.fonts */
|
|
143
|
+
export function validateFontSpec(font) {
|
|
144
|
+
if (!font.family || typeof font.family !== 'string') {
|
|
145
|
+
throw new PretextPdfError('VALIDATION_ERROR', `FontSpec: 'family' must be a non-empty string`);
|
|
146
|
+
}
|
|
147
|
+
if (font.weight !== undefined && ![400, 700].includes(font.weight)) {
|
|
148
|
+
throw new PretextPdfError('VALIDATION_ERROR', `FontSpec '${font.family}': 'weight' must be 400 or 700`);
|
|
149
|
+
}
|
|
150
|
+
if (font.style !== undefined && !['normal', 'italic'].includes(font.style)) {
|
|
151
|
+
throw new PretextPdfError('VALIDATION_ERROR', `FontSpec '${font.family}': 'style' must be 'normal' or 'italic'`);
|
|
152
|
+
}
|
|
153
|
+
if (font.src === undefined || font.src === null) {
|
|
154
|
+
throw new PretextPdfError('VALIDATION_ERROR', `FontSpec '${font.family}': 'src' is required (file path or Uint8Array)`);
|
|
155
|
+
}
|
|
156
|
+
// If src is a string, ensure it's not a dangerous URL — only 'bundled' or file paths allowed
|
|
157
|
+
if (typeof font.src === 'string' && font.src !== 'bundled') {
|
|
158
|
+
try {
|
|
159
|
+
const parsed = new URL(font.src);
|
|
160
|
+
throw new PretextPdfError('VALIDATION_ERROR', `FontSpec '${font.family}': 'src' contains a URL (${parsed.protocol}) — use 'bundled', a file path, or Uint8Array instead`);
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
// new URL() throws if string is not a valid URL, which is expected for file paths
|
|
164
|
+
if (err instanceof PretextPdfError)
|
|
165
|
+
throw err;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/validate/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* validate/index.ts — Orchestrator + public validate() / validateDocument().
|
|
3
|
+
*
|
|
4
|
+
* Top-level orchestration: plugin pre-flight, doc-shape guards, memory caps,
|
|
5
|
+
* ValidationContext construction, document-level check dispatch (delegated to
|
|
6
|
+
* ./document.ts), per-element dispatch (delegated to ./elements/*), footnote
|
|
7
|
+
* cross-validation, and the strict-error flush. Every error code/message is
|
|
8
|
+
* preserved bit-exact from the pre-split src/validate.ts.
|
|
9
|
+
*
|
|
10
|
+
* Extracted in v1.4.0 #11a — the original src/validate.ts was 1834 lines and
|
|
11
|
+
* is now a thin re-export barrel pointing here. In v1.5.0 item A the inline
|
|
12
|
+
* document-level checks (pageSize, margins, fonts, header/footer,
|
|
13
|
+
* defaultParagraphStyle, sections, watermark, encryption, signature,
|
|
14
|
+
* bookmarks, hyphenation, metadata) were extracted into ./document.ts.
|
|
15
|
+
*/
|
|
16
|
+
import type { PdfDocument, RenderOptions, ValidationResult, Logger } from '../types.js';
|
|
17
|
+
/**
|
|
18
|
+
* Validate a PdfDocument and throw a {@link PretextPdfError} if any errors are found.
|
|
19
|
+
* @public
|
|
20
|
+
*/
|
|
21
|
+
export declare function validate(doc: PdfDocument, options?: RenderOptions): void;
|
|
22
|
+
/**
|
|
23
|
+
* Validate a pretext-pdf document and return a structured result instead of throwing.
|
|
24
|
+
*
|
|
25
|
+
* Use this when you want to inspect all validation errors programmatically.
|
|
26
|
+
* The existing {@link validate} function throws on first error and is unchanged.
|
|
27
|
+
*
|
|
28
|
+
* @param doc - The document to validate (typed as `unknown` to accept unverified input)
|
|
29
|
+
* @param options - `{ strict?: boolean; logger?: Logger }` — strict defaults to false (matches render() behavior); logger routes diagnostic warnings away from console.warn
|
|
30
|
+
* @returns {@link ValidationResult} with `valid`, `errors[]`, and `errorCount`
|
|
31
|
+
* @public
|
|
32
|
+
*/
|
|
33
|
+
export declare function validateDocument(doc: unknown, options?: {
|
|
34
|
+
strict?: boolean;
|
|
35
|
+
logger?: Logger;
|
|
36
|
+
}): ValidationResult;
|
|
37
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validate/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EACV,WAAW,EAEX,aAAa,EACb,gBAAgB,EAChB,MAAM,EACP,MAAM,aAAa,CAAA;AA6CpB;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,CA+HxE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,OAAO,EACZ,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9C,gBAAgB,CAmBlB"}
|