@t4h.framework/pdf 0.0.0-experimental-20260907052843
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/.ai/skills/framework-pdf/SKILL.md +353 -0
- package/CHANGELOG.md +35 -0
- package/README.md +175 -0
- package/dist/activities/RenderPDFActivity.d.ts +26 -0
- package/dist/activities/RenderPDFActivity.d.ts.map +1 -0
- package/dist/activities/RenderPDFActivity.js +35 -0
- package/dist/activities/RenderPDFActivity.js.map +1 -0
- package/dist/components.d.ts +50 -0
- package/dist/components.d.ts.map +1 -0
- package/dist/components.js +41 -0
- package/dist/components.js.map +1 -0
- package/dist/helpers/document-to-element.d.ts +5 -0
- package/dist/helpers/document-to-element.d.ts.map +1 -0
- package/dist/helpers/document-to-element.js +52 -0
- package/dist/helpers/document-to-element.js.map +1 -0
- package/dist/helpers/element-to-document.d.ts +4 -0
- package/dist/helpers/element-to-document.d.ts.map +1 -0
- package/dist/helpers/element-to-document.js +135 -0
- package/dist/helpers/element-to-document.js.map +1 -0
- package/dist/helpers/register-fonts.d.ts +14 -0
- package/dist/helpers/register-fonts.d.ts.map +1 -0
- package/dist/helpers/register-fonts.js +40 -0
- package/dist/helpers/register-fonts.js.map +1 -0
- package/dist/pdf.d.ts +5 -0
- package/dist/pdf.d.ts.map +1 -0
- package/dist/pdf.js +5 -0
- package/dist/pdf.js.map +1 -0
- package/dist/tools/encrypt-pdf.d.ts +25 -0
- package/dist/tools/encrypt-pdf.d.ts.map +1 -0
- package/dist/tools/encrypt-pdf.js +42 -0
- package/dist/tools/encrypt-pdf.js.map +1 -0
- package/dist/typings/pdf.d.ts +85 -0
- package/dist/typings/pdf.d.ts.map +1 -0
- package/dist/typings/pdf.js +2 -0
- package/dist/typings/pdf.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { Binary } from '@t4h.framework/core';
|
|
2
|
+
import type { ReactElement, ReactNode } from 'react';
|
|
3
|
+
import type { DocumentNode, NodeProps, PageNode } from './typings/pdf.js';
|
|
4
|
+
export type DocumentProps = NonNullable<DocumentNode['props']> & {
|
|
5
|
+
children?: ReactNode;
|
|
6
|
+
};
|
|
7
|
+
export type PageProps = NonNullable<PageNode['props']> & {
|
|
8
|
+
children?: ReactNode;
|
|
9
|
+
};
|
|
10
|
+
export type ViewProps = NodeProps & {
|
|
11
|
+
children?: ReactNode;
|
|
12
|
+
};
|
|
13
|
+
export type TextProps = NodeProps & {
|
|
14
|
+
children?: ReactNode;
|
|
15
|
+
};
|
|
16
|
+
export type LinkProps = NodeProps & {
|
|
17
|
+
href: string;
|
|
18
|
+
children?: ReactNode;
|
|
19
|
+
};
|
|
20
|
+
export type ImageProps = NodeProps & {
|
|
21
|
+
src: string | Binary;
|
|
22
|
+
};
|
|
23
|
+
export type PageNumberProps = NodeProps & {
|
|
24
|
+
/**
|
|
25
|
+
* May reference `{pageNumber}` and `{totalPages}`. Defaults to
|
|
26
|
+
* `'{pageNumber}'`.
|
|
27
|
+
*/
|
|
28
|
+
format?: string;
|
|
29
|
+
};
|
|
30
|
+
/** Root of a PDF. Children must be {@link Page} elements. */
|
|
31
|
+
export declare function Document(props: DocumentProps): ReactElement;
|
|
32
|
+
/** A page. Content overflowing the page height paginates automatically. */
|
|
33
|
+
export declare function Page(props: PageProps): ReactElement;
|
|
34
|
+
/** A flex container, analogous to a `<div>`. */
|
|
35
|
+
export declare function View(props: ViewProps): ReactElement;
|
|
36
|
+
/** Text content. All raw strings must live inside a {@link Text}. */
|
|
37
|
+
export declare function Text(props: TextProps): ReactElement;
|
|
38
|
+
/** A hyperlink. */
|
|
39
|
+
export declare function Link(props: LinkProps): ReactElement;
|
|
40
|
+
/**
|
|
41
|
+
* An image. `src` may be a URL, a `data:image/...;base64,` URI, or a
|
|
42
|
+
* {@link Binary} whose `contentType` is an image type.
|
|
43
|
+
*/
|
|
44
|
+
export declare function Image(props: ImageProps): ReactElement;
|
|
45
|
+
/**
|
|
46
|
+
* Text resolved to the current page number at layout time. Combine with
|
|
47
|
+
* `fixed` for running footers.
|
|
48
|
+
*/
|
|
49
|
+
export declare function PageNumber(props: PageNumberProps): ReactElement;
|
|
50
|
+
//# sourceMappingURL=components.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../src/components.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAEzE,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG;IAC/D,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG;IACvD,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG;IAAE,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,CAAA;AAE5D,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG;IAAE,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,CAAA;AAE5D,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,CAAA;AAE1E,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG;IAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAAA;AAE7D,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG;IACxC;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAWD,6DAA6D;AAC7D,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,YAAY,CAE3D;AAED,2EAA2E;AAC3E,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,YAAY,CAEnD;AAED,gDAAgD;AAChD,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,YAAY,CAEnD;AAED,qEAAqE;AACrE,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,YAAY,CAEnD;AAED,mBAAmB;AACnB,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,YAAY,CAEnD;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,CAErD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,YAAY,CAE/D"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
function marker(name) {
|
|
2
|
+
throw new Error(`<${name}> is a PDF marker component — it only exists inside a document ` +
|
|
3
|
+
'tree passed to render() and cannot be invoked as a regular component');
|
|
4
|
+
}
|
|
5
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
6
|
+
/** Root of a PDF. Children must be {@link Page} elements. */
|
|
7
|
+
export function Document(props) {
|
|
8
|
+
marker('Document');
|
|
9
|
+
}
|
|
10
|
+
/** A page. Content overflowing the page height paginates automatically. */
|
|
11
|
+
export function Page(props) {
|
|
12
|
+
marker('Page');
|
|
13
|
+
}
|
|
14
|
+
/** A flex container, analogous to a `<div>`. */
|
|
15
|
+
export function View(props) {
|
|
16
|
+
marker('View');
|
|
17
|
+
}
|
|
18
|
+
/** Text content. All raw strings must live inside a {@link Text}. */
|
|
19
|
+
export function Text(props) {
|
|
20
|
+
marker('Text');
|
|
21
|
+
}
|
|
22
|
+
/** A hyperlink. */
|
|
23
|
+
export function Link(props) {
|
|
24
|
+
marker('Link');
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* An image. `src` may be a URL, a `data:image/...;base64,` URI, or a
|
|
28
|
+
* {@link Binary} whose `contentType` is an image type.
|
|
29
|
+
*/
|
|
30
|
+
export function Image(props) {
|
|
31
|
+
marker('Image');
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Text resolved to the current page number at layout time. Combine with
|
|
35
|
+
* `fixed` for running footers.
|
|
36
|
+
*/
|
|
37
|
+
export function PageNumber(props) {
|
|
38
|
+
marker('PageNumber');
|
|
39
|
+
}
|
|
40
|
+
/* eslint-enable @typescript-eslint/no-unused-vars */
|
|
41
|
+
//# sourceMappingURL=components.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"components.js","sourceRoot":"","sources":["../src/components.ts"],"names":[],"mappings":"AA6BA,SAAS,MAAM,CAAC,IAAY;IAC1B,MAAM,IAAI,KAAK,CACb,IAAI,IAAI,iEAAiE;QACvE,sEAAsE,CACzE,CAAA;AACH,CAAC;AAED,sDAAsD;AAEtD,6DAA6D;AAC7D,MAAM,UAAU,QAAQ,CAAC,KAAoB;IAC3C,MAAM,CAAC,UAAU,CAAC,CAAA;AACpB,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,IAAI,CAAC,KAAgB;IACnC,MAAM,CAAC,MAAM,CAAC,CAAA;AAChB,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,IAAI,CAAC,KAAgB;IACnC,MAAM,CAAC,MAAM,CAAC,CAAA;AAChB,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,IAAI,CAAC,KAAgB;IACnC,MAAM,CAAC,MAAM,CAAC,CAAA;AAChB,CAAC;AAED,mBAAmB;AACnB,MAAM,UAAU,IAAI,CAAC,KAAgB;IACnC,MAAM,CAAC,MAAM,CAAC,CAAA;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,KAAK,CAAC,KAAiB;IACrC,MAAM,CAAC,OAAO,CAAC,CAAA;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,CAAC,YAAY,CAAC,CAAA;AACtB,CAAC;AAED,qDAAqD"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Document } from '@react-pdf/renderer';
|
|
2
|
+
import { type ComponentProps, type ReactElement } from 'react';
|
|
3
|
+
import type { DocumentNode } from '../typings/pdf.js';
|
|
4
|
+
export declare function documentToElement(document: DocumentNode): Promise<ReactElement<ComponentProps<typeof Document>>>;
|
|
5
|
+
//# sourceMappingURL=document-to-element.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-to-element.d.ts","sourceRoot":"","sources":["../../src/helpers/document-to-element.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAiC,MAAM,qBAAqB,CAAA;AAE7E,OAAO,EAAiB,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,OAAO,CAAA;AAE7E,OAAO,KAAK,EACV,YAAY,EAIb,MAAM,mBAAmB,CAAA;AAyF1B,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAMxD"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { buffer } from 'node:stream/consumers';
|
|
2
|
+
import { Document, Image, Link, Page, Text, View } from '@react-pdf/renderer';
|
|
3
|
+
import { createElement } from 'react';
|
|
4
|
+
async function resolveImageSrc(src) {
|
|
5
|
+
if (typeof src === 'string')
|
|
6
|
+
return src;
|
|
7
|
+
const data = await buffer(await src.stream());
|
|
8
|
+
return `data:${src.contentType};base64,${data.toString('base64')}`;
|
|
9
|
+
}
|
|
10
|
+
async function toTextChildren(children) {
|
|
11
|
+
if (children === undefined)
|
|
12
|
+
return [];
|
|
13
|
+
if (typeof children === 'string')
|
|
14
|
+
return [children];
|
|
15
|
+
return Promise.all(children.map(child => typeof child === 'string' ? child : nodeToElement(child)));
|
|
16
|
+
}
|
|
17
|
+
const DEFAULT_PAGE_NUMBER_FORMAT = '{pageNumber}';
|
|
18
|
+
async function nodeToElement(node) {
|
|
19
|
+
switch (node.type) {
|
|
20
|
+
case 'view':
|
|
21
|
+
return createElement(View, { ...node.props }, ...(await Promise.all((node.children ?? []).map(nodeToElement))));
|
|
22
|
+
case 'text':
|
|
23
|
+
return createElement(Text, { ...node.props }, ...(await toTextChildren(node.children)));
|
|
24
|
+
case 'link': {
|
|
25
|
+
const { href, ...props } = node.props;
|
|
26
|
+
return createElement(Link, { ...props, src: href }, ...(await toTextChildren(node.children)));
|
|
27
|
+
}
|
|
28
|
+
case 'image': {
|
|
29
|
+
const { src, ...props } = node.props;
|
|
30
|
+
return createElement(Image, {
|
|
31
|
+
...props,
|
|
32
|
+
src: await resolveImageSrc(src),
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
case 'page-number': {
|
|
36
|
+
const { format = DEFAULT_PAGE_NUMBER_FORMAT, ...props } = node.props ?? {};
|
|
37
|
+
return createElement(Text, {
|
|
38
|
+
...props,
|
|
39
|
+
render: ({ pageNumber, totalPages, }) => format
|
|
40
|
+
.replaceAll('{pageNumber}', String(pageNumber))
|
|
41
|
+
.replaceAll('{totalPages}', String(totalPages ?? '')),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async function pageToElement(page) {
|
|
47
|
+
return createElement(Page, { ...page.props }, ...(await Promise.all((page.children ?? []).map(nodeToElement))));
|
|
48
|
+
}
|
|
49
|
+
export async function documentToElement(document) {
|
|
50
|
+
return createElement(Document, { ...document.props }, ...(await Promise.all(document.children.map(pageToElement))));
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=document-to-element.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-to-element.js","sourceRoot":"","sources":["../../src/helpers/document-to-element.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"element-to-document.d.ts","sourceRoot":"","sources":["../../src/helpers/element-to-document.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,YAAY,EAAkB,MAAM,OAAO,CAAA;AAWnE,OAAO,KAAK,EACV,YAAY,EAMb,MAAM,WAAW,CAAA;AA8JlB,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,YAAY,GAAG,YAAY,CA0BrE"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { Fragment } from 'react';
|
|
2
|
+
import { Document, Image, Link, Page, PageNumber, Text, View, } from '../components.js';
|
|
3
|
+
const MARKERS = new Set([
|
|
4
|
+
Document,
|
|
5
|
+
Page,
|
|
6
|
+
View,
|
|
7
|
+
Text,
|
|
8
|
+
Link,
|
|
9
|
+
Image,
|
|
10
|
+
PageNumber,
|
|
11
|
+
]);
|
|
12
|
+
function isElement(node) {
|
|
13
|
+
return (typeof node === 'object' &&
|
|
14
|
+
node !== null &&
|
|
15
|
+
'type' in node &&
|
|
16
|
+
'props' in node);
|
|
17
|
+
}
|
|
18
|
+
function resolveChildren(node) {
|
|
19
|
+
const resolved = [];
|
|
20
|
+
const visit = (child) => {
|
|
21
|
+
if (child === null || child === undefined || typeof child === 'boolean')
|
|
22
|
+
return;
|
|
23
|
+
if (typeof child === 'string') {
|
|
24
|
+
resolved.push(child);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (typeof child === 'number' || typeof child === 'bigint') {
|
|
28
|
+
resolved.push(String(child));
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (Array.isArray(child))
|
|
32
|
+
return child.forEach(item => visit(item));
|
|
33
|
+
if (isElement(child)) {
|
|
34
|
+
if (child.type === Fragment) {
|
|
35
|
+
visit(child.props.children);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (typeof child.type === 'function' && !MARKERS.has(child.type)) {
|
|
39
|
+
visit(child.type(child.props));
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
resolved.push(child);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
throw new TypeError('Unsupported node');
|
|
46
|
+
};
|
|
47
|
+
visit(node);
|
|
48
|
+
return resolved;
|
|
49
|
+
}
|
|
50
|
+
function toTextChildren(children) {
|
|
51
|
+
return resolveChildren(children).map((child) => {
|
|
52
|
+
if (typeof child === 'string')
|
|
53
|
+
return child;
|
|
54
|
+
const node = toPDFNode(child);
|
|
55
|
+
if (node.type === 'text')
|
|
56
|
+
return node;
|
|
57
|
+
if (node.type === 'link')
|
|
58
|
+
return node;
|
|
59
|
+
if (node.type === 'page-number')
|
|
60
|
+
return node;
|
|
61
|
+
throw new TypeError(`<${nameOf(child)}> is not allowed inside <Text>`);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
function nameOf(element) {
|
|
65
|
+
return typeof element.type === 'function'
|
|
66
|
+
? element.type.name
|
|
67
|
+
: String(element.type);
|
|
68
|
+
}
|
|
69
|
+
function toPDFNode(element) {
|
|
70
|
+
const { children, ...props } = element.props;
|
|
71
|
+
switch (element.type) {
|
|
72
|
+
case View:
|
|
73
|
+
return {
|
|
74
|
+
type: 'view',
|
|
75
|
+
props,
|
|
76
|
+
children: resolveChildren(children).map(child => {
|
|
77
|
+
if (typeof child === 'string')
|
|
78
|
+
throw new TypeError(`Raw text ${JSON.stringify(child)} must be wrapped in <Text>`);
|
|
79
|
+
return toPDFNode(child);
|
|
80
|
+
}),
|
|
81
|
+
};
|
|
82
|
+
case Text:
|
|
83
|
+
return {
|
|
84
|
+
type: 'text',
|
|
85
|
+
props,
|
|
86
|
+
children: toTextChildren(children),
|
|
87
|
+
};
|
|
88
|
+
case Link:
|
|
89
|
+
return {
|
|
90
|
+
type: 'link',
|
|
91
|
+
props: props,
|
|
92
|
+
children: toTextChildren(children),
|
|
93
|
+
};
|
|
94
|
+
case Image:
|
|
95
|
+
return { type: 'image', props };
|
|
96
|
+
case PageNumber:
|
|
97
|
+
return { type: 'page-number', props };
|
|
98
|
+
default:
|
|
99
|
+
throw new TypeError(`<${nameOf(element)}> is not allowed inside a <Page>`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function toPageNode(element) {
|
|
103
|
+
if (element.type !== Page)
|
|
104
|
+
throw new TypeError(`<Document> children must be <Page> elements, got <${nameOf(element)}>`);
|
|
105
|
+
const { children, ...props } = element.props;
|
|
106
|
+
return {
|
|
107
|
+
type: 'page',
|
|
108
|
+
props,
|
|
109
|
+
children: resolveChildren(children).map(child => {
|
|
110
|
+
if (typeof child === 'string')
|
|
111
|
+
throw new TypeError(`Raw text ${JSON.stringify(child)} must be wrapped in <Text>`);
|
|
112
|
+
return toPDFNode(child);
|
|
113
|
+
}),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
export function elementToDocument(element) {
|
|
117
|
+
const roots = resolveChildren(element);
|
|
118
|
+
const root = roots[0];
|
|
119
|
+
if (root === undefined ||
|
|
120
|
+
roots.length !== 1 ||
|
|
121
|
+
typeof root === 'string' ||
|
|
122
|
+
root.type !== Document)
|
|
123
|
+
throw new TypeError('The PDF tree must resolve to a single <Document> root');
|
|
124
|
+
const { children, ...props } = root.props;
|
|
125
|
+
return {
|
|
126
|
+
type: 'document',
|
|
127
|
+
props,
|
|
128
|
+
children: resolveChildren(children).map(child => {
|
|
129
|
+
if (typeof child === 'string')
|
|
130
|
+
throw new TypeError('Raw text is not allowed directly inside <Document>');
|
|
131
|
+
return toPageNode(child);
|
|
132
|
+
}),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=element-to-document.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"element-to-document.js","sourceRoot":"","sources":["../../src/helpers/element-to-document.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Binary } from '@t4h.framework/core';
|
|
2
|
+
export type FontWeight = 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;
|
|
3
|
+
export type FontStyle = 'normal' | 'italic';
|
|
4
|
+
export type FontSource = string | Binary;
|
|
5
|
+
export type FontVariant = {
|
|
6
|
+
src: FontSource;
|
|
7
|
+
weight?: FontWeight;
|
|
8
|
+
style?: FontStyle;
|
|
9
|
+
};
|
|
10
|
+
export type Fonts = {
|
|
11
|
+
[name: string]: FontSource | readonly FontVariant[];
|
|
12
|
+
};
|
|
13
|
+
export declare function registerFonts(raw: Fonts): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=register-fonts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-fonts.d.ts","sourceRoot":"","sources":["../../src/helpers/register-fonts.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAE5C,MAAM,MAAM,UAAU,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AAE5E,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAE3C,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,CAAA;AAExC,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,UAAU,CAAA;IACf,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,KAAK,GAAG;IAClB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,WAAW,EAAE,CAAA;CACpD,CAAA;AAQD,wBAAsB,aAAa,CAAC,GAAG,EAAE,KAAK,iBA6C7C"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { buffer } from 'node:stream/consumers';
|
|
2
|
+
import { Font } from '@react-pdf/renderer';
|
|
3
|
+
import { Binary } from '@t4h.framework/core';
|
|
4
|
+
function toDataUrl(data) {
|
|
5
|
+
const bytes = Buffer.isBuffer(data) ? data : Buffer.from(data);
|
|
6
|
+
return `data:font/ttf;base64,${bytes.toString('base64')}`;
|
|
7
|
+
}
|
|
8
|
+
export async function registerFonts(raw) {
|
|
9
|
+
const fonts = await Promise.all(Object.entries(raw ?? {}).flatMap(([name, source]) => {
|
|
10
|
+
const variants = [];
|
|
11
|
+
if (typeof source === 'string' || source instanceof Binary)
|
|
12
|
+
variants.push({ src: source });
|
|
13
|
+
if (Array.isArray(source))
|
|
14
|
+
variants.push(...source);
|
|
15
|
+
return variants.map(async (variant) => {
|
|
16
|
+
const src = typeof variant.src === 'string'
|
|
17
|
+
? variant.src
|
|
18
|
+
: await buffer(await variant.src.stream());
|
|
19
|
+
return {
|
|
20
|
+
name,
|
|
21
|
+
src,
|
|
22
|
+
weight: variant.weight,
|
|
23
|
+
style: variant.style,
|
|
24
|
+
};
|
|
25
|
+
});
|
|
26
|
+
}));
|
|
27
|
+
const families = new Map();
|
|
28
|
+
for (const font of fonts) {
|
|
29
|
+
const variants = families.get(font.name) ?? [];
|
|
30
|
+
variants.push({
|
|
31
|
+
src: typeof font.src === 'string' ? font.src : toDataUrl(font.src),
|
|
32
|
+
fontWeight: font.weight ?? 400,
|
|
33
|
+
fontStyle: font.style ?? 'normal',
|
|
34
|
+
});
|
|
35
|
+
families.set(font.name, variants);
|
|
36
|
+
}
|
|
37
|
+
for (const [family, variants] of families)
|
|
38
|
+
Font.register({ family, fonts: variants });
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=register-fonts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-fonts.js","sourceRoot":"","sources":["../../src/helpers/register-fonts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAE9C,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAkB5C,SAAS,SAAS,CAAC,IAA0B;IAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAE9D,OAAO,wBAAwB,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAA;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAU;IAC5C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC7B,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE;QACnD,MAAM,QAAQ,GAAkB,EAAE,CAAA;QAElC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,YAAY,MAAM;YACxD,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAA;QAEhC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAA;QAEnD,OAAO,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAC,OAAO,EAAC,EAAE;YAClC,MAAM,GAAG,GACP,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ;gBAC7B,CAAC,CAAC,OAAO,CAAC,GAAG;gBACb,CAAC,CAAC,MAAM,MAAM,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;YAE9C,OAAO;gBACL,IAAI;gBACJ,GAAG;gBACH,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,KAAK,EAAE,OAAO,CAAC,KAAK;aACrB,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CACH,CAAA;IAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAGrB,CAAA;IAEH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;QAE9C,QAAQ,CAAC,IAAI,CAAC;YACZ,GAAG,EAAE,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;YAClE,UAAU,EAAE,IAAI,CAAC,MAAM,IAAI,GAAG;YAC9B,SAAS,EAAE,IAAI,CAAC,KAAK,IAAI,QAAQ;SAClC,CAAC,CAAA;QAEF,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IACnC,CAAC;IAED,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,QAAQ;QACvC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAW,CAAC,CAAA;AACvD,CAAC"}
|
package/dist/pdf.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf.d.ts","sourceRoot":"","sources":["../src/pdf.ts"],"names":[],"mappings":"AAAA,cAAc,mCAAmC,CAAA;AACjD,cAAc,iBAAiB,CAAA;AAC/B,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,KAAK,iBAAiB,GACvB,MAAM,wBAAwB,CAAA;AAC/B,cAAc,kBAAkB,CAAA"}
|
package/dist/pdf.js
ADDED
package/dist/pdf.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf.js","sourceRoot":"","sources":["../src/pdf.ts"],"names":[],"mappings":"AAAA,cAAc,mCAAmC,CAAA;AACjD,cAAc,iBAAiB,CAAA;AAC/B,OAAO,EACL,eAAe,EACf,iBAAiB,GAElB,MAAM,wBAAwB,CAAA;AAC/B,cAAc,kBAAkB,CAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export declare enum ProtectionFlags {
|
|
2
|
+
Print = 4,
|
|
3
|
+
Modify = 8,
|
|
4
|
+
CopyAndExtract = 16,
|
|
5
|
+
AnnotateAndFill = 32,
|
|
6
|
+
FillForms = 256,
|
|
7
|
+
ExtractForAccessibility = 512,
|
|
8
|
+
Assemble = 1024,
|
|
9
|
+
PrintHighResolution = 2048
|
|
10
|
+
}
|
|
11
|
+
export declare const ProtectionPresets: {
|
|
12
|
+
readonly ReadOnly: number;
|
|
13
|
+
readonly All: number;
|
|
14
|
+
};
|
|
15
|
+
type Password = string | {
|
|
16
|
+
user: string;
|
|
17
|
+
owner: string;
|
|
18
|
+
};
|
|
19
|
+
export type EncryptPDFOptions = {
|
|
20
|
+
password: Password;
|
|
21
|
+
protection?: ProtectionFlags;
|
|
22
|
+
};
|
|
23
|
+
export declare function encryptPDF(input: Buffer, options: EncryptPDFOptions): Buffer;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=encrypt-pdf.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encrypt-pdf.d.ts","sourceRoot":"","sources":["../../src/tools/encrypt-pdf.ts"],"names":[],"mappings":"AAGA,oBAAY,eAAe;IACzB,KAAK,IAAI;IACT,MAAM,IAAI;IACV,cAAc,KAAK;IACnB,eAAe,KAAK;IACpB,SAAS,MAAM;IACf,uBAAuB,MAAM;IAC7B,QAAQ,OAAO;IACf,mBAAmB,OAAO;CAC3B;AAED,eAAO,MAAM,iBAAiB;;;CAcpB,CAAA;AAEV,KAAK,QAAQ,GACT,MAAM,GACN;IACE,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAEL,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,QAAQ,CAAA;IAClB,UAAU,CAAC,EAAE,eAAe,CAAA;CAC7B,CAAA;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAmB5E"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/* eslint-disable cspell/spellchecker */
|
|
2
|
+
import muhammara from 'muhammara';
|
|
3
|
+
export var ProtectionFlags;
|
|
4
|
+
(function (ProtectionFlags) {
|
|
5
|
+
ProtectionFlags[ProtectionFlags["Print"] = 4] = "Print";
|
|
6
|
+
ProtectionFlags[ProtectionFlags["Modify"] = 8] = "Modify";
|
|
7
|
+
ProtectionFlags[ProtectionFlags["CopyAndExtract"] = 16] = "CopyAndExtract";
|
|
8
|
+
ProtectionFlags[ProtectionFlags["AnnotateAndFill"] = 32] = "AnnotateAndFill";
|
|
9
|
+
ProtectionFlags[ProtectionFlags["FillForms"] = 256] = "FillForms";
|
|
10
|
+
ProtectionFlags[ProtectionFlags["ExtractForAccessibility"] = 512] = "ExtractForAccessibility";
|
|
11
|
+
ProtectionFlags[ProtectionFlags["Assemble"] = 1024] = "Assemble";
|
|
12
|
+
ProtectionFlags[ProtectionFlags["PrintHighResolution"] = 2048] = "PrintHighResolution";
|
|
13
|
+
})(ProtectionFlags || (ProtectionFlags = {}));
|
|
14
|
+
export const ProtectionPresets = {
|
|
15
|
+
ReadOnly: ProtectionFlags.Print |
|
|
16
|
+
ProtectionFlags.PrintHighResolution |
|
|
17
|
+
ProtectionFlags.ExtractForAccessibility,
|
|
18
|
+
All: ProtectionFlags.Print |
|
|
19
|
+
ProtectionFlags.Modify |
|
|
20
|
+
ProtectionFlags.CopyAndExtract |
|
|
21
|
+
ProtectionFlags.AnnotateAndFill |
|
|
22
|
+
ProtectionFlags.FillForms |
|
|
23
|
+
ProtectionFlags.ExtractForAccessibility |
|
|
24
|
+
ProtectionFlags.Assemble |
|
|
25
|
+
ProtectionFlags.PrintHighResolution,
|
|
26
|
+
};
|
|
27
|
+
export function encryptPDF(input, options) {
|
|
28
|
+
const output = new muhammara.PDFWStreamForBuffer();
|
|
29
|
+
const pdfPassword = {};
|
|
30
|
+
if (typeof options.password === 'string')
|
|
31
|
+
pdfPassword.userPassword = options.password;
|
|
32
|
+
if (typeof options.password === 'object') {
|
|
33
|
+
pdfPassword.userPassword = options.password.user;
|
|
34
|
+
pdfPassword.ownerPassword = options.password.owner;
|
|
35
|
+
}
|
|
36
|
+
muhammara.recrypt(new muhammara.PDFRStreamForBuffer(input), output, {
|
|
37
|
+
...pdfPassword,
|
|
38
|
+
userProtectionFlag: options.protection,
|
|
39
|
+
});
|
|
40
|
+
return output.buffer;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=encrypt-pdf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encrypt-pdf.js","sourceRoot":"","sources":["../../src/tools/encrypt-pdf.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,OAAO,SAAS,MAAM,WAAW,CAAA;AAEjC,MAAM,CAAN,IAAY,eASX;AATD,WAAY,eAAe;IACzB,uDAAS,CAAA;IACT,yDAAU,CAAA;IACV,0EAAmB,CAAA;IACnB,4EAAoB,CAAA;IACpB,iEAAe,CAAA;IACf,6FAA6B,CAAA;IAC7B,gEAAe,CAAA;IACf,sFAA0B,CAAA;AAC5B,CAAC,EATW,eAAe,KAAf,eAAe,QAS1B;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,QAAQ,EACN,eAAe,CAAC,KAAK;QACrB,eAAe,CAAC,mBAAmB;QACnC,eAAe,CAAC,uBAAuB;IACzC,GAAG,EACD,eAAe,CAAC,KAAK;QACrB,eAAe,CAAC,MAAM;QACtB,eAAe,CAAC,cAAc;QAC9B,eAAe,CAAC,eAAe;QAC/B,eAAe,CAAC,SAAS;QACzB,eAAe,CAAC,uBAAuB;QACvC,eAAe,CAAC,QAAQ;QACxB,eAAe,CAAC,mBAAmB;CAC7B,CAAA;AAcV,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,OAA0B;IAClE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,mBAAmB,EAAE,CAAA;IAElD,MAAM,WAAW,GAA2B,EAAE,CAAA;IAE9C,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ;QACtC,WAAW,CAAC,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAA;IAE7C,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACzC,WAAW,CAAC,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAA;QAChD,WAAW,CAAC,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAA;IACpD,CAAC;IAED,SAAS,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE;QAClE,GAAG,WAAW;QACd,kBAAkB,EAAE,OAAO,CAAC,UAAU;KACvC,CAAC,CAAA;IAEF,OAAO,MAAM,CAAC,MAAM,CAAA;AACtB,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { Binary } from '@t4h.framework/core';
|
|
2
|
+
export type PDFStyle = {
|
|
3
|
+
[property: string]: string | number | undefined;
|
|
4
|
+
};
|
|
5
|
+
export type PageSize = string | readonly [width: number, height: number];
|
|
6
|
+
/** Props shared by every node inside a page. */
|
|
7
|
+
export type NodeProps = {
|
|
8
|
+
style?: PDFStyle | readonly PDFStyle[];
|
|
9
|
+
/** Repeat on every page (headers/footers). */
|
|
10
|
+
fixed?: boolean;
|
|
11
|
+
/** Force a page break before this node. */
|
|
12
|
+
break?: boolean;
|
|
13
|
+
/** Allow the node to split across pages. Defaults to true. */
|
|
14
|
+
wrap?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Move the node to the next page unless at least this many points of space
|
|
17
|
+
* remain below it (avoids orphaned headings).
|
|
18
|
+
*/
|
|
19
|
+
minPresenceAhead?: number;
|
|
20
|
+
};
|
|
21
|
+
export type ViewNode = {
|
|
22
|
+
type: 'view';
|
|
23
|
+
props?: NodeProps;
|
|
24
|
+
children?: readonly PDFNode[];
|
|
25
|
+
};
|
|
26
|
+
export type TextNode = {
|
|
27
|
+
type: 'text';
|
|
28
|
+
props?: NodeProps;
|
|
29
|
+
children?: string | readonly TextChild[];
|
|
30
|
+
};
|
|
31
|
+
export type LinkNode = {
|
|
32
|
+
type: 'link';
|
|
33
|
+
props: NodeProps & {
|
|
34
|
+
href: string;
|
|
35
|
+
};
|
|
36
|
+
children?: string | readonly TextChild[];
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* An image. `src` may be a URL, a `data:image/...;base64,` URI, or a
|
|
40
|
+
* {@link Binary} whose `contentType` is an image type (`image/png`,
|
|
41
|
+
* `image/jpeg`).
|
|
42
|
+
*/
|
|
43
|
+
export type ImageNode = {
|
|
44
|
+
type: 'image';
|
|
45
|
+
props: NodeProps & {
|
|
46
|
+
src: string | Binary;
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Text that resolves to the current page number at layout time. `format`
|
|
51
|
+
* may reference `{pageNumber}` and `{totalPages}`; defaults to
|
|
52
|
+
* `'{pageNumber}'`. Combine with `fixed: true` for running footers.
|
|
53
|
+
*/
|
|
54
|
+
export type PageNumberNode = {
|
|
55
|
+
type: 'page-number';
|
|
56
|
+
props?: NodeProps & {
|
|
57
|
+
format?: string;
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
export type TextChild = string | TextNode | LinkNode | PageNumberNode;
|
|
61
|
+
export type PDFNode = ViewNode | TextNode | LinkNode | ImageNode | PageNumberNode;
|
|
62
|
+
export type PageNode = {
|
|
63
|
+
type: 'page';
|
|
64
|
+
props?: {
|
|
65
|
+
size?: PageSize;
|
|
66
|
+
orientation?: 'portrait' | 'landscape';
|
|
67
|
+
style?: PDFStyle | readonly PDFStyle[];
|
|
68
|
+
wrap?: boolean;
|
|
69
|
+
dpi?: number;
|
|
70
|
+
};
|
|
71
|
+
children?: readonly PDFNode[];
|
|
72
|
+
};
|
|
73
|
+
export type DocumentNode = {
|
|
74
|
+
type: 'document';
|
|
75
|
+
props?: {
|
|
76
|
+
title?: string;
|
|
77
|
+
author?: string;
|
|
78
|
+
subject?: string;
|
|
79
|
+
creator?: string;
|
|
80
|
+
producer?: string;
|
|
81
|
+
language?: string;
|
|
82
|
+
};
|
|
83
|
+
children: readonly PageNode[];
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=pdf.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf.d.ts","sourceRoot":"","sources":["../../src/typings/pdf.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf.js","sourceRoot":"","sources":["../../src/typings/pdf.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@t4h.framework/pdf",
|
|
3
|
+
"version": "0.0.0-experimental-20260907052843",
|
|
4
|
+
"description": "Declarative PDF rendering module for the T4H Framework",
|
|
5
|
+
"homepage": "https://github.com/tech4humans-brasil/framework/tree/main/packages/pdf",
|
|
6
|
+
"bugs": "https://github.com/tech4humans-brasil/framework/issues",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/tech4humans-brasil/framework.git",
|
|
10
|
+
"directory": "packages/pdf"
|
|
11
|
+
},
|
|
12
|
+
"license": "MIT",
|
|
13
|
+
"author": "Tech4Humans <contact@tech4h.com.br> (https://tech4h.com.br)",
|
|
14
|
+
"type": "module",
|
|
15
|
+
"exports": {
|
|
16
|
+
"types": "./dist/pdf.d.ts",
|
|
17
|
+
"import": "./dist/pdf.js"
|
|
18
|
+
},
|
|
19
|
+
"module": "./dist/pdf.js",
|
|
20
|
+
"types": "./dist/pdf.d.ts",
|
|
21
|
+
"files": [
|
|
22
|
+
"dist",
|
|
23
|
+
"LICENSE",
|
|
24
|
+
".ai"
|
|
25
|
+
],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsc --project tsconfig.build.json",
|
|
28
|
+
"check-types": "tsc --noEmit",
|
|
29
|
+
"lint": "eslint .",
|
|
30
|
+
"prepublishOnly": "yarn build",
|
|
31
|
+
"test": "vitest run",
|
|
32
|
+
"test:watch": "vitest"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@t4h.framework/core": "^0.0.0-experimental-20260907052843",
|
|
36
|
+
"@t4h.framework/fs": "^0.0.0-experimental-20260907052843",
|
|
37
|
+
"@types/react": "^19.2.17",
|
|
38
|
+
"typescript": "^5.9.3",
|
|
39
|
+
"vitest": "^4.0.18"
|
|
40
|
+
},
|
|
41
|
+
"peerDependencies": {
|
|
42
|
+
"@t4h.framework/core": "^0.0.0-experimental-20260907052843",
|
|
43
|
+
"@t4h.framework/fs": "^0.0.0-experimental-20260907052843"
|
|
44
|
+
},
|
|
45
|
+
"packageManager": "yarn@4.12.0",
|
|
46
|
+
"engines": {
|
|
47
|
+
"node": ">=22"
|
|
48
|
+
},
|
|
49
|
+
"dependencies": {
|
|
50
|
+
"@react-pdf/renderer": "^4.5.1",
|
|
51
|
+
"muhammara": "^6.0.5",
|
|
52
|
+
"react": "^19.2.8"
|
|
53
|
+
}
|
|
54
|
+
}
|