@reportwright/svelte 0.13.1 → 0.13.2-rc.1

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 CHANGED
@@ -2,6 +2,44 @@
2
2
 
3
3
  All `@reportwright/*` packages (formerly `@pagewrightjs/*`) share one version. The versioning policy is in [CONTRIBUTING.md](CONTRIBUTING.md#versioning-semver).
4
4
 
5
+ ## 0.13.2-rc.1 — 2026-10-09 (release candidate)
6
+
7
+ ### Changed
8
+ - **The rename to ReportWright is finished; every old Pagewright name keeps working until 1.0.** New names, with the old one kept as a deprecated alias:
9
+ - report schema: `reportwright/report@1` is now what new and saved reports carry; `pagewright/report@1` is read as the same format (a server before 0.9 cannot open a report saved by 0.13.2).
10
+ - HTTP headers: `x-reportwright-pages`, `-ms`, `-warnings`, `-snapshot`, `-pending`, `-signature` (webhooks and the audit SIEM webhook) and `-idempotency-key` (mail) are sent together with the old `x-pagewright-*` header; the proxy secret is read from `x-reportwright-proxy-secret`, else `x-pagewright-proxy-secret`.
11
+ - Prometheus metrics: `/api/v1/metrics` emits every family as `reportwright_*` and again as `pagewright_*` (the old ones go in 1.0: move dashboards and alerts). `scripts/uptime-check.mjs` reads either.
12
+ - one console warning per page for `definePagewrightElements`, the `<pagewright-viewer>` / `<pagewright-designer>` tags, the Svelte `pagewrightViewer` / `pagewrightDesigner` actions, `window.Pagewright` and `/embed/pagewright-viewer.js` (and `-viewer.full.js`). The React and Vue `PagewrightViewer` / `PagewrightDesigner` stay the same components, without a warning; all are typed `@deprecated`.
13
+ - the live demo moved to https://mrarun005.github.io/reportwright-demo/ (the site build's default base is `/reportwright-demo/`).
14
+ - kept as they are, since changing them would break stored data: the `.pw.json` extension, the designer clipboard format `pagewright/items@1`, and the salts of the TOTP secret key and the audit checkpoint chain.
15
+ - **The render worker is minified.** `engine.worker.js` (and `engine.worker.bwip.js`) in `@reportwright/viewer` and the embed builds are minified, still one file with no chunk imports, with a linked source map (`engine.worker.js.map`) beside it so worker stack traces stay readable. `engine.worker.js` 2,195,290 → 1,218,659 bytes (608 → 503 KB gzipped); `engine.worker.bwip.js` 1,651,602 → 973,261 bytes (315 → 267 KB gzipped). The size budget in tests/engine/b10-bundle-size.test.js is now 504 KB gzipped (was 600).
16
+ - **Publishing verifies before `latest` moves.** The publish workflow publishes to the `next` dist-tag, installs all nine packages from the registry and smoke-tests them (imports, PDF/XLSX/DOCX export, `qpdf --check`, `pw render`, the viewer's files, the wrappers' peer), and only then moves `latest`.
17
+
18
+ ### Performance
19
+ - **Trade-off made by 0.13.1: less memory, about 10–14% slower.** The 0.13.1 fixes for grouped sorts (N44: sort runs spill to disk in smaller runs, about 8 MB) and for streamed tagged PDFs (N44: tagged structure flushed per page) cost time for the memory they save: about 10–14% slower on the tester's 2 vCPU machine (not measured here). Memory: a 200,000-row grouped ledger peaks at 232 MB instead of 280 MB, and the same with 50 runs (1,000,000 rows' run count) 240 MB instead of 296 MB; a tagged streamed PDF at 50k/100k/200k rows holds 6.7/7.3/9.3 MB off-heap instead of 16.8/29.1/36.6 MB. `spillSorter({ runMB, mergeMB })` sets the sort's run size if speed matters more than memory.
20
+ ### Added
21
+ - **`pw import <folder>`: bulk import.** Every `.rdl`, `.rdlc`, `.jrxml`, `.rptdesign` and `.rdlx-json` report in a folder (`--recursive` for subfolders) is imported into `-o <outDir>`, which mirrors the folder.
22
+ - One bad file never stops the batch. Exit 0 means all were imported, 2 some failed, 1 none.
23
+ - Subreports, SSRS shared data sources (`.rds`), JasperReports style templates (`.jrtx`) and images are resolved across the batch. Images are copied once per content. Unresolved references are listed per file.
24
+ - `import-report.json` and a standalone, escaped `import-report.html` give for each file the mapped, approximated and dropped counts, each item's reason, and every expression that was not translated with its line and column.
25
+ - `.pw-import.json` holds the hash of each written file, and a re-run skips an output the user edited unless `--force`.
26
+ - `--verify` renders each report with its embedded or sample data and compares it with the output it replaced.
27
+ - Paths from the folder are untrusted. Links that point outside it are refused, outputs stay in `outDir`, and `--max-files` and `--max-bytes` cap the input.
28
+ - The importers now return structured `items` (each item's notes, untranslated expressions and source position) and take a `resolve` option for shared data sources and style templates.
29
+ - Docs: the CLI README, "Bulk import". Test: tests/engine/c132-import-batch.test.js.
30
+ - **`pw --version` / `pw -v`** prints the CLI version (from its package.json) and the version of the engine it carries.
31
+ - **`showWarnings`** (viewer option, default `false`): shows the render's warnings under the pages; the designer's Preview always shows them. Documented in the viewer README and typed in `ViewerOptions`.
32
+ - **ⓘ help tooltips in the designer.** Long help paragraphs (the Outline, Layers and Parts panels, field hints over 90 characters) sit behind an ⓘ button that opens on hover, keyboard focus or click and closes with Esc; the button is described by the text (`aria-describedby`).
33
+ ### Fixed
34
+ - **An unchecked check box has no tick on the designer canvas.** The canvas drew ✓ in every check box; it now follows the value as the renderer does (`false`, `=False`, a missing value: empty), and dims the tick of a value only the data decides.
35
+ - **Selecting an item no longer moves the canvas.** The canvas toolbar grew a second row (24 px) when the align buttons of a selection appeared; it now has one fixed height (it scrolls sideways when narrow) and its hint moved to the status bar.
36
+ - **Keyboard nudge steps.** Arrow moves the selection 1 pt, or one grid step with Snap to grid on (a cell in cell mode); Shift+Arrow moves ten of them (it was 4 grid steps); positions stay rounded to 2 decimals.
37
+ - **Render warnings in the viewer read as words.** The count says "8 warnings" or "1 warning", not "warning(s)".
38
+ - **The Data panel lists a data set's fields when it declares none.** It said "No fields" next to 300 rows; it now detects them from inline JSON or the first rows of fetched data with the engine's own detection (`detectFields`, the one streaming uses) and marks them as detected.
39
+ - **No cut-off text in the Inspector and the Outline.** The Regional "Division by zero" choice gets the full width ("Infinity (as SSRS)" was cut); a long name in the Outline wraps inside the panel, with the full name as its tooltip, and the item type and buttons move under it together.
40
+ - **The parameter dialog's help matches the viewer.** The live-parameters option no longer says that turning it off adds a View report button (the button is always there), and the panel-columns help says the grid applies on a wide screen.
41
+ - **Export options icon.** The sun-like gear is a sliders icon; the button keeps its name, Export options.
42
+
5
43
  ## 0.13.1 — 2026-10-09
6
44
 
7
45
  ### Fixed
package/README.md CHANGED
@@ -1,18 +1,82 @@
1
1
  # @reportwright/svelte
2
2
 
3
+ Svelte actions that mount the ReportWright report viewer and drag-and-drop designer on any element.
4
+
3
5
  [![npm](https://img.shields.io/npm/v/%40reportwright%2Fsvelte)](https://www.npmjs.com/package/@reportwright/svelte) [![license](https://img.shields.io/badge/license-MIT-blue)](https://github.com/MrArun005/reportwright/blob/main/LICENSE) [![Socket](https://socket.dev/api/badge/npm/package/@reportwright/svelte)](https://socket.dev/npm/package/@reportwright/svelte)
4
6
 
5
- Svelte actions for the ReportWright viewer and designer. Plain JavaScript, so no compiler step and any Svelte version.
7
+ **Live demo:** [mrarun005.github.io/reportwright-demo](https://mrarun005.github.io/reportwright-demo) ([Embed it](https://mrarun005.github.io/reportwright-demo/#embed) shows the wrapper code; the [designer playground](https://mrarun005.github.io/reportwright-demo/play.html) is the designer this package mounts).
8
+
9
+ Plain JavaScript, so no compiler step and any Svelte version.
10
+
11
+ ## Install
12
+
13
+ ```bash
14
+ npm i @reportwright/svelte @reportwright/viewer @reportwright/fonts
15
+ cp -r node_modules/@reportwright/fonts/public public/pw # serve the fonts as static files
16
+ ```
17
+
18
+ Vite 7: set `worker: { format: 'es' }` in `vite.config.js` (see [`@reportwright/viewer`'s bundler setup](https://github.com/MrArun005/reportwright/tree/main/packages/viewer#bundler-setup-read-this-first)).
19
+
20
+ ## Quick start (30 seconds)
21
+
22
+ ```svelte
23
+ <script>
24
+ import { reportWrightViewer } from '@reportwright/svelte';
25
+ import definition from './orders.pw.json'; // the report from @reportwright/engine's README examples
26
+ const orders = { rows: [{ customer: 'Asha Rao', amount: 1200.5 }, { customer: 'Ben Ode', amount: 80 }] };
27
+ </script>
28
+ <div style="height: 720px" use:reportWrightViewer={{ definition, data: { orders }, fontsUrl: '/pw/fonts/' }}></div>
29
+ ```
30
+
31
+ The action was verified against this version with Vite 7 in Chromium (called directly, as Svelte calls it).
32
+
33
+ ## Examples
34
+
35
+ **Get the handle, re-run with parameters, export:**
6
36
 
7
37
  ```svelte
8
38
  <script>
9
- import { reportWrightViewer, reportWrightDesigner } from '@reportwright/svelte';
39
+ let viewer;
40
+ const excel = async () => open(URL.createObjectURL(await viewer.export('xlsx')));
10
41
  </script>
11
- <div use:reportWrightViewer={{ definition, data: { orders }, fontsUrl: '/pw/fonts/' }}></div> <!-- no server -->
42
+ <button on:click={() => viewer.setParameters({ minAmount: 100 })}>Over 100</button>
43
+ <button on:click={excel}>Excel</button>
44
+ <div use:reportWrightViewer={{ definition, data: { orders }, fontsUrl: '/pw/fonts/', onReady: (h) => (viewer = h), onError: console.error }}></div>
45
+ ```
46
+
47
+ **Edit a report and save it to your own API:**
48
+
49
+ ```svelte
50
+ <div use:reportWrightDesigner={{ definition, fontsUrl: '/pw/fonts/', onSave: (def) => fetch('/api/reports/orders', { method: 'PUT', body: JSON.stringify(def) }) }}></div>
51
+ ```
52
+
53
+ **With a self-hosted ReportWright server:**
54
+
55
+ ```svelte
12
56
  <div use:reportWrightViewer={{ server: 'https://reports.example.com', report: 'invoice', params: { id } }}></div>
13
57
  <div use:reportWrightDesigner={{ server, definition, onSave: save }}></div>
14
58
  ```
15
59
 
16
- Options are those of `mountViewer` / `mountDesigner` (see `@reportwright/viewer`). MIT.
60
+ A runnable app is in the repository's [`examples/svelte`](https://github.com/MrArun005/reportwright/tree/main/examples/svelte).
61
+
62
+ ## Options
63
+
64
+ | | Meaning |
65
+ |---|---|
66
+ | everything of `mountViewer` / `mountDesigner` | full table in [`@reportwright/viewer`](https://github.com/MrArun005/reportwright/tree/main/packages/viewer#options-reference) |
67
+ | `onReady(handle)` | the `ViewerHandle` / `DesignerHandle` |
68
+ | `onError(error)` | the viewer's code did not load (the element shows the message) |
69
+
70
+ When the options change, the viewer remounts only if what it shows changed (compared by content, callbacks ignored); the designer only for another `server`, `report`, `readOnly` or `definition` content, so it keeps its edits. `destroy` unmounts.
71
+
72
+ ## Support
73
+
74
+ Any Svelte version (peer `svelte >= 3`). Browsers and limits are the viewer's: see [`@reportwright/viewer`](https://github.com/MrArun005/reportwright/tree/main/packages/viewer#browser-support-and-limits).
17
75
 
18
76
  No server needed: pass `definition`, `data` (JSON by data source name) and `fontsUrl` (a copy of `@reportwright/fonts/public/fonts`). `server` (the [self-hosted ReportWright server](https://github.com/MrArun005/reportwright#docker)) is optional: see [what works standalone](https://github.com/MrArun005/reportwright/tree/main/packages/viewer#what-works-standalone-what-needs-the-server).
77
+
78
+ ## Related packages
79
+
80
+ [`@reportwright/viewer`](https://github.com/MrArun005/reportwright/tree/main/packages/viewer) (what this wraps), [`@reportwright/engine`](https://github.com/MrArun005/reportwright/tree/main/packages/engine), [`@reportwright/fonts`](https://github.com/MrArun005/reportwright/tree/main/packages/fonts), and the [`react`](https://github.com/MrArun005/reportwright/tree/main/packages/react), [`vue`](https://github.com/MrArun005/reportwright/tree/main/packages/vue) and [`angular`](https://github.com/MrArun005/reportwright/tree/main/packages/angular) wrappers.
81
+
82
+ MIT.
package/dist/index.js CHANGED
@@ -43,5 +43,10 @@ export const reportWrightViewer = action(() => import('@reportwright/viewer').th
43
43
  // the designer keeps its edits: it remounts only for another report or definition (by content)
44
44
  export const reportWrightDesigner = action(() => import('@reportwright/viewer/designer').then(m => m.mountDesigner), (a, b) => designerKey(a) === designerKey(b));
45
45
 
46
- /** @deprecated 0.9: renamed reportWrightViewer / reportWrightDesigner; the old names go in 1.0. */
47
- export { reportWrightViewer as pagewrightViewer, reportWrightDesigner as pagewrightDesigner };
46
+ const warned = new Set();
47
+ /** One console warning per deprecated name per page. */
48
+ const deprecated = (old, now) => { if (!warned.has(old)) { warned.add(old); console.warn(`ReportWright: ${old} is deprecated, use ${now} (the old name goes in 1.0).`); } };
49
+ /** @deprecated 0.9: renamed reportWrightViewer; the old name goes in 1.0. */
50
+ export const pagewrightViewer = (node, options) => { deprecated('pagewrightViewer', 'reportWrightViewer'); return reportWrightViewer(node, options); };
51
+ /** @deprecated 0.9: renamed reportWrightDesigner; the old name goes in 1.0. */
52
+ export const pagewrightDesigner = (node, options) => { deprecated('pagewrightDesigner', 'reportWrightDesigner'); return reportWrightDesigner(node, options); };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reportwright/svelte",
3
- "version": "0.13.1",
3
+ "version": "0.13.2-rc.1",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -46,7 +46,7 @@
46
46
  "sideEffects": false,
47
47
  "peerDependencies": {
48
48
  "svelte": ">=3",
49
- "@reportwright/viewer": "0.13.1"
49
+ "@reportwright/viewer": "0.13.2-rc.1"
50
50
  },
51
51
  "peerDependenciesMeta": {
52
52
  "svelte": {