@formepdf/renderer 0.7.0 → 0.7.2

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/bundle.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export declare const BUNDLE_DIR: string;
2
2
  export declare function bundleFile(filePath: string): Promise<string>;
3
+ export declare function bundleSource(source: string, resolveDir: string, sourcefile?: string): Promise<string>;
package/dist/bundle.js CHANGED
@@ -59,24 +59,55 @@ export async function bundleFile(filePath) {
59
59
  return result.outputFiles[0].text;
60
60
  }
61
61
  catch (err) {
62
- if (isBuildFailure(err)) {
63
- const messages = [];
64
- for (const error of err.errors) {
65
- let loc = '';
66
- if (error.location) {
67
- const { file, line, column, lineText } = error.location;
68
- loc = ` ${file}:${line}:${column}\n`;
69
- if (lineText) {
70
- loc += ` ${lineText}\n`;
71
- loc += ` ${' '.repeat(column)}^\n`;
72
- }
62
+ throw formatBuildError(err);
63
+ }
64
+ }
65
+ /// Bundle TSX/JSX source code (string) into an ESM string.
66
+ /// `resolveDir` controls where imports are resolved from (typically the file's directory).
67
+ export async function bundleSource(source, resolveDir, sourcefile) {
68
+ try {
69
+ const result = await build({
70
+ stdin: {
71
+ contents: source,
72
+ resolveDir,
73
+ sourcefile: sourcefile ?? 'input.tsx',
74
+ loader: 'tsx',
75
+ },
76
+ bundle: true,
77
+ format: 'esm',
78
+ platform: 'node',
79
+ write: false,
80
+ jsx: 'automatic',
81
+ jsxDev: true,
82
+ target: 'node20',
83
+ external: ['react', '@formepdf/react', '@formepdf/core'],
84
+ plugins: [formeJsxSourcePlugin],
85
+ absWorkingDir: resolveDir,
86
+ });
87
+ return result.outputFiles[0].text;
88
+ }
89
+ catch (err) {
90
+ throw formatBuildError(err);
91
+ }
92
+ }
93
+ function formatBuildError(err) {
94
+ if (isBuildFailure(err)) {
95
+ const messages = [];
96
+ for (const error of err.errors) {
97
+ let loc = '';
98
+ if (error.location) {
99
+ const { file, line, column, lineText } = error.location;
100
+ loc = ` ${file}:${line}:${column}\n`;
101
+ if (lineText) {
102
+ loc += ` ${lineText}\n`;
103
+ loc += ` ${' '.repeat(column)}^\n`;
73
104
  }
74
- messages.push(`${error.text}\n${loc}`);
75
105
  }
76
- throw new Error(`Build error:\n${messages.join('\n')}`);
106
+ messages.push(`${error.text}\n${loc}`);
77
107
  }
78
- throw err;
108
+ return new Error(`Build error:\n${messages.join('\n')}`);
79
109
  }
110
+ return err instanceof Error ? err : new Error(String(err));
80
111
  }
81
112
  function isBuildFailure(err) {
82
113
  return (err !== null &&
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { renderFromFile, renderFromCode, renderFromElement, type RenderOptions, type RenderResult, } from './render.js';
1
+ export { renderFromFile, renderFromSource, renderFromCode, renderFromElement, type RenderOptions, type RenderResult, } from './render.js';
2
2
  export { resolveElement, type ResolveElementOptions, } from './element.js';
3
- export { bundleFile, } from './bundle.js';
3
+ export { bundleFile, bundleSource, } from './bundle.js';
4
4
  export { resolveFontSources, resolveImageSources, resolveAllSources, uint8ArrayToBase64, } from './resolve.js';
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export { renderFromFile, renderFromCode, renderFromElement, } from './render.js';
1
+ export { renderFromFile, renderFromSource, renderFromCode, renderFromElement, } from './render.js';
2
2
  export { resolveElement, } from './element.js';
3
- export { bundleFile, } from './bundle.js';
3
+ export { bundleFile, bundleSource, } from './bundle.js';
4
4
  export { resolveFontSources, resolveImageSources, resolveAllSources, uint8ArrayToBase64, } from './resolve.js';
@@ -4,6 +4,7 @@
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Forme Preview</title>
7
+ <link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M12 4C9.79 4 8 5.79 8 8L8 56C8 58.21 9.79 60 12 60L52 60C54.21 60 56 58.21 56 56L56 8C56 5.79 54.21 4 52 4L12 4ZM18 16L46 16L46 20L18 20ZM18 26L38 26L38 30L18 30ZM18 36L22 36L22 52L18 52Z' fill='%23111827'/%3E%3C/svg%3E">
7
8
  <style>
8
9
  :root {
9
10
  --bg: #0a0a0b;
package/dist/render.d.ts CHANGED
@@ -14,5 +14,8 @@ export interface RenderResult {
14
14
  renderTimeMs: number;
15
15
  }
16
16
  export declare function renderFromFile(filePath: string, options?: RenderOptions): Promise<RenderResult>;
17
+ export declare function renderFromSource(source: string, resolveDir: string, options?: RenderOptions & {
18
+ sourcefile?: string;
19
+ }): Promise<RenderResult>;
17
20
  export declare function renderFromCode(code: string, options?: RenderOptions): Promise<RenderResult>;
18
21
  export declare function renderFromElement(element: ReactElement, options?: Pick<RenderOptions, 'pageSize'>): Promise<RenderResult>;
package/dist/render.js CHANGED
@@ -3,7 +3,7 @@ import { resolve, dirname, join } from 'node:path';
3
3
  import { pathToFileURL } from 'node:url';
4
4
  import { renderPdfWithLayout } from '@formepdf/core';
5
5
  import { serialize as defaultSerialize } from '@formepdf/react';
6
- import { bundleFile } from './bundle.js';
6
+ import { bundleFile, bundleSource } from './bundle.js';
7
7
  import { resolveElement } from './element.js';
8
8
  import { resolveAllSources } from './resolve.js';
9
9
  /// Full pipeline: bundle TSX file → resolve element → serialize → resolve assets → WASM render.
@@ -15,6 +15,15 @@ export async function renderFromFile(filePath, options) {
15
15
  _basePath: dirname(absolutePath),
16
16
  });
17
17
  }
18
+ /// Full pipeline from source code string (e.g. an unsaved editor buffer).
19
+ /// `resolveDir` controls import resolution (typically the file's directory).
20
+ export async function renderFromSource(source, resolveDir, options) {
21
+ const code = await bundleSource(source, resolveDir, options?.sourcefile);
22
+ return renderFromCode(code, {
23
+ ...options,
24
+ _basePath: resolveDir,
25
+ });
26
+ }
18
27
  /// Render from pre-bundled ESM code string.
19
28
  /// Handles the temp-file-and-import dance, then serializes and renders.
20
29
  export async function renderFromCode(code, options) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@formepdf/renderer",
3
- "version": "0.7.0",
3
+ "version": "0.7.2",
4
4
  "description": "File-to-PDF rendering pipeline for Forme — bundles TSX, resolves assets, renders via WASM",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",